問題
使用 Jenkins 來做 iOS 項目的持續內建,更新 Xcode 9 之後,編譯完成之後打包會一直報如下所示的錯誤:
error: exportArchive: "APPNAME.app" requires a provisioning profile with the Push Notifications feature.
Error Domain=IDEProvisioningErrorDomain Code= ""APPNAME.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="APPNAME.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
Failed to build /Users/Tolecen/.jenkins/workspace/APPNAME/build/APPNAME_release.ipa
Build step 'Xcode' marked build as failure
Finished: FAILURE
原因
因為 Xcode 9 預設不允許通路鑰匙串的内容,必須要設定 allowProvisioningUpdates 才會允許,但是由于 Xcode integration 插件封閉,并不能對其進行修改加上這個屬性,是以決定使用 Shell 腳本代替插件
解決方案
将 Jenkins 項目裡的 Xcode integration 建構步驟去掉,使用下面所示的指令:
如果是 project 的項目,那就将下面第一段的指令中 -workspace PROJECTNAME.xcworkspace修改為−workspace {PROJECT_NAME}.xcodeproj 即可。
# clean
echo "================= Clean一下 ================="
xcodebuild clean -workspace ${PROJECT_NAME}.xcworkspace \
-configuration ${CONFIGURATION} \
-target ${CURRENT_SHEME} \
#-alltargets
echo "================= Clean一下 Over ================="
# archive
echo "============== archive =================="
xcodebuild archive -workspace ${PROJECT_NAME}.xcworkspace \
-scheme ${CURRENT_SHEME} \
-configuration ${CONFIGURATION} \
CFBundleVersion=${BOUNDLE_VERSION} \
-destination generic/platform=ios \
-archivePath build/${CURRENT_SHEME}.xcarchive \
CODE_SIGN_IDENTITY="${__signingIdentity}"
# export ipa
echo "+++++++++++++++++ exportArchive +++++++++++++++++"
xcodebuild -exportArchive -archivePath build/${CURRENT_SHEME}.xcarchive \
-exportPath build/${CURRENT_SHEME}\
-destination generic/platform=ios\
-exportOptionsPlist ${ExportOptionsPlistPath}\
-allowProvisioningUpdates
注意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>enterprise</string>
<key>provisioningProfiles</key>
<dict>
<key>com.houmanager.enterprise.test</key>
<string>com.houmanager.enterprise.test</string>
</dict>
<key>signingCertificate</key>
<string>iPhone Distribution</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>5XXXXXXXXXXXHM</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
如果不知道怎麼填寫,手動用Xcode9打包,導出檔案中會有
ExportOptions.plist
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauETYh1mMwYWNwMja3BHc0cmN0U2amFTesNGVmtEd2ADMvwVZnJXYs9CXuNmLn1Wah5Waz5yMzd3Lc9CX6MHc0RHaiojIsJye.jpg)
直接複制到指定路徑或者手動copy即可。