-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathexport-options-plist-service.ts
105 lines (94 loc) · 3.8 KB
/
export-options-plist-service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import * as path from "path";
import * as temp from "temp";
import * as mobileProvisionFinder from "ios-mobileprovision-finder";
export class ExportOptionsPlistService implements IExportOptionsPlistService {
constructor(private $fs: IFileSystem) { }
public createDevelopmentExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput {
const exportOptionsMethod = this.getExportOptionsMethod(projectData, archivePath);
const provision = buildConfig.provision || buildConfig.mobileProvisionIdentifier;
const iCloudContainerEnvironment = buildConfig.iCloudContainerEnvironment;
let plistTemplate = `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>${exportOptionsMethod}</string>`;
if (provision) {
plistTemplate += ` <key>provisioningProfiles</key>
<dict>
<key>${projectData.projectIdentifiers.ios}</key>
<string>${provision}</string>
</dict>`;
}
plistTemplate += `
<key>uploadBitcode</key>
<false/>
<key>compileBitcode</key>
<false/>`;
if (iCloudContainerEnvironment) {
plistTemplate += `
<key>iCloudContainerEnvironment</key>
<string>${iCloudContainerEnvironment}</string>`;
}
plistTemplate += `
</dict>
</plist>`;
// Save the options...
temp.track();
const exportOptionsPlistFilePath = temp.path({ prefix: "export-", suffix: ".plist" });
this.$fs.writeFile(exportOptionsPlistFilePath, plistTemplate);
// The xcodebuild exportPath expects directory and writes the <project-name>.ipa at that directory.
const exportFileDir = path.resolve(path.dirname(archivePath));
const exportFilePath = path.join(exportFileDir, projectData.projectName + ".ipa");
return { exportFileDir, exportFilePath, exportOptionsPlistFilePath };
}
public createDistributionExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput {
const provision = buildConfig.provision || buildConfig.mobileProvisionIdentifier;
const teamId = buildConfig.teamId;
let plistTemplate = `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
`;
if (teamId) {
plistTemplate += ` <key>teamID</key>
<string>${teamId}</string>
`;
}
if (provision) {
plistTemplate += ` <key>provisioningProfiles</key>
<dict>
<key>${projectData.projectIdentifiers.ios}</key>
<string>${provision}</string>
</dict>`;
}
plistTemplate += ` <key>method</key>
<string>app-store</string>
<key>uploadBitcode</key>
<false/>
<key>compileBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
</dict>
</plist>`;
// Save the options...
temp.track();
const exportOptionsPlistFilePath = temp.path({ prefix: "export-", suffix: ".plist" });
this.$fs.writeFile(exportOptionsPlistFilePath, plistTemplate);
const exportFileDir = path.resolve(path.dirname(archivePath));
const exportFilePath = path.join(exportFileDir, projectData.projectName + ".ipa");
return { exportFileDir, exportFilePath, exportOptionsPlistFilePath };
}
private getExportOptionsMethod(projectData: IProjectData, archivePath: string): string {
const embeddedMobileProvisionPath = path.join(archivePath, 'Products', 'Applications', `${projectData.projectName}.app`, "embedded.mobileprovision");
const provision = mobileProvisionFinder.provision.readFromFile(embeddedMobileProvisionPath);
return {
"Development": "development",
"AdHoc": "ad-hoc",
"Distribution": "app-store",
"Enterprise": "enterprise"
}[provision.Type];
}
}
$injector.register("exportOptionsPlistService", ExportOptionsPlistService);