iOS应用发布中的一些细节
前言
这几天最大的新闻我想就是巴黎恐怖袭击
了,诶,博主每年跨年都那么虔诚地许下“希望世界和平”的愿望,想不到每年都无法实现,维护世界和平这么难,博主真是有心无力啊,其实芸芸众生的我们能做的大概就是不要闯红灯、不抢小妹妹的甜筒、拉完屎记得冲水、打饭不逃票、不在澡堂小便、不挖人家墙角……其实就是维护世界和平了。
然而黑客组织Anonymous向ISIS宣战了!
图0
威武!
好吧回归这次文章主题,就列举一些iOS应用发布中个人觉得还蛮容易忽略的一些细节。
再卖一次广告,博主博客已经搬家咯,新地址 ,排版布局更好,阅读体验更佳!!
Bundle identifier
Xcode中 Target -> General
中的bundle identifier
;
info.plist
中的Bundle identifier
;
证书中心的Identifiers
中App IDs
新建App时的Explicit App ID
;
以及iTunes Connect
中App信息的套装ID
必须保持一致!!
在info.plist或者Xcode里的各种设置中,有很多$(XXX)
这样的像脚本一样的东西,所以补充一点Xcode中的环境变量
Certificates证书
苹果的证书体系一直都是iOS初学者无尽的梦魇,什么开发证书、发布证书、推送证书,什么ad hoc、内测分发、真机调试……我想每一个iOS初学刚开始接触Apple的证书体系的时候内心是绝壁崩溃并且被心中的草泥马践踏的体无完肤的……。
其实苹果的证书其实没那么玄乎,很多朋友弄不懂或者过了一段时间又不知道怎么弄了,本质的原因是因为对非对称加密(公开密钥加密)的不理解~~导致的~~,所以为了完全的驾驭苹果的证书,这些基础的知识就是坑你的坎,必须跨过去的。
网上有各种解释证书中心里面每一种证书作用是什么、怎么创建、怎么使用的,但是这也只能授人以鱼,所以博主不会介绍每一种证书是干嘛的,因为你看前年多了一个Pass Type ID Certificate
,去年又有了WatchKit Services Certificate
,今年又来一个Apple Pay Certificate
……根本就解释这些证书不完嘛~,所以理解这些证书的统一规律才是王道!所谓
万变不离其宗
很多资料都把证书分成两种,分为开发证书(development)、以及发布证书(distribution)。但是博主认为这样分类不是很不科学的,博主的理解的分类是这样的
图1
所以其实苹果每年都添加的证书属于其他证书
,这些其他证书并不是非必须的,而是使用了苹果的某一项服务时才需要提供的凭证。而根证书
是必须的,它签名的APP是属于这个证书的所有者的。
图2
图中我的这个账号默认会有两个不同用途的根证书
,有两个App,分别为App1、APP2,以及它们对应的两种用途的推送证书(属于其他证书
)。
假如我现在需要真机调试App1的推送,那么我只要下载开发根证书
以及App1的开发推送证书
然后双击打开导入钥匙串,然后创建相应profile即可真机调试了;
假如现在我要发布APP2,那么我只要下载发布根证书
以及APP2的发布推送证书
,然后创建相应地profile即可打包上传App Strore了。(这里因为发布的特殊性,所以发布的电脑必须是创建这个发布根证书
的电脑)。
profile(描述文件)下文还有篇幅介绍。
我TM都绕晕了,确实有点麻烦有点复杂,果然iOS开发门槛就是高啊,但是哥就喜欢。
App IDs
在相应地App的edit中可以添加多套APNs推送证书(其他的证书也类似的)
图3
在这里声明一下,其他证书
其他证书生成的时候,使用的certSigningRequest
文件可以和产生根证书
的certSigningRequest
的不一致,也就是说产生其他证书
时不一定需要产生根证书
的电脑,所以这里也坑了无数的人调试推送,这个在下文推送的那些事详细填坑。
Provisioning Profiles描述文件
图4
我想这个界面一弹出来的时候,蛋蛋忧伤迎面扑来。然后怒点 Fix issue
,然后你们团队负责管理证书的基友突然发现证书中心多了好多好乱的证书以及描述文件,然后他爆了一句:what the huck!删掉了带有Xcode *
的证书以及描述文件,然后自己又暴力的点了一发Fix issue
,然后你突然调试不了了,再暴击Fix issue
键,最后整个团队都只有通过Fix issue
来真机调试了……。
所以慎点Fix issue
,如果点击这个选项,聪明的(~~蠢哭的~~)Xcode就会自己管理描述文件,然后各种莫名其妙的带有Xcode *
的证书以及描述文件……
其实只要坚信一点,证书、设备ID、AppID、描述文件都弄对了就绝逼不会出问题的!
描述文件工作原理
图5
-
- 其实描述文件工作的原理就是在APP打包或者真机调试的时候,让Xcode去检查描述文件里面的BundleID与这个APP的BundleID是否对应。
- 对应的话就会去
keyChain
查找有没有相应地证书(所以证书要下载好,并且导入keyChain
)
- 如果有证书存在的话就会检查证书的类型,如果是开发证书,则会检查调试的设备是否加入了描述文件里面的信任设备ID列表,如果设备没有在描述文件的列表中,则无法调试;如果证书类型是发布证书则不会检查设备ID列表。
额外地,如果公司新增了测试机,并且在证书中心的Devices
中添加了新测试机的ID,这样描述文件也要相应地更新,然后重新下载,下载完之后可以先删除旧的描述文件(博主直接覆盖的方式貌似描述文件没有更新啊),你们可以自己做实验咯,描述文件的路劲/Users/XXX/Library/MobileDevice/Provisioning\ Profiles
XXX
你的用户名。
不要覆盖!记得先删除,可以免除很多问题。
推送的那些事
如果说亿万级用户的微信推送服务并不是企鹅自己定制的而都是由苹果APNs推送的话,那苹果的推送就真的牛逼了,但是有时候测试推送,经常APNs要死不活的,推了半天才到,有一次在APNs沙箱环境怒推1000多条,然后这条队列持续了半个月才推完~~。所以微信、扣扣肯定是定制的推送,有钱就是讨厌,那么任性。
但是苹果推送的开发是比较简单地,如果没有高级推送需求基本就不用写代码了,只要配置好证书一切OK。
现在常用的后台server中,一般将推送证书以及推送证书的私钥导出p12交给后台人员即可。
PHP有点调皮,还需要转换成pem
生成PHP需要的Pem证书
准备:
-
- 苹果服务器证书端设置正确!打包证书、描述文件正确!!
- 下载推送证书(cer格式),导入keyChain,保证私钥存在,不存在去找创建这个证书的电脑要一份过来。
- 从钥匙库导出的~~根证书~~(推送证书)私钥