我最近遇到了一个奇怪的问题,项目可以编译,可以运行,但是就是在生成Archvie之后要对其进行sign and distribute时会报如下错误:

并且除此之外,没有其它信息; 我试过所有办法,比如重新生成证书、重建项目、重启IDE和电脑、甚至是移除项目中可疑的子项目的代码等等,但是都不管用。最后意外发现原来是由于bundle identifier包含大写字母导致的。。。 希望这个经验对你有用。

2018-04-04 后来的实践表面以上结论有误,我的项目又出问题了,至今没有找到症结;

2018-04-09

终于找到问题的原因了!!!! 首先这个问题的出现可能是由于我这个项目的特殊性导致的。我这个项目是一个基于Xamarin开发的输入法项目,项目是一个Xamarin.Form项目,结构大体如此:

其中IOSLib和SuiHanLib是我个人编写的两个类库,ThreeDiretion是Xamarin.Form项目,ThreeDiretion.iOS是Xamarin.iOS项目,ThreeDiretionKeyBoard是iOS Keyboard Extension扩展。

最开始,我只在ThreeDiretionKeyBoard中引用了IOSLib和SuiHanLib中的类型,项目的编写和运行一切顺利,但是在打包准备发布时,进行到sign and distrubte环节就总是出现上述图片中出现的问题,查看log给出的是一下信息:

Begining distribution, 2018/4/8 12:17:28
Channel: App Store
App Bundle Id: com.suihan.td, Version: 1.0.4
codesign -v -f -s "75BCAB46B9A6F6DDAE4CC293A6086F5C610749AB" "/var/folders/qc/5pggkbx565z7__bvx4fz6gsh0000gn/T/mdTmpDir1132857770/Payload/ThreeDiretion.iOS.app/PlugIns/ThreeDiretionKeyBoard.appex/Frameworks/Xamarin.Sdk.framework"
/var/folders/qc/5pggkbx565z7__bvx4fz6gsh0000gn/T/mdTmpDir1132857770/Payload/ThreeDiretion.iOS.app/PlugIns/ThreeDiretionKeyBoard.appex/Frameworks/Xamarin.Sdk.framework: bundle format unrecognized, invalid, or unsuitable
codesign exited with code 1
ERROR:Code signing failed.
Finshed

根据这个信息,我在网上搜索了很久,大部分都说问题与自行创建Resources文件夹有关,但是我实践并没有解决问题,为这个问题我折腾了很长时间,因为我的另一个项目:岁寒输入法项目并没有出现这个问题;

后来,想到有可能是iOS项目和Extension项目中包含的Xamarin.Sdk.framework不一致导致的,移除Extension中对IOSLib和SuiHanLib中类的引用后,签名通过!证明问题来自与对IOSLib和SuiHanLib的使用。

于是,我在iOS项目中也添加了对IOSLib和SuiHanLib的引用,但这还不行,还需要在项目中添加一个类继承IOSLib和SuiHanLib中的一个类(可能这样才能使得引用库真正的被打包进来吧),签名通过。

最后,这个问题并不是稳定出现的,换言之,此前我没有在iOS项目中引用那两个库的时候,签名也曾成功过,但是后来又莫名其妙地就不行了,我认为问题并不是我的配置有问题,而是Xamarin平台存在bug。