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

后端 未结 6 1790
谎友^
谎友^ 2020-12-14 05:21

We are having the same issue found here, here, here and here

Basically we upgraded to xcode 6.1 and our build are getting the \"ResourceRules.plist: cannot read reso

相关标签:
6条回答
  • 2020-12-14 06:01

    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.

    0 讨论(0)
  • 2020-12-14 06:01

    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.'
    
    0 讨论(0)
  • 2020-12-14 06:03

    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.

    0 讨论(0)
  • 2020-12-14 06:13

    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/

    0 讨论(0)
  • 2020-12-14 06:23

    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
    
    0 讨论(0)
  • 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);
    
    0 讨论(0)
提交回复
热议问题