Как вручную исправить ResourceRules.plist: невозможно прочитать ошибку ресурсов после обновления xcode 6.1?

У нас возникла та же проблема, что и здесь , здесь, здесь и здесь

В основном мы обновились до xcode 6.1, и наша сборка получает ошибку «ResourceRules.plist: невозможно прочитать ресурсы».

У нас есть сервер Jenkins, который делает для нас наши сборки ios. Мы используем подключаемый модуль Xcode в Jenkins для фактической сборки и подписи. . Любые мысли о том, как мы можем внести это изменение без ручного открытия xcode и выполнения этого решения, найденного в других ответах:

Нажмите на свой проект> Цели> Выберите цель> Настройки сборки>

Путь к правилам ресурсов подписи кода

и добавить :

$(SDKROOT)/ResourceRules.plist

Я очень новичок в сборке Xcode и iOS в целом. Я нашел файл project.pbxproj внутри файла Unity-iPhone.xcodeproj. Похоже, что он содержит параметры сборки в разделе /* Begin XCBuildConfiguration */, в нем перечислены похожие свойства сборки, найденные в Xcode, однако я не вижу ничего похожего на «Путь к правилам ресурса подписи кода» .

У кого-нибудь есть опыт ручного редактирования этого файла? Это вообще плохая идея?

Спасибо


person Tim    schedule 22.10.2014    source источник
comment
возможный дубликат ошибки XCode 6.1 при создании IPA с использованием приложения TestFlight   -  person Peter    schedule 23.10.2014
comment
Принятое исправление в этом потоке требует возможности редактировать проект xcode через графический интерфейс. Похоже, что эта проблема связана с проектами xcode, созданными Unity, работающими через решение CI на основе Jenkins. Это означает, что проекты xcode автоматически генерируются и автоматически создаются без возможности или желания вручную манипулировать проектом xcode.   -  person jpelletier    schedule 23.10.2014
comment
Да, @jpelletier, это проект xcode, созданный Unity, который затем создается через командную строку, мы никогда не открываем проект вручную.   -  person Tim    schedule 23.10.2014
comment
@PeterMetz Я упомянул ту же тему в своем исходном сообщении, однако, как указал jpelletier, для открытия проекта требуется ручное вмешательство, мы никогда этого не делаем.   -  person Tim    schedule 23.10.2014
comment
@ Тим, прости, мой плохой! Надо было внимательнее прочитать вопрос.   -  person Peter    schedule 25.10.2014


Ответы (6)


Если вы используете Jenkins с плагином XCode, вы можете изменить переменную 'Code Signing Resource Rules Path', добавив:

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

к

'Custom xcodebuild arguments' для плагина XCode.

Для этого исправления не требуется графический интерфейс XCode.

person nick    schedule 23.10.2014
comment
Спасибо, Ник. Это было слишком просто, не знаю, как я этого не заметил. Работал отлично! Я уверен, что сценарий @martinmose сработал бы, просто увидел это, прежде чем попробовать. Также для всех, кто использует Unity, у меня был третий вариант, который я собирался попробовать, используя их XcodeAPI. изменить его. - person Tim; 23.10.2014
comment
К сожалению, если вы используете Yosemite, вышеперечисленное устарело. См. stackoverflow. com/questions/26497863/ - person skitheo; 19.08.2015
comment
Работает, но не рекомендуется. См. ссылку на исправление: cutting.io/posts/ упаковка-приложений-ios-из-командной строки - person amir; 13.07.2016
comment
Это снова не работает в XCode 8.0. У кого-нибудь есть исправления для этого? - person C0D3; 19.09.2016
comment
Привет @ c0d3Junk13, удачи в интеграции с xcode 8, у меня похожая проблема. - person Burhan Mughal; 04.11.2016
comment
Привет @BurhanMughal, мы отключили автоматическую подпись кода на нашей машине сборки, которая находится на вкладке «Общие» проекта в Xcode 8. - person C0D3; 04.11.2016
comment
@ c0d3Junk13 Есть решение, но не то, которое вы предлагаете :) Я уже отключил автоматическую подпись. Но на самом деле нужно было вручную перейти к PackageApplication и удалить/комментировать строку ResourceRules.plist. В любом случае спасибо за ответ :) - person Burhan Mughal; 04.11.2016
comment
Ах, хорошо, рад, я был немного вне контекста, если честно. - person C0D3; 04.11.2016

