多Target环境下如何无需手动修改watchOS应用Info.plist中的WKCompanionAppBundleIdentifier?
无需手动修改watchOS应用Bundle ID匹配的解决方案
绝对能搞定这个重复手动操作的麻烦!作为iOS开发者,我们经常遇到这种多环境配置的问题,下面几个自动化方案你可以按需选择:
方案一:用Xcode自定义Build变量(最推荐)
这是最简洁且易维护的方式,核心是通过共享变量让watchApp自动继承主App的Bundle ID:
- 打开你的主App(myApp)的每个Target(UAT/PRD)的Build Settings,滚动到最底部,点击
+号添加一个User-Defined Setting,命名为COMPANION_APP_BUNDLE_ID。- 给UAT Target的这个变量赋值
co.company.myApp-UAT - 给PRD Target的这个变量赋值
co.company.myApp-PRD
- 给UAT Target的这个变量赋值
- 切换到myWatchApp的项目配置,打开它的
Info.plist文件,找到WKCompanionAppBundleIdentifier这一项,把值改成$(COMPANION_APP_BUNDLE_ID)。 - 最后确保myWatchApp的Target依赖对应的主App Target(在myWatchApp的General标签页的
Frameworks, Libraries, and Embedded Content里添加对应主App Target),这样Build时变量会自动传递过来。
方案二:多环境Info.plist文件替换
如果你的watchApp还有其他需要分环境配置的参数,这个方案更灵活:
- 给myWatchApp创建两个Info.plist文件,比如
Info-UAT.plist和Info-PRD.plist,分别在这两个文件里把WKCompanionAppBundleIdentifier设为对应的主App Bundle ID。 - 打开myWatchApp的Build Settings,找到
Info.plist File选项,点击旁边的箭头展开,为每个Build Configuration(比如UAT Debug/PRD Release)指定对应的plist文件。这样切换环境Build时,Xcode会自动用对应的plist文件。
方案三:Build时自动替换的Run Script
如果前两种方案不适合你的项目结构,可以用脚本在Build过程中自动修改plist:
- 打开myWatchApp的Target配置,切换到Build Phases标签,点击
+号选择New Run Script Phase,把这个Phase拖到Compile Sources之前。 - 在脚本输入框里粘贴以下代码(根据你的Target名称调整逻辑):
# 从主App Target获取Bundle ID(假设主App Target名称是myApp-UAT/myApp-PRD,watchApp是myWatchApp-UAT/myWatchApp-PRD) MAIN_APP_TARGET_NAME="${TARGET_NAME/WatchApp/}" COMPANION_BUNDLE_ID=$(xcodebuild -showBuildSettings -target "$MAIN_APP_TARGET_NAME" | grep -E "^ PRODUCT_BUNDLE_IDENTIFIER" | awk '{print $3}') # 替换watchApp Info.plist中的WKCompanionAppBundleIdentifier /usr/libexec/PlistBuddy -c "Set :WKCompanionAppBundleIdentifier $COMPANION_BUNDLE_ID" "${INFOPLIST_FILE}"
- 记得测试一下:切换不同Target Build,然后查看myWatchApp的产物里的Info.plist,确认值是否正确。
注意事项
- 不管用哪个方案,都要先切换Target/Build Configuration进行Build测试,确保最终的plist值正确匹配主App环境。
- 如果用自定义变量,若myWatchApp无法直接获取到主App的变量,可以在myWatchApp的Build Settings里也添加同名变量,然后通过
$(PRODUCT_BUNDLE_IDENTIFIER)或者主App的Target变量传递。
内容的提问来源于stack exchange,提问作者behrad
相关产品推荐
相关产品推荐

