web-dev-qa-db-ja.com

xcode 6.1のアップグレード後に「ResourceRules.plist:リソースを読み取れません」エラーを手動で修正するにはどうすればよいですか?

同じ問題が見つかりました hereherehere and here

基本的に、xcode 6.1にアップグレードし、ビルドで「ResourceRules.plist:リソースを読み取れません」エラーが発生します。

IOSのビルドを行うJenkinsサーバーがあります。 Jenkinsで Xcodeプラグイン を使用して、実際のビルドと署名を行います。 xcodeを手動で開いてこのソリューションを実行せずにこの変更を行う方法についての考えは、他の回答にあります。

プロジェクトをクリックします>ターゲット>ターゲットを選択>ビルド設定>

コード署名リソースルールパス

そして追加:

$(SDKROOT)/ResourceRules.plist

私は一般的にXcodeとiOSビルドを初めて使用します。 project.pbxprojファイルがUnity-iPhone.xcodeprojファイル内に見つかりました。これには、/ * XCBuildConfigurationセクションの開始* /セクションの下にビルド設定が含まれているように見えますが、Xcodeで見つかった同様のビルドプロパティのように見えるものをリストしますが、「コードリソースルールのパスへの署名」。

このファイルを手動で編集した経験はありますか?それは一般的に悪い考えですか?

ありがとう

49
Tim

XencodeプラグインでJenkinsを使用している場合は、'Code Signing Resource Rules Path'変数を追加して:

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

'Custom xcodebuild arguments' XCodeプラグインの設定。

この修正には、XCode GUIは必要ありません。

65
nick

同じ問題が発生しました。 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を使用しない/使用できない場合は、この場所でnpmの fs.appendFile を活用して小さなCordovaフックを作成するだけです:$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リリースにマージされるため、フックは不要になります(私が作成しています Cordova-iOSのこのPR )を参照してください。

上記の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.'
_
13
sidneys

本当に夢中になりたい場合は、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を使用していますが、スクリプトからすべてのビルドコマンドを実行しています。

5
Ben Flynn

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-コマンドラインから/

4
Renaud Tilte

自動ビルドには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
1
Kaan Yy

あなたとまったく同じ問題がありました。 JenkinsでiOSアプリを構築しているため、「コード署名リソースルールパス」を手動で設定できませんでした。

私は仕事をする小さなNodeJSファイルを書きました(以下のコードを参照)

このスクリプトは、xcode.xcodeprojファイルの解析に役立つ xcode というNice NodeJSパッケージを使用します。

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);
1
martinmose