Я столкнулся с той же проблемой. Решение 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, просто создайте небольшой хук Cordova, используя 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.'
person sidneys    schedule 25.10.2014
comment
Что бы это ни стоило, Cordova требует модуль xcode, так что он, скорее всего, у вас уже есть, хотя я тоже не фанат этого модуля. - person shortstuffsushi; 30.10.2014
comment
С вашим кодом вы увидите ошибку Bad arguments. Потому что вы используете синхронную функцию fs.appendFileSync с обратным вызовом. Чтобы использовать обратный вызов, используйте вместо него fs.appendFile. - person efusien; 02.12.2014
comment
Потрясающе спасибо! Это сработало для меня (редактирование файла build.xcconfig). Мне нужно было только внести одно незначительное изменение, удалив кавычки из $(SDKROOT)/ResourceRules.plist. - person jarbot; 05.12.2014
comment
У кого-нибудь работает исправление ошибки Cordova? Как и @jarbot, мне пришлось удалить кавычки из строки, которую Кордова добавила в файл build.xcconfig. - person Nick Spacek; 16.01.2015
comment
Решение @nick отлично сработало для нас, не требуя никаких дополнительных зависимостей. Я смущен тем, где npm или Cordova входят в вопрос, хотя… - person lagweezle; 02.02.2015

Если вы хотите по-настоящему сойти с ума, вы можете напрямую обновить 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, но запускаю все команды сборки из скрипта.

person Ben Flynn    schedule 05.11.2014
comment
Если кому интересно, это работает, даже если вы используете плагин Jenkins Xcode. - person kraftydevil; 24.11.2015
comment
Это дает предупреждение: --resource-rules устарел в Mac OS X ›= 10.10! - person Henrik Erlandsson; 30.11.2015

После выхода нового выпуска XCode 7 23 сентября 2015 года Apple начала отклонять любое приложение, использующее CODE_SIGN_RESOURCE_RULES_PATH, в результате чего сборка Jenkins автоматически отклонялась. Однако установка CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist в аргументах Custom xcodebuild приводит к сбою сборки.

Этот ответ решил проблему: https://stackoverflow.com/a/32762413/5373468

Это явно ошибка, которую Apple забыла исправить некоторое время назад, поскольку эта статья также подчеркивает: http://cutting.io/posts/packaging-ios-apps-from-the-command-line/

person Renaud Tilte    schedule 24.09.2015

У меня была ТОЧНО такая же проблема, как и у вас. Мы создаем наше приложение для iOS на Jenkins, поэтому мы не могли вручную установить «Путь к правилам ресурса подписи кода».

Я написал небольшой файл NodeJS, который делает всю работу за меня (см. код ниже).

В скрипте используется хороший пакет NodeJS с именем xcode, который помогает мне анализировать файл xcode.xcodeproj. .

Я не знаю, используете ли вы Cordova/Phonegap или что вы используете, но если вы используете, вы можете просто скопировать код и сделать хук Cordova. Если нет, я уверен, что вы можете выполнить файл из Дженкинса с небольшими изменениями.

В любом случае, я надеюсь, что этот скрипт поможет вам:

#!/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);
person martinmose    schedule 23.10.2014
comment
На самом деле мы используем Unity3D, все написано на C#. Я могу запустить сценарий постобработки после завершения сборки Unity. Это произойдет после создания проекта xcode, но до его компиляции в приложение. Я могу довольно легко изменить ваш скрипт nodejs на C# и просто запустить его после завершения сборки Unity. Я попробую, и если это сработает, отметьте ваш ответ. Спасибо за сценарий! - person Tim; 23.10.2014
comment
matinmose спасибо за скрипт! @ Тим, не мог бы ты опубликовать свой скрипт на С#, как только напишешь его, пожалуйста? - person Kaan Yy; 03.12.2014

Мы используем Unity + Jenkins для автоматической сборки.

Вы можете добиться этого с помощью сценариев постобработки cs; тем не мение; для быстрого (и грязного исправления) вы можете применить следующую команду 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
person Kaan Yy    schedule 03.12.2014