Xcode entitlement 问题定位和解决指南

背景故事

前两天,本来一个运行正常、打包测试都没问题的XCode工程突然爆出各种奇怪的Entitlement错误:

  • 什么签名的内容跟配置文件的不一致。

又或者

  • 无法安装,因为签名或者配置文件的配置错误。

折腾了大半天时间以后,只发现一个地方,苹果的开发者证书被某同学重置了……虽然一再强调要小心,不要随便点确定,但是,这种事情还是无法完全避免。我对那些不看信息提示的同学已经是无语了。

然而,尽管我把证书重新生成,并更新了所有相关的配置文件(provisioning profile),却还是各种莫名其妙的错误。

最后,我放弃了,找了一个专业做iOS开发的同学来帮忙,他指出:

XCode的缓存有问题,有时候修改配置并不会生效。

在他的指导下,经过删除账号信息->重启XCode->重新登录->删除配置文件->重启XCode->重新下载配置文件->重新配置签名。也不知道重启了多少次XCode,总之,在所有错误消失的那一刻,我才长长松了一口气:CAO~~~~~~~~~~~

老实说,XCode一切都好,就是这些签名文件的管理实在是有点反人类,跟itunes一样,你好像永远都无法理解它的逻辑。

随后,我又google了一下我遇到的那个Entitlement错误,果然找到了一篇苹果官方的文章《Entitlement问题定位指南》:

https://developer.apple.com/library/ios/technotes/tn2415/_index.html

本着“知其然,知其所以然”的精神,通读了几遍,终于对XCode管理配置文件的原理,有了稍微清晰一点的概念。以下是一些笔记:

什么是Entitlement?

Entitlement(权限),可以想象成App里用于描述该App可以调用哪些服务的字符串。苹果的操作系统(mac os或者iOS)会通过检查这个串,决定这个应用是否可以调用相关功能。比如iCloud权限,推送服务,健康服务等。

常见的Entitlement错误

  • 编译打包时
The executable was signed with invalid entitlements. The entitlements specified in your application‘s Code Signing Entitlements file do not match those specified in your provisioning profile.
  • 安装时
Could not install the application. Your code signing/provisioning profiles are not correctly configured ... you have an entitlement not supported by your current provisioning profile ... (error: 0xe8008016).
  • 提交到苹果商店时
Invalid Code Signing Entitlements. The entitlements in your app bundle signature do not match the ones that are contained in the provisioning profile. According to the provisioning profile, the bundle contains a key value that is not allowed: ‘[A1B2C3D4E5.com.appleseedinc.MyGreatApp ]‘ for the key "keychain-access-groups" in "Payload/MyGreatApp.app/MyGreatApp"
  • 错误的值
entitlement ‘keychain-access-groups‘ has value not permitted by a provisioning profile

查错流程

下图是遇到Entitlement错误时,完整的检查流程:

注意: PP = Provisioning Profile 配置文件

  1. 在Xcode里设置目标应用的功能 (Target Capabilities)
  2. 苹果开发者用户中心网站的 App ID服务
  3. 通过网站(与2相同)创建Provisioning Profile (预配置文件)
  4. 网站的预配置文件库
  5. 检查Provisioning Profile里的权限设置
  6. 把Provisioning Profile安装到Xcode里
  7. Xcode的本地Provisioning Profile文件库
  8. 在Xcode里配置使用哪个Provisioning Profile文件
  9. 在编译日志里检查哪个Provisioning Profile被使用
  10. 检查打包好的应用里包含的权限
  11. 操作系统在安装或者启动时对App进行权限检查

第一步

Entitlement的产生,也就是一个App需要包含哪些权限,可以通过Xcode自动设置也可以自己到开发者网站上设置。

通过Xcode -> project -> Target -> Capabilities 开启或者关闭指定功能

理论上,点了"Fix Issues",Xcode会自动做以下事情:

    1. 更新权限需求
    2. 注册App ID
    3. 为该App ID开启或者关闭相关服务
    4. 创建或者更新Provisioning Profile
    5. 下载并安装该Provisioning Profile文件,因为后边对应用进行签名的时候需要用。

如果网络和运气都好,那么就什么事都没有了。

手动操作

但是,由于苹果网站和中国网络的问题,可能不会那么顺利。如果Xcode没法自动完成任务,那就需要手动进行相关操作:

  • 创建App ID,并开启服务

有些服务会需要额外的信息,比如推送服务,需要指定证书。

  • 添加Provisioning Profile

  • 检查Provisiong Profile包含的服务内容

  • 检查本地的Profile是否包含所需要的权限
security cms -D -i /path/to/iOSTeamProfile.mobileprovision
  • 安装Profile到Xcode

