52

我们在这里这里这里这里发现了同样的问题

基本上我们升级到 xcode 6.1 并且我们的构建收到“ResourceRules.plist:无法读取资源”错误。

我们有一个 Jenkins 服务器来为我们构建我们的 ios。我们在 Jenkins 上使用Xcode 插件来进行实际的构建和签名。关于如何在不手动打开 xcode 并在其他答案中找到此解决方案的情况下进行此更改的任何想法:

单击您的项目>目标>选择您的目标>构建设置>

代码签名资源规则路径

并添加:

$(SDKROOT)/ResourceRules.plist

一般来说,我对 Xcode 和 iOS 构建非常陌生。我在 Unity-iPhone.xcodeproj 文件中找到了 project.pbxproj 文件。看起来这包含/* Begin XCBuildConfiguration 部分下的构建设置 */部分它列出了在 Xcode 中找到的类似构建属性的内容,但是我没有看到类似“代码签名资源规则路径”的任何内容。

有没有人有手动编辑这个文件的经验?一般来说,这是一个坏主意吗?

谢谢

4

6 回答 6

67

如果您将 Jenkins 与 XCode 插件一起使用,则可以'Code Signing Resource Rules Path'通过添加以下内容来修改变量:

"CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist" 

'Custom xcodebuild arguments'XCode 插件的设置。

此修复不需要 XCode GUI。

于 2014-10-23T16:17:00.813 回答
13

我遇到了同样的问题。Nicks 解决方案确实有效,但需要额外的依赖项。为此,您不需要笨拙的npm xcode模块。只需在此文件中添加一行: $PROJECT_ROOT/platforms/ios/cordova/build.xcconfig

CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist

请注意,在 XCode 6.1.1 之前,需要将其指定为"$(SDKROOT)/ResourceRules.plist"(注意引号)。

如果您在 Jenkins 等自动构建系统中运行它并且不会/不能使用任何 XCode GUI,只需在以下位置创建一个小的 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 版本中合并,因此挂钩将变得不必要(我正在创建一个See this PR for Cordova-iOS)。

如果上述 JavaScript 片段由于“错误参数”失败而无法执行,请按如下方式替换文件内容:

#!/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.'
于 2014-10-25T14:48:25.323 回答
5

如果你想真正疯狂,你可以直接更新 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");

我已经破解了这个脚本来接受一个钥匙串参数,所以这对我来说很有意义。注意我没有使用 Xcode Jenkins 插件——我使用的是 Jenkins,但从脚本运行所有构建命令。

于 2014-11-05T00:21:06.733 回答
4

在 2015 年 9 月 23 日 XCode 7 的新版本发布后,Apple 开始拒绝任何正在使用的应用程序CODE_SIGN_RESOURCE_RULES_PATH,从而使 Jenkins 构建自动被拒绝。但是,设置CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist到自定义 xcodebuild 参数会导致构建失败。

这个答案解决了这个问题:https ://stackoverflow.com/a/32762413/5373468

这显然是 Apple 不久前忘记修复的错误,因为本文也强调:http ://cutting.io/posts/packaging-ios-apps-from-the-command-line/

于 2015-09-24T18:34:50.017 回答
1

我遇到了和你一样的问题。我们正在 Jenkins 上构建我们的 iOS 应用程序,因此我们无法手动设置“代码签名资源规则路径”。

我写了一个小的 NodeJS 文件,它为我完成了这项工作(见下面的代码)

该脚本使用了一个名为xcode的漂亮 NodeJS 包,它可以帮助我解析 xcode.xcodeproj 文件。

我不知道你是在使用 Cordova/Phonegap 还是你在使用什么,但如果你可以复制代码并制作一个 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);
于 2014-10-23T13:49:37.793 回答
1

我们正在使用 Unity + Jenkins 进行自动构建。

您可以使用后期处理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
于 2014-12-03T13:56:18.553 回答