使用msbuild为Xamarin iOS service extension签名的相关问题咨询
核心问题解答
Notification Service Extension 不需要单独调用 msbuild 命令构建,只要你的 iOS 主项目已经正确添加了扩展项目的引用,主项目构建时会自动触发扩展的构建并将其打包到最终的 IPA 包内。你遇到的「App integrity couldn't be verified」错误是因为 msbuild 传递签名参数时,默认不会自动应用到关联的扩展项目上,你本地手动分别签名主项目和扩展可以正常运行也验证了这一点。
现有脚本问题分析
你当前的构建脚本只给主项目指定了签名配置,扩展项目虽然在 csproj 里写了<CodesignKey>和<CodesignProvision>,但命令行传递的参数优先级高于 csproj 内的配置,且扩展项目不会自动继承主项目的命令行签名参数,导致扩展最终签名异常,包完整性校验失败。
修复方案
你需要在 msbuild 命令中显式为扩展项目也指定签名参数,修改后的构建命令示例如下,假设你的扩展项目名为Project.NotificationExtension.iOS:
msbuild /p:Configuration="Ad-Hoc" \ /p:Platform="iPhone" \ /p:IpaPackageDir="%env.PackageDirectory%" \ /p:CodesignKey="你的AdHoc签名证书名称" \ /p:CodesignProvision="主项目AdHoc描述文件名称" \ /p:ExtensionCodesignKey_Project.NotificationExtension.iOS="你的AdHoc签名证书名称" \ /p:ExtensionCodesignProvision_Project.NotificationExtension.iOS="扩展项目的AdHoc描述文件名称" \ /t:Build Project.iOS.sln
参数规则说明:
- 扩展签名参数的格式为
ExtensionCodesignKey_<扩展项目名称>和ExtensionCodesignProvision_<扩展项目名称>,项目名称要和你实际的扩展 csproj 文件名完全一致(不带.csproj后缀) - 需确保你的扩展项目的 Bundle ID 和主项目是同一组 ID 前缀,且扩展的描述文件的 Bundle ID 和扩展自身的 Bundle ID 完全匹配,描述文件也要包含所有测试设备的 UDID
验证方法
构建完成后可以手动解压 IPA 包,检查Payload/你的App.app/PlugIns目录下是否存在扩展的.appex文件,然后用命令行分别校验主 app 和扩展的签名:
codesign -vvvv Payload/你的App.app codesign -vvvv Payload/你的App.app/PlugIns/你的扩展.appex
两个命令都返回valid on disk和satisfies its Designated Requirement就说明签名正常。
内容的提问来源于stack exchange,提问作者Grounch
相关产品推荐
相关产品推荐