如果是从网站上下载的.mobileprovision,双击该文件将自动安装到Xcode指定的位置。

  • 检查Xcode本地Provisioning Profile文件库

Xcode > Preferences > Accounts > (your account) > View Details

注意,这个是旧版的了,最新的7.3版本略有不同。其中最大的不同是,刷新按钮不见了!!取而代之的是“Download All”按钮,大概是这样子:

在Action一栏,如果这个文件不在本地,会有“Download”下载按钮,如果已经下载到本地了,就没有了。

右键点已经下载的文件,有2个选项:

1. 在Finder里显示

2. 删除 (然后就可以重新下载了)

  • 在Xcode里设置Provisioning Profile文件

如果所需要的Provisioning Profile文件都已经下载到本地,可以考虑让Xcode自动选择,具体的配置方法,参考苹果的另外一个文档:https://developer.apple.com/library/mac/qa/qa1814/_index.html

配置成功后,应该是这样子:

当然,你也可以手动指定签名标识(Code Signing Identity),和Provisioning Profile。

特别值得一提的是:如果Provisioning Profile文件没问题,当你指定了一个Profile以后,Code Sigining Identity的下拉列表里会提示这个Profile所属的开发者账号。

如果没有,则说明这个文件有问题或者Xcode有问题。

(这也是我那个专业同事介绍的办法,实测非常有用。)

到这一步,都正确的话,应该就没问题了。

后边是一些额外的检查:

  • 查看编译日志

编译顺利的话,日志里会提示用到哪个Profile文件:

  • 检查编译出来的App是否包含正确的权限

命令行:

$ codesign -d --ent :- /path/to/the.app

有几个细节:

a. 在对App进行签名的时候,相关的服务权限就被从Profile文件里转移到应用本身的签名里了。

b. Profile也会被内置到App里。如果打开App包查看,可以看到 embedded.mobileprovision

  • 操作系统对App进行检查权限

操作系统的检查,就是基于刚刚说的两个地方:应用自身的签名,内置的Profile。当二者不一致时,就会报错。除了权限外,操作系统还会检查App ID是否一致。

  • 提交到苹果商店前检查权限设置

这是整个流程的最后一个可以检查权限是否错误的地方

其他

  • 手动添加Entitlement文件

通常,Xcode会自动管理Entitlement文件,所以我们并不需要在Xcode Project的Buidling Settings -> Code Signing -> Code Signing Entitlements 特意设置文件。

旧版本的Xcode,你需要自己添加Entitlement文件:

.entitlements文件的格式(应该也是.plist格式)

  • Entitlement常见字段介绍
    • beta-reports-active  是否可以通过TestFilight发布
    • team-identifier 开发账号的团队id,由10个数字和字母字符组成。这个值也是默认的App ID前缀。
    • get-task-allow Xcode是否可以对该应用进行调试。
    • application-identifier 应用的App ID,格式是 <prefix>.<bundle_id>
    • keychain-access-groups 钥匙串权限组 (更多可以参考 https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/)
    • push-notification 开启推送服务后,会有这个字段,它的值表示是生产环境(production)还是开发环境(development)。
  • App ID 前缀检查

操作系统还会对App ID的前缀(也就是团队id)进行检查,如果发现App签名里的前缀和profile文件里不一致,也会报错。

App ID前缀的相关参考:

  • App ID前缀不一致错误: https://developer.apple.com/library/ios/qa/qa1879/_index.html
  • 管理多个App ID前缀: https://developer.apple.com/library/ios/technotes/tn2311/_index.html
  • 钥匙串访问警告: https://developer.apple.com/library/ios/qa/qa1726/_index.html
  • 升级App时提示App ID与当前安装的App不一致:https://developer.apple.com/library/ios/technotes/tn2319/_index.html#//apple_ref/doc/uid/DTS40013778-CH1-ERRORMESSAGES-UPGRADE_S_APPLICATION_IDENTIFIER_DOES_NOT_MATCH_THE_INSTALLED_APP
时间: 2024-11-10 07:39:52

Xcode entitlement 问题定位和解决指南的相关文章

Xcode常见报错及解决办法

报错一: 在iOS7的真机运行时,弹出错误:App installation failed. There was an internal API error. 如图 解决办法: 在Xcode -> Target -> Build Setting 下的Packaging部分,将Product Name 改为英文名.重新运行project,即可正常运行. 报错二:真机运行时,弹出报错信息:Could not find Developer Disk Image 原因:手机的版本高于Xcode中SDK

磁盘问题定位与解决

磁盘问题定位基本流程: 磁盘的压力分析,主要使用下面几个性能计数器 (针对单独的物理盘,每个物理磁盘都会有一组): Avg. Disk Read Queue Length   读队列(越小越好,理想值 2 以下,队列越高说明一个操作的响应时间越长) Avg. Disk Write Queue Length  写队列(越小越好,理想值 2 以下,队列越高说明一个操作的响应时间越长) Avg. Disk sec/Read Avg. Disk sec/Write Disk Read Bytes/sec

