Repository: cordova-lib Updated Branches: refs/heads/master 884852fa7 -> c86cd7271
CB-7118 iOS: add target-device and MinimumOSVersion support to config.xml github: close #57 Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/b9eca985 Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/b9eca985 Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/b9eca985 Branch: refs/heads/master Commit: b9eca9851ead2df69021ce83fbf728d78774c1bd Parents: 884852f Author: sgrebnov <[email protected]> Authored: Fri Jul 11 09:44:50 2014 +0400 Committer: Andrew Grieve <[email protected]> Committed: Wed Aug 20 10:46:22 2014 -0400 ---------------------------------------------------------------------- cordova-lib/src/cordova/metadata/ios_parser.js | 71 +++++++++++++++++++-- 1 file changed, 64 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/b9eca985/cordova-lib/src/cordova/metadata/ios_parser.js ---------------------------------------------------------------------- diff --git a/cordova-lib/src/cordova/metadata/ios_parser.js b/cordova-lib/src/cordova/metadata/ios_parser.js index a6254ac..f43f194 100644 --- a/cordova-lib/src/cordova/metadata/ios_parser.js +++ b/cordova-lib/src/cordova/metadata/ios_parser.js @@ -134,11 +134,17 @@ module.exports.prototype = { shell.cp('-f', src, dest); } }); + + var me = this; + return this.update_build_settings(config).then(function() { + if (name == me.originalName) { + events.emit('verbose', 'iOS Product Name has not changed (still "' + me.originalName + '")'); + return Q(); + } - if (name != this.originalName) { // Update product name inside pbxproj file - var proj = new xcode.project(this.pbxproj); - var parser = this; + var proj = new xcode.project(me.pbxproj); + var parser = me; var d = Q.defer(); proj.parse(function(err,hash) { if (err) { @@ -163,10 +169,7 @@ module.exports.prototype = { } }); return d.promise; - } else { - events.emit('verbose', 'iOS Product Name has not changed (still "' + this.originalName + '")'); - return Q(); - } + }); }, // Returns the platform-specific www directory. @@ -217,6 +220,38 @@ module.exports.prototype = { self.update_overrides(); util.deleteSvnFolders(self.www_dir()); }); + }, + + update_build_settings:function(config) { + var targetDevice = parseTargetDevicePreference(config.getPreference('target-device', 'ios')); + var deploymentTarget = config.getPreference('deployment-target', 'ios'); + + // no build settings provided, we don't need to parse and update .pbxproj file + if (!targetDevice && !deploymentTarget) { + return Q(); + } + + var me = this; + var d = Q.defer(); + var proj = new xcode.project(this.pbxproj); + proj.parse(function(err,hash) { + if (err) { + d.reject(new Error('An error occured during parsing of project.pbxproj. Start weeping. Output: ' + err)); + return; + } + var buildConfiguration = proj.pbxXCBuildConfigurationSection(); + if (targetDevice) { + // TODO: replace propReplace with proj.updateBuildProperty after below is release + // https://github.com/alunny/node-xcode/pull/33 + propReplace(buildConfiguration, 'TARGETED_DEVICE_FAMILY', targetDevice); + } + if (deploymentTarget) { + propReplace(buildConfiguration, 'IPHONEOS_DEPLOYMENT_TARGET', deploymentTarget); + } + fs.writeFileSync(me.pbxproj, proj.writeSync(), 'utf-8'); + d.resolve(); + }); + return d.promise; } }; @@ -226,3 +261,25 @@ module.exports.prototype = { function default_CFBundleVersion(version) { return version.split('-')[0]; } +// Converts cordova specific representation of target device to XCode value +function parseTargetDevicePreference(value) { + if (!value) return null; + var map = { 'universal': '"1,2"', 'handset': '"1"', 'tablet': '"2"'} + if (map[value.toLowerCase()]) { + return map[value.toLowerCase()] + } + events.emit('warn', 'Unknown target-device preference value: "' + value + '".'); + return null; +} +// helper recursive prop search+replace +function propReplace(obj, prop, value) { + for (var p in obj) { + if (obj.hasOwnProperty(p)) { + if (typeof obj[p] == 'object') { + propReplace(obj[p], prop, value); + } else if (p == prop) { + obj[p] = value; + } + } + } +}
