如何使用xcrun为含扩展的iOS应用指定配置文件并签名?
处理带App Extension的Jenkins打包配置问题
其实你原来用的PackageApplication命令已经被Apple弃用啦,尤其是打包包含App Extension的应用时,这个工具没法很好地处理多个Target的配置文件关联,很容易出现签名错误。现在官方推荐用xcodebuild的归档+导出流程,这才是适配扩展应用的正确姿势,具体步骤如下:
第一步:归档应用(Archive)
这一步需要为主应用和每个App Extension分别指定对应的Provisioning Profile。假设你的主应用Target叫MainApp,扩展Target叫MainAppExtension,命令示例如下:
xcodebuild archive \ -workspace "${WORKSPACE_NAME}.xcworkspace" \ # 如果用的是project,换成-project "${PROJECT_NAME}.xcodeproj" -scheme "${SCHEME_NAME}" \ -configuration Release \ -archivePath "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.xcarchive" \ # 主应用的配置文件(用名称或UUID都可以,名称更直观) PROVISIONING_PROFILE_SPECIFIER="${MAIN_APP_PROFILE_NAME}" \ # 扩展Target的配置文件,格式是「扩展Target名_PROVISIONING_PROFILE_SPECIFIER」 MainAppExtension_PROVISIONING_PROFILE_SPECIFIER="${EXTENSION_PROFILE_NAME}"
注意:把
MainAppExtension换成你实际的扩展Target名称,MAIN_APP_PROFILE_NAME和EXTENSION_PROFILE_NAME换成对应的配置文件名称(要确保构建机器上已经安装了这些配置文件)。
第二步:导出IPA包(Export Archive)
这一步需要用一个exportOptions.plist文件来配置签名规则,这个文件可以清晰地指定主应用和扩展各自的配置文件,避免混乱。
先创建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> <!-- 导出方式:app-store/ad-hoc/enterprise/development,根据你的需求选择 --> <key>method</key> <string>ad-hoc</string> <!-- 手动签名模式,因为我们要指定自定义配置文件 --> <key>signingStyle</key> <string>manual</string> <!-- 配置主应用和扩展的bundle ID与对应配置文件的映射 --> <key>provisioningProfiles</key> <dict> <key>com.yourcompany.mainapp</key> <string>主应用配置文件名称</string> <key>com.yourcompany.mainapp.extension</key> <string>扩展配置文件名称</string> </dict> </dict> </plist>
执行导出命令
xcodebuild -exportArchive \ -archivePath "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.xcarchive" \ -exportPath "${BUILD_HISTORY_DIR}" \ # IPA会导出到这个目录下 -exportOptionsPlist "${WORKSPACE_DIR}/exportOptions.plist" # 替换成你的plist文件路径
额外注意事项
- 确保主应用和扩展的Bundle ID都包含在各自的Provisioning Profile中,且配置文件的类型(比如Ad Hoc、App Store)一致
- 如果不想用plist文件,也可以在导出命令里直接通过
-exportProvisioningProfile参数指定,但对于多Target的情况,plist的方式更清晰不易出错 - 在Jenkins中,你可以把这些命令放到「Execute Shell」步骤里,替换掉对应的变量(比如
${WORKSPACE_NAME}可以直接用Jenkins内置的${WORKSPACE}变量来适配)
内容的提问来源于stack exchange,提问作者Legolas
相关产品推荐
相关产品推荐

