iOS builds / ipa creation 不再适用于命令行
iOS builds / ipa creation no longer works from the command line
概览
我们的命令行构建(构建和创建 .ipa)不再有效。
iTunesConnect 已开始拒绝使用 CODE_SIGN_RESOURCE_RULES_PATH
构建设置的构建。
如果我们构建时没有设置 PackageApplication 工具(我们用来创建签名的 .ipa)失败。
似乎 PackageApplication 使用资源规则参数调用 /usr/bin/codesign,即使 CODE_SIGN_RESOURCE_RULES_PATH
构建设置被排除
我怀疑 PackageApplication 需要更新,以便在排除 CODE_SIGN_RESOURCE_RULES_PATH
构建设置时,它不会使用资源规则参数调用 /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 现在拒绝我们的构建并出现以下错误:
"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'
位,那么应用程序将在没有 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
参数/构建设置。
我认为 PackageApplication 需要更新,以便在排除 CODE_SIGN_RESOURCE_RULES_PATH
参数/构建设置时,它不会使用资源规则参数调用 /usr/bin/codesign。
Apple 回复了我一个解决方案。从 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.xcarchive
和 build/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><none></string>
</dict>
</plist>
转到项目文件夹:
存档:
对于调试:
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/
制作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
如果您需要在构建过程中创建 exportOptions.plist 文件(可能是 Jenkins),这里有一个快速提示。
您可以使用 plutil
工具将 JSON 转换为 plist。示例:
echo "{\"method\":\"app-store\"}" | plutil -convert xml1 -o /tmp/exportOptions.plist -- -
尽情享受吧!
我创建了一个项目名称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"
概览
我们的命令行构建(构建和创建 .ipa)不再有效。
iTunesConnect 已开始拒绝使用 CODE_SIGN_RESOURCE_RULES_PATH
构建设置的构建。
如果我们构建时没有设置 PackageApplication 工具(我们用来创建签名的 .ipa)失败。
似乎 PackageApplication 使用资源规则参数调用 /usr/bin/codesign,即使 CODE_SIGN_RESOURCE_RULES_PATH
构建设置被排除
我怀疑 PackageApplication 需要更新,以便在排除 CODE_SIGN_RESOURCE_RULES_PATH
构建设置时,它不会使用资源规则参数调用 /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 现在拒绝我们的构建并出现以下错误:
"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'
位,那么应用程序将在没有 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
参数/构建设置。
我认为 PackageApplication 需要更新,以便在排除 CODE_SIGN_RESOURCE_RULES_PATH
参数/构建设置时,它不会使用资源规则参数调用 /usr/bin/codesign。
Apple 回复了我一个解决方案。从 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.xcarchive
和 build/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><none></string>
</dict>
</plist>
转到项目文件夹:
存档:
对于调试:
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/
制作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
如果您需要在构建过程中创建 exportOptions.plist 文件(可能是 Jenkins),这里有一个快速提示。
您可以使用 plutil
工具将 JSON 转换为 plist。示例:
echo "{\"method\":\"app-store\"}" | plutil -convert xml1 -o /tmp/exportOptions.plist -- -
尽情享受吧!
我创建了一个项目名称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"