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即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是创建依赖 CocoaPods 的 Xcode 模板工程并自动打包脚本: ```bash #!/bin/bash # 工程名称 PROJECT_NAME="MyApp" # 模板文件夹路径 TEMPLATE_DIR_PATH="./Templates" # 模板文件夹名称 TEMPLATE_DIR_NAME="iOS App.xctemplate" # 文件夹路径 FILE_PATH="./${PROJECT_NAME}" # 导出 ipa 的路径 EXPORT_PATH="./${PROJECT_NAME}_IPA" # 创建项目文件夹 mkdir -p "${FILE_PATH}" # 复制模板到项目文件夹 cp -R "${TEMPLATE_DIR_PATH}/${TEMPLATE_DIR_NAME}" "${FILE_PATH}" # 重命名模板文件夹 mv "${FILE_PATH}/${TEMPLATE_DIR_NAME}" "${FILE_PATH}/${PROJECT_NAME}.xctemplate" # 创建临时目录 TMP_DIR=$(mktemp -d) cd "${TMP_DIR}" # 创建 Podfile echo "platform :ios, '9.0'" >> Podfile echo "use_frameworks!" >> Podfile echo "target '${PROJECT_NAME}' do" >> Podfile echo " pod 'Alamofire'" >> Podfile echo "end" >> Podfile # 安装依赖 pod install # 复制 Podfile 和 Pods 文件夹到模板工程 cp -R Podfile "${FILE_PATH}/${PROJECT_NAME}.xctemplate" cp -R Pods "${FILE_PATH}/${PROJECT_NAME}.xctemplate" # 替换模板的名称 sed -i '' "s/\${PRODUCT_NAME}/${PROJECT_NAME}/g" "${FILE_PATH}/${PROJECT_NAME}.xctemplate/___FILEBASENAME___.swift" # 删除临时目录 rm -rf "${TMP_DIR}" # 打包 ipa xcodebuild clean archive -workspace "${FILE_PATH}/${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -archivePath "${EXPORT_PATH}/${PROJECT_NAME}.xcarchive" -configuration Release -quiet CODE_SIGN_STYLE=Manual CODE_SIGN_IDENTITY="iPhone Distribution: Your Company Name (XXXXXXXXXX)" PROVISIONING_PROFILE_SPECIFIER="Your Provisioning Profile Name" xcodebuild -exportArchive -archivePath "${EXPORT_PATH}/${PROJECT_NAME}.xcarchive" -exportOptionsPlist "ExportOptions.plist" -exportPath "${EXPORT_PATH}" -quiet # 删除 xcarchive 文件 rm -rf "${EXPORT_PATH}/${PROJECT_NAME}.xcarchive" echo "Done!" ``` 你需要将以上脚本复制到一个名为 `create_pod_template_and_package.sh` 的文件,并在终端运行以下命令: ```bash chmod +x create_pod_template_and_package.sh ./create_pod_template_and_package.sh ``` 这将创建一个名为 `MyApp` 的文件夹,其包含一个名为 `MyApp.xctemplate` 的 iOS 应用程序模板,该模板包含了一个依赖 CocoaPods 的 Alamofire 库。然后,脚本使用 Xcode 打包 `MyApp` 并将其导出为 ipa 文件,最终将 ipa 文件保存在 `MyApp_IPA` 文件夹。请注意,你需要根据自己的证书和配置文件更新脚本的代码签名信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值