summaryrefslogtreecommitdiff
path: root/StoneIsland/plugins/cordova-plugin-firebasex/scripts/ios/helper.js
diff options
context:
space:
mode:
Diffstat (limited to 'StoneIsland/plugins/cordova-plugin-firebasex/scripts/ios/helper.js')
-rw-r--r--StoneIsland/plugins/cordova-plugin-firebasex/scripts/ios/helper.js238
1 files changed, 238 insertions, 0 deletions
diff --git a/StoneIsland/plugins/cordova-plugin-firebasex/scripts/ios/helper.js b/StoneIsland/plugins/cordova-plugin-firebasex/scripts/ios/helper.js
new file mode 100644
index 00000000..be12ae06
--- /dev/null
+++ b/StoneIsland/plugins/cordova-plugin-firebasex/scripts/ios/helper.js
@@ -0,0 +1,238 @@
+var fs = require("fs");
+var path = require("path");
+var utilities = require("../lib/utilities");
+var xcode = require("xcode");
+var plist = require('plist');
+
+/**
+ * This is used as the display text for the build phase block in XCode as well as the
+ * inline comments inside of the .pbxproj file for the build script phase block.
+ */
+var comment = "\"Crashlytics\"";
+
+module.exports = {
+
+ /**
+ * Used to get the path to the XCode project's .pbxproj file.
+ */
+ getXcodeProjectPath: function () {
+ var appName = utilities.getAppName();
+ return path.join("platforms", "ios", appName + ".xcodeproj", "project.pbxproj");
+ },
+
+ /**
+ * This helper is used to add a build phase to the XCode project which runs a shell
+ * script during the build process. The script executes Crashlytics run command line
+ * tool with the API and Secret keys. This tool is used to upload the debug symbols
+ * (dSYMs) so that Crashlytics can display stack trace information in it's web console.
+ */
+ addShellScriptBuildPhase: function (context, xcodeProjectPath) {
+
+ // Read and parse the XCode project (.pxbproj) from disk.
+ // File format information: http://www.monobjc.net/xcode-project-file-format.html
+ var xcodeProject = xcode.project(xcodeProjectPath);
+ xcodeProject.parseSync();
+
+ // Build the body of the script to be executed during the build phase.
+ var script = '"' + '\\"${PODS_ROOT}/FirebaseCrashlytics/run\\"' + '"';
+
+ // Generate a unique ID for our new build phase.
+ var id = xcodeProject.generateUuid();
+ // Create the build phase.
+ xcodeProject.hash.project.objects.PBXShellScriptBuildPhase[id] = {
+ isa: "PBXShellScriptBuildPhase",
+ buildActionMask: 2147483647,
+ files: [],
+ inputPaths: ['"' + '$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)' + '"'],
+ name: comment,
+ outputPaths: [],
+ runOnlyForDeploymentPostprocessing: 0,
+ shellPath: "/bin/sh",
+ shellScript: script,
+ showEnvVarsInLog: 0
+ };
+
+ // Add a comment to the block (viewable in the source of the pbxproj file).
+ xcodeProject.hash.project.objects.PBXShellScriptBuildPhase[id + "_comment"] = comment;
+
+ // Add this new shell script build phase block to the targets.
+ for (var nativeTargetId in xcodeProject.hash.project.objects.PBXNativeTarget) {
+
+ // Skip over the comment blocks.
+ if (nativeTargetId.indexOf("_comment") !== -1) {
+ continue;
+ }
+
+ var nativeTarget = xcodeProject.hash.project.objects.PBXNativeTarget[nativeTargetId];
+
+ nativeTarget.buildPhases.push({
+ value: id,
+ comment: comment
+ });
+ }
+
+ // Finally, write the .pbxproj back out to disk.
+ fs.writeFileSync(path.resolve(xcodeProjectPath), xcodeProject.writeSync());
+ },
+
+ /**
+ * This helper is used to remove the build phase from the XCode project that was added
+ * by the addShellScriptBuildPhase() helper method.
+ */
+ removeShellScriptBuildPhase: function (context, xcodeProjectPath) {
+
+ // Read and parse the XCode project (.pxbproj) from disk.
+ // File format information: http://www.monobjc.net/xcode-project-file-format.html
+ var xcodeProject = xcode.project(xcodeProjectPath);
+ xcodeProject.parseSync();
+
+ // First, we want to delete the build phase block itself.
+
+ var buildPhases = xcodeProject.hash.project.objects.PBXShellScriptBuildPhase;
+
+ var commentTest = comment.replace(/"/g, '');
+ for (var buildPhaseId in buildPhases) {
+
+ var buildPhase = xcodeProject.hash.project.objects.PBXShellScriptBuildPhase[buildPhaseId];
+ var shouldDelete = false;
+
+ if (buildPhaseId.indexOf("_comment") === -1) {
+ // Dealing with a build phase block.
+
+ // If the name of this block matches ours, then we want to delete it.
+ shouldDelete = buildPhase.name && buildPhase.name.indexOf(commentTest) !== -1;
+ } else {
+ // Dealing with a comment block.
+
+ // If this is a comment block that matches ours, then we want to delete it.
+ shouldDelete = buildPhase === commentTest;
+ }
+
+ if (shouldDelete) {
+ delete buildPhases[buildPhaseId];
+ }
+ }
+
+ // Second, we want to delete the native target reference to the block.
+
+ var nativeTargets = xcodeProject.hash.project.objects.PBXNativeTarget;
+
+ for (var nativeTargetId in nativeTargets) {
+
+ // Skip over the comment blocks.
+ if (nativeTargetId.indexOf("_comment") !== -1) {
+ continue;
+ }
+
+ var nativeTarget = nativeTargets[nativeTargetId];
+
+ // We remove the reference to the block by filtering out the the ones that match.
+ nativeTarget.buildPhases = nativeTarget.buildPhases.filter(function (buildPhase) {
+ return buildPhase.comment !== commentTest;
+ });
+ }
+
+ // Finally, write the .pbxproj back out to disk.
+ fs.writeFileSync(path.resolve(xcodeProjectPath), xcodeProject.writeSync());
+ },
+
+ ensureRunpathSearchPath: function(context, xcodeProjectPath){
+
+ function addRunpathSearchBuildProperty(proj, build) {
+ let LD_RUNPATH_SEARCH_PATHS = proj.getBuildProperty("LD_RUNPATH_SEARCH_PATHS", build);
+
+ if (!Array.isArray(LD_RUNPATH_SEARCH_PATHS)) {
+ LD_RUNPATH_SEARCH_PATHS = [LD_RUNPATH_SEARCH_PATHS];
+ }
+
+ LD_RUNPATH_SEARCH_PATHS.forEach(LD_RUNPATH_SEARCH_PATH => {
+ if (!LD_RUNPATH_SEARCH_PATH) {
+ proj.addBuildProperty("LD_RUNPATH_SEARCH_PATHS", "\"$(inherited) @executable_path/Frameworks\"", build);
+ }
+ if (LD_RUNPATH_SEARCH_PATH.indexOf("@executable_path/Frameworks") == -1) {
+ var newValue = LD_RUNPATH_SEARCH_PATH.substr(0, LD_RUNPATH_SEARCH_PATH.length - 1);
+ newValue += ' @executable_path/Frameworks\"';
+ proj.updateBuildProperty("LD_RUNPATH_SEARCH_PATHS", newValue, build);
+ }
+ if (LD_RUNPATH_SEARCH_PATH.indexOf("$(inherited)") == -1) {
+ var newValue = LD_RUNPATH_SEARCH_PATH.substr(0, LD_RUNPATH_SEARCH_PATH.length - 1);
+ newValue += ' $(inherited)\"';
+ proj.updateBuildProperty("LD_RUNPATH_SEARCH_PATHS", newValue, build);
+ }
+ });
+ }
+
+ // Read and parse the XCode project (.pxbproj) from disk.
+ // File format information: http://www.monobjc.net/xcode-project-file-format.html
+ var xcodeProject = xcode.project(xcodeProjectPath);
+ xcodeProject.parseSync();
+
+ // Add search paths build property
+ addRunpathSearchBuildProperty(xcodeProject, "Debug");
+ addRunpathSearchBuildProperty(xcodeProject, "Release");
+
+ // Finally, write the .pbxproj back out to disk.
+ fs.writeFileSync(path.resolve(xcodeProjectPath), xcodeProject.writeSync());
+ },
+ stripDebugSymbols: function(){
+ var podFilePath = 'platforms/ios/Podfile',
+ podFile = fs.readFileSync(path.resolve(podFilePath)).toString();
+ if(!podFile.match('DEBUG_INFORMATION_FORMAT')){
+ podFile += "\npost_install do |installer|\n" +
+ " installer.pods_project.targets.each do |target|\n" +
+ " target.build_configurations.each do |config|\n" +
+ " config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf'\n" +
+ " end\n" +
+ " end\n" +
+ "end";
+ fs.writeFileSync(path.resolve(podFilePath), podFile);
+ console.log('cordova-plugin-firebasex: Applied IOS_STRIP_DEBUG to Podfile');
+ }
+ },
+ applyPluginVarsToPlists: function(googlePlistPath, appPlistPath, pluginVariables){
+ var googlePlist = plist.parse(fs.readFileSync(path.resolve(googlePlistPath), 'utf8')),
+ appPlist = plist.parse(fs.readFileSync(path.resolve(appPlistPath), 'utf8')),
+ googlePlistModified = false,
+ appPlistModified = false;
+
+ if(typeof pluginVariables['FIREBASE_ANALYTICS_COLLECTION_ENABLED'] !== 'undefined'){
+ googlePlist["FIREBASE_ANALYTICS_COLLECTION_ENABLED"] = (pluginVariables['FIREBASE_ANALYTICS_COLLECTION_ENABLED'] !== "false" ? "true" : "false") ;
+ googlePlistModified = true;
+ }
+ if(typeof pluginVariables['FIREBASE_PERFORMANCE_COLLECTION_ENABLED'] !== 'undefined'){
+ googlePlist["FIREBASE_PERFORMANCE_COLLECTION_ENABLED"] = (pluginVariables['FIREBASE_PERFORMANCE_COLLECTION_ENABLED'] !== "false" ? "true" : "false") ;
+ googlePlistModified = true;
+ }
+ if(typeof pluginVariables['FIREBASE_CRASHLYTICS_COLLECTION_ENABLED'] !== 'undefined'){
+ googlePlist["FirebaseCrashlyticsCollectionEnabled"] = (pluginVariables['FIREBASE_CRASHLYTICS_COLLECTION_ENABLED'] !== "false" ? "true" : "false") ;
+ googlePlistModified = true;
+ }
+ if(typeof pluginVariables['IOS_SHOULD_ESTABLISH_DIRECT_CHANNEL'] !== 'undefined'){
+ appPlist["shouldEstablishDirectChannel"] = (pluginVariables['IOS_SHOULD_ESTABLISH_DIRECT_CHANNEL'] === "true") ;
+ appPlistModified = true;
+ }
+ if(pluginVariables['SETUP_RECAPTCHA_VERIFICATION'] === 'true'){
+ var reversedClientId = googlePlist['REVERSED_CLIENT_ID'];
+
+ if(!appPlist['CFBundleURLTypes']) appPlist['CFBundleURLTypes'] = [];
+ var entry, i;
+ for(i=0; i<appPlist['CFBundleURLTypes'].length; i++){
+ if(typeof appPlist['CFBundleURLTypes'][i] === 'object' && appPlist['CFBundleURLTypes'][i]['CFBundleURLSchemes']){
+ entry = appPlist['CFBundleURLTypes'][i];
+ break;
+ }
+ }
+ if(!entry) entry = {};
+ if(!entry['CFBundleTypeRole']) entry['CFBundleTypeRole'] = 'Editor';
+ if(!entry['CFBundleURLSchemes']) entry['CFBundleURLSchemes'] = [];
+ if(entry['CFBundleURLSchemes'].indexOf(reversedClientId) === -1){
+ entry['CFBundleURLSchemes'].push(reversedClientId)
+ }
+ appPlist['CFBundleURLTypes'][i] = entry;
+ appPlistModified = true;
+ }
+
+ if(googlePlistModified) fs.writeFileSync(path.resolve(googlePlistPath), plist.build(googlePlist));
+ if(appPlistModified) fs.writeFileSync(path.resolve(appPlistPath), plist.build(appPlist));
+ }
+};