iOS 构建/ipa 创建不再从命令行工作

原文 标签 ios xcode xcodebuild

概览

我们的命令行构建(构建和创建 .ipa)不再有效。

iTunesConnect 已开始拒绝使用 CODE_SIGN_RESOURCE_RULES_PATH 的版本。build设置。

如果我们在没有设置的情况下构建 PackageApplication 工具(我们用来创建签名的 .ipa)将失败。

似乎 PackageApplication 使用资源规则参数调用/usr/bin/codesign 即使 CODE_SIGN_RESOURCE_RULES_PATH排除了build设置

我怀疑 PackageApplication 需要更新,以便在 CODE_SIGN_RESOURCE_RULES_PATH 时它不会使用资源规则参数调用/usr/bin/codesign排除build设置。

有没有人找到解决方案?

详情

我们在命令行上构建我们的应用程序,如下所示:

xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist'

我们在命令行上创建签名的 .ipa,如下所示:
xcrun -log -sdk iphoneos PackageApplication "/Users/mpv/dev/myApp/build/AppStoreDistribution-iphoneos/myApp.app" -o "/Users/mpv/dev/myApp/build/AppStoreDistribution-iphoneos/myApp.ipa" -sign "iPhone Distribution: MyTeam (XXXXXXXXXX)" -embed /Users/mpv/Library/MobileDevice/Provisioning\ Profiles/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.mobileprovision

iTunesConnect 现在拒绝我们的构建并出现以下错误:

"This bundle is invalid. The Info.plist contains an invalid key 'CFBundleResourceSpecification' in bundle myApp [myApp.app]"



如果我们删除 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist'来自 build 命令的位然后应用程序是在没有 CFBundleResourceSpecification 的情况下构建的plist 键(我认为这是我们想要的)。新的构建命令如下所示:
xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO 

现在的问题是构建 .ipa 的命令失败并出现以下错误:

error: /usr/bin/codesign --force --preserve-metadata=identifier,entitlements,resource-rules --sign iPhone Distribution: MyTeam (XXXXXXXXXX) --resource-rules=/var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app/ResourceRules.plist --entitlements /var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/entitlements_plistIUdGWLYe /var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app failed with error 1. Output: Warning: usage of --preserve-metadata with option "resource-rules" (deprecated in Mac OS X >= 10.10)!

Warning: --resource-rules has been deprecated in Mac OS X >= 10.10! /var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app/ResourceRules.plist: cannot read resources



似乎 PackageApplication 使用资源规则参数调用/usr/bin/codesign 即使 CODE_SIGN_RESOURCE_RULES_PATH参数/build设置被排除在外。

我认为 PackageApplication 需要更新,以便在 CODE_SIGN_RESOURCE_RULES_PATH 时它不会使用资源规则参数调用/usr/bin/codesign参数/build设置被排除在外。

最佳答案

苹果给我一个解决方案。从 Xcode 7 开始,我们应该使用 xcodebuild而不是 PackageApplication生成 .ipa 文件。
xcodebuild 有一个新的 -exportArchive 选项来创建一个更像 Xcode Organizer 的 .ipa。
所以我们现在应该:

  • 使用 xcodebuild archive 建立文件
  • 使用 xcodebuild -exportArchive 创建 .ipa

  • 我们现在像这样构建文件:
    xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution archive -archivePath $PWD/build/myApp.xcarchive
    
    我们现在像这样导出 .ipa:
    xcodebuild -exportArchive -archivePath $PWD/build/myApp.xcarchive -exportOptionsPlist exportOptions.plist -exportPath $PWD/build
    
    这两个命令创建文件 build/myApp.xcarchivebuild/myApp.ipa请注意 xcodebuild -exportArchive需要 -exportOptionsPlist指向带有导出选项的 .plist 文件的参数。有关可以放入该 plist 的完整列表,请运行 xcodebuild -help .文件的最小内容如下所示:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>method</key>
        <string>app-store</string>
        <key>teamID</key>
        <string>YOUR_TEN_CHARACTER_TEAM_ID</string>
    </dict>
    </plist>
    
    在 Xcode 9 中,您现在必须在 exportOptions.plist 中指定更多详细信息,如下所示:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>compileBitcode</key>
      <false/>
      <key>method</key>
      <string>ad-hoc</string>
      <key>provisioningProfiles</key>
      <dict>
        <key>my.bundle.identifier</key>
        <string>My Provisioning Profile Name</string>
      </dict>
      <key>signingCertificate</key>
      <string>iPhone Distribution</string>
      <key>signingStyle</key>
      <string>manual</string>
      <key>stripSwiftSymbols</key>
      <true/>
      <key>teamID</key>
      <string>YOURTEAMID</string>
      <key>thinning</key>
      <string>&lt;none&gt;</string>
    </dict>
    </plist> 
    

    关于iOS 构建/ipa 创建不再从命令行工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32763288/

    相关文章:

    ios - 非UI更新功能,例如读取get属性,是否需要在主线程中执行

    ios - Xcode 命令行测试执行问题

    ios - 项目在 XCode 中编译,但 XCodeBuild 产生错误 "No architectures ..."

    ios - Ionic 无法在我的 iPhone 上运行我的应用程序

    ios - 使用第三方服务推送通知的传递速度快吗?

    ios - 如何从tableView方法中的请求中获取行数?

    ios - 无法将自定义参数添加到Firebase动态链接

    xcode - 如何在界面生成器上看到笛卡尔平面?

    ios - 我的 UITableView 中加载的 UITableViewCell 不能超过 40 个

    IOS:用于区域格式意大利的 NSDateFormatter