Как мы вручную исправляем ошибку "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