如何在InfoPlist.strings中读取XCConfig配置的PRODUCT_NAME变量
默认Xcode不会自动解析InfoPlist.strings文件内的构建变量占位符,只有Info.plist本身的变量默认会被编译展开,多构建目标场景下由于各目标的PRODUCT_NAME定义在独立XCConfig中,更难直接被strings文件读取,可通过以下三种方案解决:
方案1:开启Info.plist变量展开编译选项
打开项目构建设置,搜索Other Info.plist Preprocessor Flags,添加参数-traditional;再搜索Expand Build Settings in Info.plist Files,确保所有构建目标的该选项都设置为YES。配置完成后Xcode编译时会自动把InfoPlist.strings里的$(PRODUCT_NAME)替换为当前构建目标对应的值。
注意:如果strings文件包含中文或特殊字符,添加-traditional参数后要确保所有strings文件的编码统一为UTF-16,避免编译报错
对应权限文案的中文翻译可写为:NSCameraUsageDescription = "$(PRODUCT_NAME)需要使用相机来拍摄照片";方案2:按构建目标拆分InfoPlist.strings副本
为每个构建目标单独创建对应语言的InfoPlist.strings文件,在每个文件中直接写死对应目标的应用名,不需要使用变量。比如development目标的对应strings文件里直接写NSCameraUsageDescription = "开发版应用需要使用相机来拍摄照片";,AdHoc版本写测试版相关文案,production写正式版文案。该方式无需修改编译参数,稳定性更高,适合多目标差异文案较多的场景。方案3:自定义编译脚本替换变量
在Xcode构建阶段新增一个Run Script阶段,放在Copy Bundle Resources之前,脚本读取当前构建目标的PRODUCT_NAME环境变量,遍历所有InfoPlist.strings文件,将占位符批量替换为实际应用名。参考脚本示例:PRODUCT_NAME_VALUE="${PRODUCT_NAME}" find "${SRCROOT}" -name "InfoPlist.strings" -exec sed -i '' "s/\$(PRODUCT_NAME)/${PRODUCT_NAME_VALUE}/g" {} \;注意:如果是CI/CD环境或使用非macOS设备编译,需要调整sed命令的参数适配对应系统
内容的提问来源于stack exchange,提问作者Chirag Shah

