web-dev-qa-db-fra.com

Comment corriger manuellement l'erreur "ResourceRules.plist: impossible de lire les ressources" après la mise à niveau de xcode 6.1?

Nous avons le même problème trouvé ici , ici , ici et ici

Fondamentalement, nous avons mis à niveau vers xcode 6.1 et notre build obtient l'erreur "ResourceRules.plist: impossible de lire les ressources".

Nous avons un serveur Jenkins qui fait nos builds ios pour nous. Nous utilisons plugin Xcode sur Jenkins pour faire la construction et la signature. Toute réflexion sur la façon dont nous pouvons effectuer cette modification sans ouvrir manuellement xcode et faire cette solution trouvée sur les autres réponses:

Cliquez sur votre projet> Cibles> Sélectionnez votre cible> Paramètres de construction>

Chemin des règles de ressource de signature de code

et ajouter :

$ (SDKROOT) /ResourceRules.plist

Je suis très nouveau sur Xcode et iOS build en général. J'ai trouvé le fichier project.pbxproj dans le fichier Unity-iPhone.xcodeproj. Il semble que cela contienne les paramètres de construction sous la section /* Begin XCBuildConfiguration */ il répertorie ce qui ressemble à des propriétés de construction similaires trouvées dans Xcode, mais je le fais ne voit rien comme "Chemin de règles de ressources de signature de code".

Quelqu'un a-t-il de l'expérience dans l'édition manuelle de ce fichier? Est-ce une mauvaise idée en général?

Merci

49
Tim

Si vous utilisez Jenkins avec le plugin XCode, vous pouvez modifier le 'Code Signing Resource Rules Path' variable en ajoutant:

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

au

'Custom xcodebuild arguments' paramètre pour le plugin XCode.

Ce correctif ne nécessite pas l'interface graphique XCode.

65
nick

J'ai rencontré le même problème. La solution Nicks fonctionne, mais nécessite des dépendances supplémentaires. Vous n'avez pas besoin du module lourd npm xcode pour cela. Ajoutez simplement une ligne à ce fichier: $ PROJECT_ROOT/plates-formes/ios/cordova/build.xcconfig

CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist

Notez qu'avant XCode 6.1.1, cela devait être spécifié comme "$(SDKROOT)/ResourceRules.plist" (notez les guillemets).

Si vous exécutez cela dans des systèmes de construction automatisés tels que Jenkins et que vous ne voulez/ne pouvez pas utiliser d'interface graphique XCode, créez simplement un petit crochet Cordova, en tirant parti des npm fs.appendFile , à cet emplacement: $ PROJECT_ROOT/hooks/before_build/ios_resourcerules.js (assurez-vous qu'il a 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.');
});

Cette volonté pourrait être fusionné dans une prochaine version de Cordova, de sorte que le crochet deviendra inutile (je crée un voir ce PR pour Cordova-iOS ).

Dans le cas où l'extrait de code JavaScript ci-dessus ne s'exécute pas en raison d'un échec de "mauvais argument", remplacez le contenu du fichier comme suit:

#!/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

Si vous voulez devenir vraiment fou, vous pouvez directement mettre à jour 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");

Je piratais déjà ce script pour accepter un argument de trousseau, donc cela avait du sens pour moi. Remarque Je n'utilise pas le plugin Xcode Jenkins - j'utilise Jenkins mais j'exécute toutes les commandes de construction à partir d'un script.

5
Ben Flynn

Après la nouvelle version de XCode 7 le 23 septembre 2015, Apple a commencé à rejeter toute application utilisant CODE_SIGN_RESOURCE_RULES_PATH, Ce qui a automatiquement rejeté la génération Jenkins. Cependant, la définition de la fonction CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist dans les arguments xcodebuild personnalisés entraîne un échec de génération.

Cette réponse a résolu le problème: https://stackoverflow.com/a/32762413/5373468

Il s'agit clairement d'un bug qui Apple a oublié de corriger il y a un certain temps, car cet article met également en évidence: http://cutting.io/posts/packaging-ios-apps- à partir de la ligne de commande /

4
Renaud Tilte

Nous utilisons Unity + Jenkins pour les builds automatiques.

Vous pouvez réaliser avec des scripts cs post-processus; toutefois; pour un correctif rapide (et correctif), vous pouvez appliquer la commande bash suivante après Unity mais avant 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
1
Kaan Yy

J'ai eu exactement le même problème que vous. Nous construisons notre application iOS sur Jenkins, nous n'avons donc pas pu définir manuellement le "Chemin des règles des ressources de signature de code".

J'ai écrit un petit fichier NodeJS qui fait le travail pour moi (voir le code ci-dessous) .

Le script utilise un package Nice NodeJS appelé xcode qui m'aide à analyser le fichier xcode.xcodeproj.

Je ne sais pas si vous utilisez Cordova/Phonegap ou ce que vous utilisez, mais si vous l'êtes, copiez simplement le code et faites un crochet Cordova. Sinon, je suis sûr que vous pouvez exécuter le fichier à partir de Jenkins, avec quelques petites modifications.

Quoi qu'il en soit, j'espère que ce script vous aidera:

#!/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