xcode证书签名快速完美解决

前几天打开一个老项目,然后真机运行了,但是提示没有对应的签名.然后xcode弹出一个提示 解决的提示框.就点了,然后就能解决.但是昨天准备上传到App Stroe的过程中,进行validate的时候,提示了下面图1的错误. No identities were available .然后各种折腾也不行,其实以前也遇到的,但是那时候没有记下解决的方法. 其实解决方法挺简单的: 第一次生成证书从第四步做起就可以了 1.在 登陆证书维护网站 https://developer.apple.com/ac

IE8 textarea 滚动条定位不准解决方法

工作中遇到一个bug: IE8 下textarea 如果带滚动条(height:100px;overflow:scroll-y;),内容高度超过可视区域之后,输入文字,滚动条位置会乱跳. 开始以为是js的问题,查看了代码感觉不是js的问题,于是借助索工具搜索了一番,这个问题感觉很少见,但是搜索之后发现确实有人遇到过这个问题. 也有些许的解决方案,经过几轮测试找到了最终的解决方案: textarea.fix-scroll{ width: 700px; min-width: 100%; max-wi

牛人笔记----(死锁问题定位与解决方法)

1 --死锁问题定位与解决方法 2 3 --为了解决死锁问题,SQLSERVER数据库引擎死锁监视器会定期检查陷入死锁的任务 4 --如果监视器检测到这种依赖循环关系,会选择其中一个任务作为牺牲品,然后 5 --终止其事务并提示错误.这就是用户会遇到的死锁错误 6 7 --可以发生死锁的资源 8 --需要说明的是,死锁不是只发生在锁资源上,以下类型的资源都可能会造成阻塞,并 9 --最终导致死锁 10 11 --1.锁:例如:页,行,元数据和应用程序上的锁 12 --2.工作线程:如果排队等待线

阻塞与死锁(三)——死锁的定位及解决方法

原文:阻塞与死锁(三)--死锁的定位及解决方法 死锁所在的资源和检测: 在SQL Server的两个或多个任务中,如果某个任务锁定了其他任务试图锁定的资源.会造成这些任务的永久阻塞,从而出现死锁. 下图为例: l  事务T1获得了行R1的共享锁. l  事务T2获得了行R2的共享锁. l  然后事务T1请求行R2的排它锁,但是T2完成并释放其对R2的共享锁之前被阻塞. l  T2请求行R1的排它锁,但是事务T1完成并释放其对R1持有的共享锁之前被阻塞. 现在T2与T1相互等待,导致了死锁.一般情

通过心理学知识提高问题定位与解决能力(下)

前言 本文上篇主要介绍了解决问题的心理过程以及问题表征阶段影响问题解决的一些心理因素,并分享了另外相关案例和指导意见.本文继续介绍影响问题解决的其它心理因素. 影响问题解决的心理因素 自我监控技能 大胆假设,小心求证 ––– 胡适 在设计好解题计划后,问题解决者并不是简单地执行解题计划,而是要时刻自己监控自己对解题计划的执行是否正确.解题计划本身是否正确.这有点类似行车过程中,GPS导航软件时刻检查车辆当前的行车路线与之事先规划的路线是否吻合.若不吻合,则导航软件会提示车主车辆已偏离规划的路线.

通过心理学知识提高问题定位与解决能力(上)

前言 软件开发工作无论是从宏观还是微观上看,都可以看作一个问题解决的过程.从宏观上看,软件开发,简单来说,就是弄清楚客户的需求是什么,然后通过分析.设计.编码和测试等一系列活动解决如何将需求转换为代码的问题.从微观上看,开发人员的日常工作中也面临各式各样的问题.比如,用于调试代码的Web服务器突然启动不了,开发人员必须先解决这个问题,否则手头上的工作可能无法进展. 作为开发人员,与其抱怨加班,不如去反思下自己的时间都去哪里了.我相信开发人员的大部分时间都花在解决各种各样的问题上了.不管是资深的开

invalid code signing entitlement的通用暴力解决办法

1.添加的一台苹果设备为开发机子后,打版本,说profile 没找到,报错 2.上传二进制文件到itunes connect ,报错 3.有时候还什么 appID 无效,报错 烦死他了 我的解决办法,兄弟 先复制一个文件包吧,免得我坑害了你. 我现在xcode 版本有三个,6.3.1 ~用于我们公司unity游戏打包 7.2 这个版本不能落下啊 因为我的7.3.1版本没有代码自动补全功能! 在7.2中操作 删除项目中的entitlement文件 随后关闭 in app purchase  ,ga