How do we manually fix “ResourceRules.plist: cannot read resources” error after xcode 6.1 upgrade?

↘锁芯ラ 提交于 2019-11-28 20:03:19
nick

If you're using Jenkins with the XCode plugin, you can modify the 'Code Signing Resource Rules Path' variable by adding:

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

to the

'Custom xcodebuild arguments' setting for the XCode plugin.

This fix does not require the XCode GUI.

sidneys

I encountered the same problem. Nicks solution does work, but is requiring additional dependencies. You don't need the heavy-handed npm xcode module for this. Just add a line to this file: $PROJECT_ROOT/platforms/ios/cordova/build.xcconfig

CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist

Note that before XCode 6.1.1, this needed to be specified as "$(SDKROOT)/ResourceRules.plist" (notice the quotes).

If you are running this inside automated build systems such as Jenkins and wont't/can't use any XCode GUI, just create a small Cordova hook, leveraging npm's fs.appendFile, at this location: $PROJECT_ROOT/hooks/before_build/ios_resourcerules.js (make sure it has 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.');
});

This will might be merged in an upcoming Cordova release, so the hook will become unnecessary (i'm creating a see this PR for Cordova-iOS).

In case the above JavaScript snippet fails to execute due to a "wrong argument" failure, replace the file's content as follows:

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

If you want to get really crazy, you can directly update 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");

I was already hacking this script to accept a keychain arg, so it made sense for me. Note I'm not using the Xcode Jenkins plugin -- I'm using Jenkins but running all the build commands from a script.

Renaud Tilte

After the new release of XCode 7 on 23rd Sept 2015, Apple started rejecting any application that is using CODE_SIGN_RESOURCE_RULES_PATH, making the Jenkins build automatically rejected. However, setting CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist into the Custom xcodebuild arguments causes a build failure.

This answer resolved the issue: https://stackoverflow.com/a/32762413/5373468

This is clearly a bug that Apple forgot to fix a while ago, as this article is also highlighting: http://cutting.io/posts/packaging-ios-apps-from-the-command-line/

I had EXACTLY the same problem, as you have. We are building our iOS app on Jenkins, so we couldn't manually set "Code Signing Resource Rules Path".

I have wrote a small NodeJS file which does the job for me (see the code below).

The script use a nice NodeJS package called xcode which helps me with the parsing of the xcode.xcodeproj file.

I don't know if you are using Cordova/Phonegap or what you are using, but if you are can just copy the code and make a Cordova hook. If not I'm sure you can execute the file from Jenkins, with some small changes.

Anyways, I hope this script will help you:

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

We are using Unity + Jenkins for auto builds.

You can achieve with post process cs scripts; however; for quick (and dirty fix) you can apply following bash command after Unity but before 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!