iOS构建/ ipa创建不再适用于命令行

时间:2015-09-24 13:56:42

标签: ios xcode xcodebuild

概述

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

iTunesConnect已开始拒绝使用CODE_SIGN_RESOURCE_RULES_PATH构建设置的构建。

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

即使排除CODE_SIGN_RESOURCE_RULES_PATH构建设置,PackageApplication似乎也会使用resource-rules参数调用/ usr / bin / codesign

我怀疑PackageApplication需要更新,以便在排除CODE_SIGN_RESOURCE_RULES_PATH构建设置时,不会使用resource-rules参数调用/ usr / bin / codesign。

有没有人为此找到解决方案?

详情

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

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现在拒绝我们的构建,但出现以下错误:

  

"此捆绑包无效。 Info.plist包含无效密钥   ' CFBundleResourceSpecification'在捆绑myApp [myApp.app]"

如果我们从构建命令中删除'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist'位,那么应用程序是在没有CFBundleResourceSpecification plist键的情况下构建的(我认为这是我们想要的)。新的构建命令如下所示:

xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO 

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

  

错误:/ usr / bin / codesign --force   --preserved-metadata = identifier,entitlements,resource-rules --sign iPhone Distribution:MyTeam(XXXXXXXXXX)   --resource规则= /变种/文件夹/ 2B / 7hylk7nn13dgrl9yyh2wp0lm0000gn / T / zDRRJMkKtQ /有效载荷/ myApp.app / ResourceRules.plist   --entitlements / var / folders / 2b / 7hylk7nn13dgrl9yyh2wp0lm0000gn / T / zDRRJMkKtQ / entitlements_plistIUdGWLYe   /var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app   失败,错误1.输出:警告:使用--preserve-metadata   选项"资源规则" (在Mac OS X中不推荐使用> = 10.10)!

     

警告:在Mac OS X> = 10.10中已弃用--resource-rules!   /var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app/ResourceRules.plist:   无法读取资源

似乎PackageApplication使用resource-rules参数调用/ usr / bin / codesign,即使排除了CODE_SIGN_RESOURCE_RULES_PATH参数/构建设置。

我认为需要更新PackageApplication,以便在排除CODE_SIGN_RESOURCE_RULES_PATH参数/构建设置时,不会使用resource-rules参数调用/ usr / bin / codesign。

5 个答案:

答案 0 :(得分:103)

Apple通过解决方案回复了我。从Xcode 7开始,我们应该使用xcodebuild而不是PackageApplication来生成.ipa文件。

xcodebuild有一个新的-exportArchive选项来创建一个更像Xcode Organizer的.ipa。

所以我们现在应该:

  1. 使用xcodebuild archive
  2. 构建档案
  3. 使用xcodebuild -exportArchive
  4. 创建.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.idenifier</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> 
    

答案 1 :(得分:12)

制作iPA Usig终端的步骤

清洁项目:

版本

xcodebuild clean -project ProjectPath/myApp.xcodeproj -configuration  ReleaseAdhoc  -alltargets

调试

xcodebuild clean -project ProjectPath/myApp.xcodeproj -configuration Debug -alltargets

存档项目:

调试

xcodebuild archive -project  ProjectPath/myApp.xcodeproj  -scheme “myApp” -configuration Debug  -archivePath  pathForArchiveFolder/myApp.xcarchive

版本

xcodebuild archive -project  ProjectPath/myApp.xcodeproj  -scheme “myApp”  -archivePath  pathForArchiveFolder/myApp.xcarchive

导出IPA

旧版本:这可能会添加,修改或删除已签名的资源。错误

xcodebuild -exportArchive -archivePath  projectPath/myapp.xcarchive  -exportPath  projectPath/myApp.ipa  -exportFormat ipa  -exportProvisioningProfile  “provisioning profile”

新版本:

xcodebuild -exportArchive -archivePath  ProjectPath/myapp.xcarchive  -exportPath  projectPath/myApp.ipa  -exportOptionsPlist  ProjectFolder/exportPlist.plist

答案 2 :(得分:2)

如果您需要在构建过程中创建exportOptions.plist文件(可能是Jenkins),这里有一个快速提示。

您可以使用plutil工具将JSON转换为plist。例如:

echo "{\"method\":\"app-store\"}" | plutil -convert xml1 -o /tmp/exportOptions.plist -- -

享受!

答案 3 :(得分:1)

转到项目文件夹:

存档:

代表DEBUG:

xcrun xcodebuild -scheme MyApp -configuration Debug archive -archivePath build/MyApp.xcarchive

发布:

xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive

获取iPA:

xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/

答案 4 :(得分:0)

我创建了一个项目名称myFirstApp,项目的位置是Desktop / myFirstApp。 在Xcode 8.3

上进行了测试

第1步 -

cd /Users/Ved/Desktop/myFirstApp/

第2步 -

xcodebuild -scheme myFirstApp archive \

-archivePath /Users/Ved/Desktop/myFirstApp.xcarchive

第3步 -

xcodebuild -exportArchive -exportFormat ipa \

-archivePath "/Users/Ved/Desktop/myFirstApp.xcarchive" \

-exportPath "/Users/Ved/Desktop/myFirstApp.ipa" \

-exportProvisioningProfile "myFirstAppDevProfile"