Xcode 9 在 Jenkins 自動打包腳本 中使用 Xcode integration 插件打包失敗的原因

問題

使用 Jenkins 來做 iOS 項目的持續集成,升級 Xcode 9 之後,編譯完成之後打包會一直報如下所示的錯誤:

error: exportArchive: "APPNAME.app" requires a provisioning profile with the Push Notifications feature.

Error Domain=IDEProvisioningErrorDomain Code=9 ""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.xcworkspaceworkspace {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

直接複製到指定路徑或者手動copy即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章