同じ問題が見つかりました here 、 here 、 here and here
基本的に、xcode 6.1にアップグレードし、ビルドで「ResourceRules.plist:リソースを読み取れません」エラーが発生します。
IOSのビルドを行うJenkinsサーバーがあります。 Jenkinsで Xcodeプラグイン を使用して、実際のビルドと署名を行います。 xcodeを手動で開いてこのソリューションを実行せずにこの変更を行う方法についての考えは、他の回答にあります。
プロジェクトをクリックします>ターゲット>ターゲットを選択>ビルド設定>
コード署名リソースルールパス
そして追加:
$(SDKROOT)/ResourceRules.plist
私は一般的にXcodeとiOSビルドを初めて使用します。 project.pbxprojファイルがUnity-iPhone.xcodeprojファイル内に見つかりました。これには、/ * XCBuildConfigurationセクションの開始* /セクションの下にビルド設定が含まれているように見えますが、Xcodeで見つかった同様のビルドプロパティのように見えるものをリストしますが、「コードリソースルールのパスへの署名」。
このファイルを手動で編集した経験はありますか?それは一般的に悪い考えですか?
ありがとう
XencodeプラグインでJenkinsを使用している場合は、'Code Signing Resource Rules Path'
変数を追加して:
"CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist"
に
'Custom xcodebuild arguments'
XCodeプラグインの設定。
この修正には、XCode GUIは必要ありません。
同じ問題が発生しました。 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.'
_
本当に夢中になりたい場合は、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を使用していますが、スクリプトからすべてのビルドコマンドを実行しています。
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-コマンドラインから/
自動ビルドには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
あなたとまったく同じ問題がありました。 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);