From c2d7c5d5289b55694cf75150cd96d0681f7e48a4 Mon Sep 17 00:00:00 2001 From: rosen-vladimirov Date: Wed, 21 Jun 2017 18:35:00 +0300 Subject: [PATCH] Fix merging of CFBundleURLSchemes in debug builds In debug builds we add CFBundleURLSchemes that's required to restart the app on Windows. However, in case the Info.plist of the application already has the same key, the module we are using is not merging the values correctly. Fix this by manually merging the values. --- lib/common | 2 +- lib/services/ios-project-service.ts | 64 ++++++++++++++++++----------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/lib/common b/lib/common index c01fd47f28..f906af7e73 160000 --- a/lib/common +++ b/lib/common @@ -1 +1 @@ -Subproject commit c01fd47f2815ed528747427bcf72a4e6dc66da18 +Subproject commit f906af7e73171ca839a8313f4d33f8e6a0ae88ee diff --git a/lib/services/ios-project-service.ts b/lib/services/ios-project-service.ts index 2a0b1629be..deec5de691 100644 --- a/lib/services/ios-project-service.ts +++ b/lib/services/ios-project-service.ts @@ -743,40 +743,28 @@ We will now place an empty obsolete compatability white screen LauncScreen.xib f makePatch(pluginInfoPlistPath); } - makePatch(infoPlistPath); + if (!buildOptions.release && projectData.projectId) { + const modifiedPlistContent = this.updateCFBundleURLSchemes(infoPlistPath, projectData); - if (projectData.projectId) { session.patch({ - name: "CFBundleIdentifier from package.json nativescript.id", - read: () => - ` - - - - CFBundleIdentifier - ${projectData.projectId} - - ` + name: "CFBundleURLTypes from Info.plist and required one for restarting application", + read: () => modifiedPlistContent }); + + } else { + makePatch(infoPlistPath); } - if (!buildOptions.release && projectData.projectId) { + if (projectData.projectId) { session.patch({ - name: "CFBundleURLTypes from package.json nativescript.id", + name: "CFBundleIdentifier from package.json nativescript.id", read: () => ` - CFBundleURLTypes - - - CFBundleURLSchemes - - ${projectData.projectId.replace(/[^A-Za-z0-9]/g, "")} - - - + CFBundleIdentifier + ${projectData.projectId} ` }); @@ -788,6 +776,36 @@ We will now place an empty obsolete compatability white screen LauncScreen.xib f this.$fs.writeFile(this.getPlatformData(projectData).configurationFilePath, plistContent); } + private updateCFBundleURLSchemes(infoPlistPath: string, projectData: IProjectData): string { + // This code is required due to bug in session.patch logic which cannot merge values which are both arrays - it uses the second one directly. + // In our case we want to merge the values of CFBundleURLSchemes (which are arrays), which are in CFBundleURLTypes arrays. + let parsedPlist: any = plist.parse(this.$fs.readFile(infoPlistPath).toString()); + parsedPlist.CFBundleURLTypes = parsedPlist.CFBundleURLTypes || []; + + const appIdCfBundleUrlScheme = projectData.projectId.replace(/[^A-Za-z0-9]/g, ""); + + let hasAddedCFBundleURLSchemes = false; + + _.each(parsedPlist.CFBundleURLTypes, type => { + if (type.CFBundleURLSchemes) { + hasAddedCFBundleURLSchemes = true; + type.CFBundleURLSchemes.push(appIdCfBundleUrlScheme); + return false; + } + }); + + if (!hasAddedCFBundleURLSchemes) { + parsedPlist.CFBundleURLTypes.push( + { + CFBundleURLSchemes: [appIdCfBundleUrlScheme] + } + ); + } + + const newPlistContent = plist.build(parsedPlist); + return newPlistContent; + } + private getAllInstalledPlugins(projectData: IProjectData): Promise { return (this.$injector.resolve("pluginsService")).getAllInstalledPlugins(projectData); }