iOS开发-真机调试遇到“The executable was signed with invalid entitlements.”

昨天遇到了一个让人绝望的问题。。。事情是这样的。。

昨天高高兴兴的完成了新的版本的开发,老大说有了新的Apple账号,需要用新的账号提交App Store,于是登上了新的AppleID,然后创建证书,创建ID,Apple Connect上创建应用,一气呵成,把证书下载下来配置一下,cmd+R,应用顺利的跑起来了,然后打包,上传TestFlight,也是非常顺利,也成功的发布到了TestFlight,然后测试那边报了一个bug给我,一看不是什么大问题么,改好之后用模拟器测试,OK没问题,想想再用真机调试一下吧,于是接上了测试机,cmd+R,然后去接杯水,等着回来看看真机上有没有什么问题,结果接完水回来。。。并不是期待的需要解锁的alert,而是。。。

logo
1
2
3
The executable was signed with invalid entitlements.
Profile The entitlements specified in your application’s Code Signing Entitlements file are invalid, not permitted, or do not match those specified in your provisioning profile. (0xE8008016).

看来来好像是Provisioning Profile(pp)的问题,仔细检查了一下,好像没有什么问题么??不过这个问题看着好像不是什么大问题,结果耗费了我一天多的时间。。。所以准备写下来记录一下。

可能出现问题的原因

出现这个报错的原因一般来说是远程Provisioning Profile(以下简称PP)和本地的配置不同造成的问题,细看下来可能有这么几种可能:

  • 1.PP文件和Capability配置不匹配;
  • 2.PP文件和本地证书不匹配;
  • 3.跑应用时Debug和Release选择错误;
  • 4.PP文件中没有包含当前要运行设备的UUID;
  • 5.Xcode10中Build System问题(这个好像最新的Xcode已经修复了);
  • 6.项目中多个Targets的证书选择错误(我就是这个问题);

另外Apple官方也有针对Entitlements出错时的检查方案,地址在这里Entitlements Troubleshooting

解决方案

OK,大概了解了情况,那就一个一个来检查修改吧。

对了,先po一个查看Provisioning Profile信息的 shell:

1
/usr/bin/security cms -D -i profile_path/profileName.mobileprovision"

置空Code Signing Entitlements

这个是google和stackoverflow上能搜到比较多的答案,具体的操作为将如下步骤下打开的选项设置为空:

Project -> Target -> 项目名称 -> Build Settings -> Code Signing Entitlements

logo

然而这个方法并没有对我有什么帮助。

清空xxx.entitlements文件

这个方法实际上和上一个方法的操作差不多,具体步骤为:

在项目目录下找到xxx(项目名).entitlements文件,并删除这个文件中的全部字段。

其实这个方法应该跟上一个方法差别不大,对我也并没有什么帮助。

重新开启Capabilities中的选项

这个方法其实是让Xcode自动来配置xxx.entitlements中的字段,具体步骤就是:

Project -> Target -> 项目名称 -> Capabilities -> 找到已经打开的配置,关闭再打开

结果同样令人悲伤,并没有什么作用。。。

重新配置Apple Developler中的PP文件并下载

这时候我有点崩溃了。。。我以为是之前创建开发证书的时候出了什么问题,因为可以正常上传到Apple Connect,所以发布证书应该没有什么问题,但是索性我还是把所有的证书和PP文件都revoke掉,然后重新生成了一遍,并且检查了App ID的配置,查看有没有和本地的Capabilities不匹配的字段。

当然,结果还是没有什么用处。

Debug和Release选择错误

google到有大佬说cmd+shift+<打开配置查看一下选中的Debug和Release是否正确,我不知道这个会不会照成影响,但是我觉得这个可能不会有什么用处,正常的配置应该就是如图:

logo

然而没有什么办法,只能改改看了,最后发现还是不对。

info.plist中的id和target中不一致

这个问题是项目的info.plist文件中的Bundle identifier字段和
Project -> Target -> 项目名称 -> Build Setting -> Packaging -> Product Bundle Identifier 中的ID字段不匹配照成的。

但是我的info.plist文件中的ID为$(PRODUCT_BUNDLE_IDENTIFIER),如果你的不是,建议你也要改成这样,避免以后不必要的麻烦。

检查所有的Targets下的证书

就是这个方法解决了我的问题,因为我本地管理的Apple ID有点多,而且之前google都是配置PP之类的回答,所以没有想到这个问题,昨天跟证书和PP混战了一天之后脑子也有点糊涂,今天早上来,仔细查看了编译日志,发现!咦!好像这个地方有问题,于是检查了Targets下的

  • XXX(项目名)
  • XXXTests
  • XXX-tvOS
  • XXX-tvOSTests
    .
    .
    .

如果你还有其他Target请都检查一遍!发现其他的证书都是用的另外一个账号的证书。改了一下。。顿时预感要成功,cmd+R了一下,果然出现了久违的画面:

logo

最后

这篇文章仅供个人学习使用,如果有什么不对的地方还请大佬们多多指教,另外如果你也遇到了这个问题,有这边没有提到的解决办法,请留言告诉我。谢谢。

参考文档

Entitlements file do not match those specified in your provisioning profile.(0xE8008016)
iOS开发 The executable was signed with invalid entitlements.
Xcode entitlement 问题定位和解决指南
Entitlements Troubleshooting
The entitlements specified in your application’s Code Signing Entitlements file are invalid, not permitted, or do not match those specified in your provisioning profile. (0xE8008016).
The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile. (0xE8008016).
The entitlements specified in your application’s Code Signing Entitlements file are invalid, not permitted, or do not match those specified in your provisioning profile. (0xE8008016).