前言
在你的iOS
团队中,如果在使用持续集成来完成自动化打包分发的工作,你可能会了解如何使用一些命令行工具来构建ipa
文件,其中一款使用较为广泛的是xcodebuild
。
在我们的团队中有部分打包工作就是使用的xcodebuild
,脚本代码大概如下:
ipaName = "${scheme}${buildConfiguration}"
// archive
xcodebuild -workspace ProjectName.xcworkspace -scheme ${scheme} -configuration ${buildConfiguration} clean archive -archivePath ./${ipaName}.xcarchive
// export
xcodebuild -exportArchive -archivePath ${ipaName}.xcarchive -exportOptionsPlist exportOptions_dev.plist -exportPath ./
exportOptions_dev文件如下:
<?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>development</string>
<key>teamID</key>
<string>yourTeamID</string>
</dict>
</plist>
以上配置在Xcode8
及以下版本都可以正常运行的,在升级Xcode9
以后上面的脚本会在export
阶段出错。
一、现象
- xcodebuild + Xcode9
使用xcodebuild
做打包构建时,执行exportArchive
命令出错,错误信息:
error: exportArchive: "AppName.app" requires a provisioning profile with the Push Notifications and App Groups features.
Error Domain=IDEProvisioningErrorDomain Code=9
"AppName.app" requires a provisioning profile with the Push Notifications and App Groups features." UserInfo={NSLocalizedDescription="AppName.app" requires a provisioning profile with the Push Notifications and App Groups features., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
// 或
"Error Domain=IDEProvisioningErrorDomain Code=9 \"\"ios-simple-objc.app\" requires a provisioning profile.\"
UserInfo={NSLocalizedDescription=\"ios-simple-objc.app\" requires a provisioning profile., NSLocalizedRecoverySuggestion=Add a profile to the \"provisioningProfiles\" dictionary in your Export Options property list.}"
二、原因
Xcode9 的打包需要指定以下信息,才能完成export
操作:
- provisioningProfiles
- compileBitcode
- method
- signingCertificate
- signingStyle
- stripSwiftSymbols
- teamID
- thinning
三、解决步骤
你需要使用Xcode9
先手动构建一次,使用构建生成的plist
配置就可以完成export
操作。
-
使用
Xcode9
打开你的工程
-
执行打包操作:Product -> Archive
打包完成后执行
export
操作(其中会需要你手动选择你的相关provison profile
等信息),Xcode9
会自动生成exportOptionsPlist
文件,同时拷贝到你生成的ipa
包的同级目录下。
- 直接使用
Xcode9
自动生成的exportOptionsPlist
文件来进行xcodebuild
的export
操作,或者拷贝文件内容到你原来的exportOptionsPlist
文件。
// Xcode9 export 生成的文件
DistributionSummary.plist
ExportOptions.plist
AppName.ipa
Packaging.log
四、示例
<?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>
<true/>
<key>method</key>
<string>development</string>
<key>provisioningProfiles</key>
<dict>
<key>com.xingshulin.abc</key>
<string>abc_dev</string>
<key>com.xingshulin.abc.NotificationServiceExtension</key>
<string>abc-Notification-dev</string>
</dict>
<key>signingCertificate</key>
<string>iPhone Developer</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>