如何在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