Как мы вручную исправляем ошибку "ResourceRules.plist: не могу прочитать ресурсы" после обновления xcode 6.1?
У нас такая же проблема найдена здесь, здесь, здесь и здесь
В основном мы обновили до xcode 6.1, и наша сборка получает сообщение об ошибке "ResourceRules.plist: невозможно прочитать ресурсы".
У нас есть сервер Jenkins, который делает наши ios для нас. Мы используем Xcode plugin в Jenkins для выполнения фактической сборки и подписания. Любые мысли о том, как мы можем внести это изменение, не открывая вручную xcode и не используя это решение, находим по другим ответам:
Нажмите на свой проект > Цели > Выберите цель > Настройки сборки >
Код правил доступа к кодам
и добавьте:
$(SDKROOT)/ResourceRules.plist
Я очень новичок в создании Xcode и iOS в целом. Я нашел файл project.pbxproj внутри файла Unity-iPhone.xcodeproj. Похоже, что это содержит настройки сборки в разделе /* Begin XCBuildConfiguration */, в котором перечислены то, что похоже на аналогичные свойства сборки, найденные в Xcode, однако я не вижу ничего подобного "Code Rules Signing Resource Path",.
Есть ли у кого-нибудь опыт редактирования этого файла вручную? Это плохая идея вообще?
Спасибо
Ответы
Ответ 1
Если вы используете Jenkins с плагином XCode, вы можете изменить переменную 'Code Signing Resource Rules Path'
, добавив:
"CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist"
в
'Custom xcodebuild arguments'
для плагина XCode.
Это исправление не требует графического интерфейса XCode.
Ответ 2
Я столкнулся с той же проблемой. Решение Nicks работает, но требует дополнительных зависимостей. Для этого вам не нужен жесткий модуль npm xcode. Просто добавьте строку в этот файл:
$PROJECT_ROOT/платформы/ИОС/Cordova/build.xcconfig
CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
Обратите внимание, что перед XCode 6.1.1 это необходимо указать как "$(SDKROOT)/ResourceRules.plist"
(обратите внимание на кавычки).
Если вы запускаете это внутри автоматизированных систем сборки, таких как Jenkins и не можете/не можете использовать какой-либо графический интерфейс XCode, просто создайте небольшой крючок Кордовы, используя 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, поэтому крючок станет ненужным (Я создаю см. этот PR для 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.'
Ответ 3
Если вы хотите действительно сумасшедший, вы можете напрямую обновить 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");
Я уже взломал этот script, чтобы принять аргумент keychain, поэтому он имеет смысл для меня. Примечание. Я не использую плагин Xcode Jenkins. Я использую Jenkins, но выполняю все команды сборки из script.
Ответ 4
После новой версии XCode 7 23 сентября 2015 года Apple начала отклонять любое приложение, использующее CODE_SIGN_RESOURCE_RULES_PATH
, что делает сборку Jenkins автоматически отвергаемой. Однако установка CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
в аргументы Custom xcodebuild вызывает сбой сборки.
В этом ответе решена проблема: fooobar.com/questions/42957/...
Это явно ошибка, которую Apple забыла исправить некоторое время назад, поскольку в этой статье также подчеркивается: http://cutting.io/posts/packaging-ios-apps-from-the-command-line/
Ответ 5
У меня была ТОЧНАЯ такая же проблема, как и у вас. Мы создаем наше приложение для iOS на Jenkins, поэтому мы не смогли вручную установить "Code Rules Signing Resource Rules Path".
Я написал небольшой файл NodeJS, который выполняет эту работу для меня (см. код ниже).
script используйте хороший пакет NodeJS под названием xcode, который помогает мне разобрать файл xcode.xcodeproj.
Я не знаю, используете ли вы Cordova/Phonegap или что используете, но если вы можете просто скопировать код и сделать крюк Кордовы. Если нет, я уверен, что вы можете выполнить файл у Дженкинса с небольшими изменениями.
В любом случае, я надеюсь, что этот script поможет вам:
#!/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);
Ответ 6
Мы используем Unity + Jenkins для автоматической сборки.
Вы можете выполнить сценарии cs post process; Однако; для быстрого (и грязного исправления) вы можете применить следующую команду bash после Unity, но до xcode:
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