Skip to content

Commit 119f663

Browse files
authored
Merge pull request #5013 from NativeScript/kddimitrov/fix-bundle-identifier-warning
fix: bundle indentifier warning in Xcode11
2 parents aa8dc95 + f8f21ca commit 119f663

7 files changed

+71
-51
lines changed

lib/bootstrap.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ $injector.require("gradleCommandService", "./services/android/gradle-command-ser
1515
$injector.require("gradleBuildService", "./services/android/gradle-build-service");
1616
$injector.require("gradleBuildArgsService", "./services/android/gradle-build-args-service");
1717
$injector.require("iOSEntitlementsService", "./services/ios-entitlements-service");
18+
$injector.require("iOSNativeTargetService", "./services/ios-native-target-service");
1819
$injector.require("iOSExtensionsService", "./services/ios-extensions-service");
1920
$injector.require("iOSWatchAppService", "./services/ios-watch-app-service");
2021
$injector.require("iOSProjectService", "./services/ios-project-service");

lib/definitions/project.d.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -458,12 +458,26 @@ interface ICocoaPodsPlatformManager {
458458
replacePlatformRow(podfileContent: string, podfilePath: string): { replacedContent: string, podfilePlatformData: IPodfilePlatformData };
459459
}
460460

461+
declare const enum BuildNames {
462+
debug = "Debug",
463+
release = "Release"
464+
}
465+
466+
interface IXcodeTargetBuildConfigurationProperty {
467+
name: string;
468+
value: any;
469+
buildNames?: BuildNames[];
470+
}
471+
461472
/**
462473
* Describes a service used to add and remove iOS extension
463474
*/
464-
interface IIOSExtensionsService {
465-
addExtensionsFromPath(options: IAddExtensionsFromPathOptions): Promise<boolean>;
466-
removeExtensions(options: IRemoveExtensionsOptions): void;
475+
interface IIOSNativeTargetService {
476+
addTargetToProject(targetRootPath: string, targetFolder: string, targetType: string, project: IXcode.project, platformData: IPlatformData, parentTarget?: string): IXcode.target;
477+
prepareSigning(targetUuids: string[], projectData:IProjectData, projectPath: string): void;
478+
getTargetDirectories(folderPath: string): string[];
479+
setXcodeTargetBuildConfigurationProperties(properties: IXcodeTargetBuildConfigurationProperty[], targetName: string, project: IXcode.project): void
480+
setConfigurationsFromJsonFile(jsonPath: string, targetUuid: string, targetName: string, project: IXcode.project): void
467481
}
468482

469483
/**

lib/services/ios-extensions-service.ts

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import * as path from "path";
2-
import { NativeTargetServiceBase } from "./ios-native-target-service-base";
32
import { IOSNativeTargetProductTypes, IOSNativeTargetTypes } from "../constants";
43

5-
export class IOSExtensionsService extends NativeTargetServiceBase implements IIOSExtensionsService {
4+
export class IOSExtensionsService implements IIOSExtensionsService {
65
constructor(protected $fs: IFileSystem,
76
protected $pbxprojDomXcode: IPbxprojDomXcode,
8-
protected $xcode: IXcode) {
9-
super($fs, $pbxprojDomXcode, $xcode);
7+
protected $xcode: IXcode,
8+
private $iOSNativeTargetService: IIOSNativeTargetService) {
109
}
1110

1211
public async addExtensionsFromPath({extensionsFolderPath, projectData, platformData, pbxProjPath}: IAddExtensionsFromPathOptions): Promise<boolean> {
@@ -17,29 +16,29 @@ export class IOSExtensionsService extends NativeTargetServiceBase implements IIO
1716
}
1817
const project = new this.$xcode.project(pbxProjPath);
1918
project.parseSync();
20-
this.getTargetDirectories(extensionsFolderPath)
19+
this.$iOSNativeTargetService.getTargetDirectories(extensionsFolderPath)
2120
.forEach(extensionFolder => {
22-
const target = this.addTargetToProject(extensionsFolderPath, extensionFolder, IOSNativeTargetTypes.appExtension, project, platformData);
21+
const target = this.$iOSNativeTargetService.addTargetToProject(extensionsFolderPath, extensionFolder, IOSNativeTargetTypes.appExtension, project, platformData);
2322
this.configureTarget(extensionFolder, path.join(extensionsFolderPath, extensionFolder), target, project, projectData);
2423
targetUuids.push(target.uuid);
2524
addedExtensions = true;
2625
});
2726

2827
this.$fs.writeFile(pbxProjPath, project.writeSync({omitEmptyValues: true}));
29-
this.prepareSigning(targetUuids, projectData, pbxProjPath);
28+
this.$iOSNativeTargetService.prepareSigning(targetUuids, projectData, pbxProjPath);
3029

3130
return addedExtensions;
3231
}
3332

3433
private configureTarget(extensionName: string, extensionPath: string, target: IXcode.target, project: IXcode.project, projectData: IProjectData) {
3534
const extJsonPath = path.join(extensionPath, "extension.json");
3635

37-
this.setXcodeTargetBuildConfigurationProperties(
36+
this.$iOSNativeTargetService.setXcodeTargetBuildConfigurationProperties(
3837
[{name: "PRODUCT_BUNDLE_IDENTIFIER", value: `${projectData.projectIdentifiers.ios}.${extensionName}`}],
3938
extensionName,
4039
project);
4140

42-
this.setConfigurationsFromJsonFile(extJsonPath, target.uuid, extensionName, project);
41+
this.$iOSNativeTargetService.setConfigurationsFromJsonFile(extJsonPath, target.uuid, extensionName, project);
4342
}
4443

4544
public removeExtensions({pbxProjPath}: IRemoveExtensionsOptions): void {

lib/services/ios-native-target-service-base.ts renamed to lib/services/ios-native-target-service.ts

+16-26
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,27 @@
11
import * as path from "path";
22

3-
export enum BuildNames {
4-
debug = "Debug",
5-
release = "Release"
6-
}
7-
8-
export interface IXcodeTargetBuildConfigurationProperty {
9-
name: string;
10-
value: any;
11-
buildNames?: BuildNames[];
12-
}
13-
14-
export abstract class NativeTargetServiceBase {
3+
export class IOSNativeTargetService implements IIOSNativeTargetService {
154
constructor(protected $fs: IFileSystem,
16-
protected $pbxprojDomXcode: IPbxprojDomXcode,
17-
protected $xcode: IXcode) {
5+
protected $pbxprojDomXcode: IPbxprojDomXcode) {
186
}
197

20-
protected addTargetToProject(extensionsFolderPath: string, extensionFolder: string, targetType: string, project: IXcode.project, platformData: IPlatformData, parentTarget?: string): IXcode.target {
21-
const extensionPath = path.join(extensionsFolderPath, extensionFolder);
22-
const extensionRelativePath = path.relative(platformData.projectRoot, extensionPath);
23-
const files = this.$fs.readDirectory(extensionPath)
8+
public addTargetToProject(targetRootPath: string, targetFolder: string, targetType: string, project: IXcode.project, platformData: IPlatformData, parentTarget?: string): IXcode.target {
9+
const targetPath = path.join(targetRootPath, targetFolder);
10+
const targetRelativePath = path.relative(platformData.projectRoot, targetPath);
11+
const files = this.$fs.readDirectory(targetPath)
2412
.filter(filePath => !filePath.startsWith("."))
25-
.map(filePath => path.join(extensionPath, filePath));
26-
const target = project.addTarget(extensionFolder, targetType, extensionRelativePath, parentTarget);
13+
.map(filePath => path.join(targetPath, filePath));
14+
const target = project.addTarget(targetFolder, targetType, targetRelativePath, parentTarget);
2715
project.addBuildPhase([], 'PBXSourcesBuildPhase', 'Sources', target.uuid);
2816
project.addBuildPhase([], 'PBXResourcesBuildPhase', 'Resources', target.uuid);
2917
project.addBuildPhase([], 'PBXFrameworksBuildPhase', 'Frameworks', target.uuid);
3018

31-
project.addPbxGroup(files, extensionFolder, extensionPath, null, { isMain: true, target: target.uuid, filesRelativeToProject: true });
32-
project.addToHeaderSearchPaths(extensionPath, target.pbxNativeTarget.productName);
19+
project.addPbxGroup(files, targetFolder, targetPath, null, { isMain: true, target: target.uuid, filesRelativeToProject: true });
20+
project.addToHeaderSearchPaths(targetPath, target.pbxNativeTarget.productName);
3321
return target;
3422
}
3523

36-
protected prepareSigning(targetUuids: string[], projectData:IProjectData, projectPath: string) {
24+
public prepareSigning(targetUuids: string[], projectData: IProjectData, projectPath: string): void {
3725
const xcode = this.$pbxprojDomXcode.Xcode.open(projectPath);
3826
const signing = xcode.getSigning(projectData.projectName);
3927
if (signing !== undefined) {
@@ -52,7 +40,7 @@ export abstract class NativeTargetServiceBase {
5240
xcode.save();
5341
}
5442

55-
protected getTargetDirectories(folderPath: string): string[] {
43+
public getTargetDirectories(folderPath: string): string[] {
5644
return this.$fs.readDirectory(folderPath)
5745
.filter(fileName => {
5846
const filePath = path.join(folderPath, fileName);
@@ -62,7 +50,7 @@ export abstract class NativeTargetServiceBase {
6250
});
6351
}
6452

65-
protected setXcodeTargetBuildConfigurationProperties(properties: IXcodeTargetBuildConfigurationProperty[], targetName: string, project: IXcode.project): void {
53+
public setXcodeTargetBuildConfigurationProperties(properties: IXcodeTargetBuildConfigurationProperty[], targetName: string, project: IXcode.project): void {
6654
properties.forEach(property => {
6755
const buildNames = property.buildNames || [BuildNames.debug, BuildNames.release];
6856
buildNames.forEach((buildName) => {
@@ -71,7 +59,7 @@ export abstract class NativeTargetServiceBase {
7159
});
7260
}
7361

74-
protected setConfigurationsFromJsonFile(jsonPath: string, targetUuid: string, targetName: string, project: IXcode.project) {
62+
public setConfigurationsFromJsonFile(jsonPath: string, targetUuid: string, targetName: string, project: IXcode.project): void {
7563
if (this.$fs.exists(jsonPath)) {
7664
const configurationJson = this.$fs.readJson(jsonPath) || {};
7765

@@ -94,3 +82,5 @@ export abstract class NativeTargetServiceBase {
9482
}
9583
}
9684
}
85+
86+
$injector.register("iOSNativeTargetService", IOSNativeTargetService);

lib/services/ios-project-service.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
5252
private $xcconfigService: IXcconfigService,
5353
private $xcodebuildService: IXcodebuildService,
5454
private $iOSExtensionsService: IIOSExtensionsService,
55-
private $iOSWatchAppService: IIOSWatchAppService) {
55+
private $iOSWatchAppService: IIOSWatchAppService,
56+
private $iOSNativeTargetService: IIOSNativeTargetService) {
5657
super($fs, $projectDataService);
5758
}
5859

@@ -432,7 +433,7 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
432433
<plist version="1.0">
433434
<dict>
434435
<key>CFBundleIdentifier</key>
435-
<string>${projectData.projectIdentifiers.ios}</string>
436+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
436437
</dict>
437438
</plist>`
438439
});
@@ -529,6 +530,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
529530

530531
public async handleNativeDependenciesChange(projectData: IProjectData, opts: IRelease): Promise<void> {
531532
const platformData = this.getPlatformData(projectData);
533+
534+
this.setProductBundleIdentifier(projectData);
532535
await this.$cocoapodsService.applyPodfileFromAppResources(projectData, platformData);
533536

534537
const projectPodfilePath = this.$cocoapodsService.getProjectPodfilePath(platformData.projectRoot);
@@ -603,6 +606,17 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
603606
return target;
604607
}
605608

609+
private setProductBundleIdentifier(projectData: IProjectData): void {
610+
const project = this.createPbxProj(projectData);
611+
this.$iOSNativeTargetService.setXcodeTargetBuildConfigurationProperties([
612+
{
613+
name: "PRODUCT_BUNDLE_IDENTIFIER",
614+
value: `"${projectData.projectIdentifiers.ios}"`
615+
}
616+
], projectData.projectName, project);
617+
this.savePbxProj(project, projectData);
618+
}
619+
606620
private getAllLibsForPluginWithFileExtension(pluginData: IPluginData, fileExtension: string | string[]): string[] {
607621
const fileExtensions = _.isArray(fileExtension) ? fileExtension : [fileExtension];
608622
const filterCallback = (fileName: string, pluginPlatformsFolderPath: string) =>

lib/services/ios-watch-app-service.ts

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import * as path from "path";
2-
import { NativeTargetServiceBase } from "./ios-native-target-service-base";
32
import { IOSDeviceTargets, IOS_WATCHAPP_FOLDER, IOS_WATCHAPP_EXTENSION_FOLDER, IOSNativeTargetProductTypes, IOSNativeTargetTypes } from "../constants";
43

5-
export class IOSWatchAppService extends NativeTargetServiceBase implements IIOSWatchAppService {
4+
export class IOSWatchAppService implements IIOSWatchAppService {
65
private static WATCH_APP_IDENTIFIER = "watchkitapp";
76
private static WACTCH_EXTENSION_IDENTIFIER = "watchkitextension";
87
constructor(protected $fs: IFileSystem,
98
protected $pbxprojDomXcode: IPbxprojDomXcode,
10-
protected $xcode: IXcode) {
11-
super($fs, $pbxprojDomXcode, $xcode);
9+
protected $xcode: IXcode,
10+
private $iOSNativeTargetService: IIOSNativeTargetService) {
1211
}
1312

1413
public async addWatchAppFromPath({watchAppFolderPath, projectData, platformData, pbxProjPath}: IAddWatchAppFromPathOptions): Promise<boolean> {
@@ -20,13 +19,13 @@ export class IOSWatchAppService extends NativeTargetServiceBase implements IIOSW
2019
return false;
2120
}
2221

23-
const appFolder = this.getTargetDirectories(appPath)[0];
24-
const extensionFolder = this.getTargetDirectories(extensionPath)[0];
22+
const appFolder = this.$iOSNativeTargetService.getTargetDirectories(appPath)[0];
23+
const extensionFolder = this.$iOSNativeTargetService.getTargetDirectories(extensionPath)[0];
2524

2625
const project = new this.$xcode.project(pbxProjPath);
2726
project.parseSync();
2827

29-
const watchApptarget = this.addTargetToProject(appPath, appFolder, IOSNativeTargetTypes.watchApp, project, platformData, project.getFirstTarget().uuid);
28+
const watchApptarget = this.$iOSNativeTargetService.addTargetToProject(appPath, appFolder, IOSNativeTargetTypes.watchApp, project, platformData, project.getFirstTarget().uuid);
3029
this.configureTarget(
3130
appFolder,
3231
path.join(appPath, appFolder),
@@ -37,7 +36,7 @@ export class IOSWatchAppService extends NativeTargetServiceBase implements IIOSW
3736
);
3837
targetUuids.push(watchApptarget.uuid);
3938

40-
const watchExtensionTarget = this.addTargetToProject(extensionPath, extensionFolder, IOSNativeTargetTypes.watchExtension, project, platformData, watchApptarget.uuid);
39+
const watchExtensionTarget = this.$iOSNativeTargetService.addTargetToProject(extensionPath, extensionFolder, IOSNativeTargetTypes.watchExtension, project, platformData, watchApptarget.uuid);
4140
this.configureTarget(
4241
extensionFolder,
4342
path.join(extensionPath, extensionFolder),
@@ -48,7 +47,7 @@ export class IOSWatchAppService extends NativeTargetServiceBase implements IIOSW
4847
targetUuids.push(watchExtensionTarget.uuid);
4948

5049
this.$fs.writeFile(pbxProjPath, project.writeSync({omitEmptyValues: true}));
51-
this.prepareSigning(targetUuids, projectData, pbxProjPath);
50+
this.$iOSNativeTargetService.prepareSigning(targetUuids, projectData, pbxProjPath);
5251

5352
return true;
5453
}
@@ -78,15 +77,15 @@ export class IOSWatchAppService extends NativeTargetServiceBase implements IIOSW
7877
identifierParts.pop();
7978
const wkAppBundleIdentifier = identifierParts.join(".");
8079

81-
this.setXcodeTargetBuildConfigurationProperties([
80+
this.$iOSNativeTargetService.setXcodeTargetBuildConfigurationProperties([
8281
{name: "PRODUCT_BUNDLE_IDENTIFIER", value: identifier},
8382
{name: "SDKROOT", value: "watchos"},
8483
{name: "TARGETED_DEVICE_FAMILY", value: IOSDeviceTargets.watchos},
8584
{name: "WATCHOS_DEPLOYMENT_TARGET", value: 5.2},
8685
{name: "WK_APP_BUNDLE_IDENTIFIER", value: wkAppBundleIdentifier}
8786
], targetName, project);
8887

89-
this.setConfigurationsFromJsonFile(targetConfigurationJsonPath, target.uuid, targetName, project);
88+
this.$iOSNativeTargetService.setConfigurationsFromJsonFile(targetConfigurationJsonPath, target.uuid, targetName, project);
9089
project.addToHeaderSearchPaths(targetPath, target.pbxNativeTarget.productName);
9190
}
9291
}

test/ios-project-service.ts

+3
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ function createTestInjector(projectPath: string, projectName: string, xCode?: IX
174174
testInjector.register("logSourceMapService", {
175175
replaceWithOriginalFileLocations: (platform: string, message: string) => message
176176
});
177+
testInjector.register("iOSNativeTargetService", {
178+
setXcodeTargetBuildConfigurationProperties: () => { /* */ }
179+
});
177180
return testInjector;
178181
}
179182

0 commit comments

Comments
 (0)