Comment corriger manuellement une 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 version reçoit l’erreur “ResourceRules.plist: impossible de lire les ressources”.

Nous avons un serveur Jenkins que notre ios construit pour nous. Nous utilisons le plugin Xcode sur Jenkins pour effectuer la construction et la signature. Des reflections sur la façon dont nous pouvons effectuer ce changement sans ouvrir manuellement xcode et faire cette solution 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 append :

$ (SDKROOT) /ResourceRules.plist

Je suis très nouveau sur Xcode et iOS en général. J’ai trouvé le fichier project.pbxproj dans le fichier Unity-iPhone.xcodeproj. Il semble que cela contienne les parameters de construction sous la section / * Begin XCBuildConfiguration * / section il répertorie ce qui ressemble à des propriétés de construction similaires trouvées dans Xcode, mais je ne vois rien comme “Code Signing Resource Rules Path”.

Quelqu’un a-t-il déjà modifié manuellement ce fichier? Est-ce une mauvaise idée en général?

Merci

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

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

au

'Custom xcodebuild arguments' pour le plug-in XCode.

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

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

 CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist 

Notez qu’avant XCode 6.1.1, il fallait spécifier "$(SDKROOT)/ResourceRules.plist" (notez les guillemets).

Si vous utilisez ceci dans des systèmes de génération automatisés tels que Jenkins et que vous ne pouvez / ne pouvez pas utiliser d’interface graphique XCode, créez simplement un petit crochet Cordova, en utilisant fs.appendFile de npm, à 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.'); }); 

Ce sera peut- être fusionné dans une prochaine version de Cordova, de sorte que le hook deviendra inutile ( je crée un see this PR pour Cordova-iOS ).

Si l’extrait de code JavaScript ci-dessus ne parvient pas à s’exécuter 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.' 

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"); 

J’étais déjà en train de pirater ce script pour accepter un argument de trousseau, alors c’était logique pour moi. Note Je n’utilise pas le plugin Xcode Jenkins – J’utilise Jenkins mais j’exécute toutes les commandes de build à partir d’un script.

Après la nouvelle version de XCode 7 du 23 septembre 2015, Apple a commencé à rejeter toute application utilisant CODE_SIGN_RESOURCE_RULES_PATH , ce qui a automatiquement rejeté la version de Jenkins. Toutefois, la définition de 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

C’est clairement un bogue que Apple a oublié de corriger il y a quelque temps, comme le souligne également cet article: http://cutting.io/posts/packaging-ios-apps-from-the-command-line/

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 de 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 joli paquet NodeJS appelé xcode qui m’aide à parsingr le fichier xcode.xcodeproj.

Je ne sais pas si vous utilisez Cordova / Phonegap ou ce que vous utilisez, mais si vous le pouvez, copiez simplement le code et créez un crochet Cordova. Sinon, je suis sûr que vous pouvez exécuter le fichier depuis Jenkins, avec quelques modifications mineures.

En tout cas, 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 /([\s\S]*)<\/name>/mi.exec(content)[1].sortingm(); } 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.ssortingngify(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); 

Nous utilisons Unity + Jenkins pour les constructions automatiques.

Vous pouvez réaliser avec des scripts de post-traitement cs; toutefois; pour rapide (et correctif sale), 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