如何在xcode 6.1升级后手动修复“ResourceRules.plist:无法读取资源”错误?
我们在 这里find同样的问题, 在 这里和这里
基本上我们升级到Xcode 6.1,我们的构build得到了“ResourceRules.plist:无法读取资源”的错误。
我们有一个Jenkins服务器,为我们构build我们的ios。 我们使用Jenkins上的Xcode插件来进行实际的构build和签名。 任何想法,我们可以做这个改变,而不需要手动打开xcode,并在其他答案中find这个解决scheme:
点击您的项目>目标>select您的目标>构build设置>
代码签名资源规则path
并添加:
$(SDKROOT)/ResourceRules.plist
一般来说,我对Xcode和iOS都非常陌生。 我在Unity-iPhone.xcodeproj文件里find了project.pbxproj文件。 它看起来像包含/ * Begin XCBuildConfiguration部分下的构build设置* / section它列出了Xcode中类似的构build属性,但是我没有看到类似“Code Signing Resource Rules Path”的代码。
有没有人有经验手动编辑这个文件? 这是一个坏主意吗?
谢谢
如果您使用的是Jenkins和XCode插件,则可以通过添加以下'Code Signing Resource Rules Path'
修改'Code Signing Resource Rules Path'
variables:
"CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist"
到了
XCode插件的'Custom xcodebuild arguments'
设置。
此修复程序不需要XCode GUI。
我遇到了同样的问题。 尼克斯解决scheme确实工作,但需要额外的依赖。 你不需要这个笨手笨脚的xcode模块。 只需在该文件中添加一行: $ PROJECT_ROOT / platforms / ios / cordova / build.xcconfig
CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
请注意,在XCode 6.1.1之前,这需要被指定为"$(SDKROOT)/ResourceRules.plist"
(注意引号)。
如果你正在Jenkins这样的自动化构build系统中运行,并且不能/不能使用任何XCode GUI,只需在这个位置创build一个小的Cordova钩子,利用npm的fs.appendFile : $ PROJECT_ROOT / hooks / before_build / ios_resourcerules .js (确保它有chmod + x)
#! /usr/local/bin/node var fs = require("fs"); fs.appendFileSync('build.xcconfig', '\nCODE_SIGN_RESOURCE_RULES_PATH = $(SDKROOT)/ResourceRules.plist', function (err) { if (err) throw err; console.log('CODE_SIGN_RESOURCE_RULES_PATH added to Cordova iOS build configuration.'); });
这可能会在即将到来的cordova版本合并,所以挂钩将成为不必要的( 我创build一个看到这个公关cordova – iOS )。
如果上述JavaScript代码段由于“错误参数”失败而无法执行,请按如下所示replace文件内容:
#!/bin/bash if [ ! -f ./build.xcconfig ]; then echo "[ERROR] hook befor_build/ios_resourcerules.sh cannot execute, ./build/xcconfig not found in $PWD" exit 1 fi echo '// (CB-7872) Solution for XCode 6.1 signing errors related to resource envelope format deprecation' >> ./build.xcconfig echo 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist' >> ./build.xcconfig echo 'CODE_SIGN_RESOURCE_RULES_PATH added to Cordova iOS build configuration.'
如果你想变得非常疯狂,你可以直接更新PackageApplication。
# In /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules", "--sign", $opt{sign}, "--resource-rules=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/ResourceRules.plist"); # OLD: "--resource-rules=$destApp/ResourceRules.plist");
我已经黑了这个脚本接受钥匙链arg,所以这对我来说是有道理的。 注意我没有使用Xcode Jenkins插件 – 我正在使用Jenkins,但是从脚本运行所有的构build命令。
在2015年9月23日新版本的XCode 7之后,苹果公司开始拒绝任何使用CODE_SIGN_RESOURCE_RULES_PATH
应用程序,从而使Jenkins自动被拒绝。 但是,将CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
为自定义xcodebuild参数会导致构build失败。
这个答案解决了这个问题: https : //stackoverflow.com/a/32762413/5373468
这显然是苹果前一段时间忘记修复的一个错误,因为这篇文章也强调了这一点: http : //cutting.io/posts/packaging-ios-apps-from-the-command-line/
我有完全相同的问题,因为你有。 我们正在Jenkins上构build我们的iOS应用程序,所以我们无法手动设置“代码签名资源规则path”。
我已经写了一个小的NodeJS文件,为我做这个工作(见下面的代码) 。
该脚本使用了一个名为xcode的好的NodeJS包,它可以帮助我parsingxcode.xcodeproj文件。
我不知道你是否使用Cordova / Phonegap或者你正在使用的是什么,但是如果你可以复制代码并且创build一个Cordova钩子。 如果不是的话,我相信你可以从Jenkins执行这个文件,做一些小的改动。
无论如何,我希望这个脚本将帮助你:
#!/usr/bin/env node var CODE_SIGN_RESOURCE_RULES_PATH = '"$(SDKROOT)/ResourceRules.plist"'; var fs = require("fs"); var path = require("path"); var xcode = require('xcode'); var projectRoot = process.argv[2]; function getProjectName(protoPath) { var cordovaConfigPath = path.join(protoPath, 'www', 'config.xml'); var content = fs.readFileSync(cordovaConfigPath, 'utf-8'); return /<name>([\s\S]*)<\/name>/mi.exec(content)[1].trim(); } function run(projectRoot) { var projectName = getProjectName(projectRoot); var xcodeProjectName = projectName + '.xcodeproj'; var xcodeProjectPath = path.join(projectRoot, 'platforms', 'ios', xcodeProjectName, 'project.pbxproj'); var xcodeProject; if (!fs.existsSync(xcodeProjectPath)) { return; } xcodeProject = xcode.project(xcodeProjectPath); console.log('Setting Code Sign Resource Rules Path for ' + projectName + ' to: [' + CODE_SIGN_RESOURCE_RULES_PATH + '] ...'); xcodeProject.parse(function(error){ if(error){ console.log('An error occured during parsing of [' + xcodeProjectPath + ']: ' + JSON.stringify(error)); }else{ var configurations = nonComments(xcodeProject.pbxXCBuildConfigurationSection()); for (config in configurations) { var buildSettings = configurations[config].buildSettings; buildSettings['CODE_SIGN_RESOURCE_RULES_PATH'] = CODE_SIGN_RESOURCE_RULES_PATH; } fs.writeFileSync(xcodeProjectPath, xcodeProject.writeSync(), 'utf-8'); console.log('[' + xcodeProjectPath + '] now has Code Signing Resource Rules Path set to:[' + CODE_SIGN_RESOURCE_RULES_PATH + '] ...'); } }); } var COMMENT_KEY = /_comment$/; function nonComments(obj) { var keys = Object.keys(obj), newObj = {}, i = 0; for (i; i < keys.length; i++) { if (!COMMENT_KEY.test(keys[i])) { newObj[keys[i]] = obj[keys[i]]; } } return newObj; } run(projectRoot);
我们使用Unity + Jenkins进行自动构build。
你可以用后处理的cs脚本实现; 然而; 为了快速(和脏的修复),你可以在Unity之后但在xcode之前应用下面的bash命令:
sed -i '' 's/CONFIGURATION_BUILD_DIR/CODE_SIGN_RESOURCE_RULES_PATH = "\$(SDKROOT)\/ResourceRules\.plist";\'$'\n CONFIGURATION_BUILD_DIR/g' /Users/admin/Jenkins/workspace/PROJECTNAME/Build/PROJECTNAME/Unity-iPhone.xcodeproj/project.pbxproj