美文网首页iOS 开发IOS->开发技巧生活百态
不让苹果开发者账号折磨我

不让苹果开发者账号折磨我

作者: TIME_for | 来源:发表于2016-01-01 23:03 被阅读13445次

    在iOS开发过程中,不可避免的要和证书打交道,真机调试、App上架、打包给测试去测试等都需要搞证书。在此过程中我们会遇到很多的问题,但是如果掌握了真机调试的原理和本质;遇到问题,我们就更容易定位问题之所在,从而迅速的解决问题。这篇文章不是一步步教给你证书,描述文件的制作(其实制作步骤是非常简单的),而是尽可能的讲明白Member Center中的一些知识及原理。并且此文不涉及如何申请开发者账号,以及App上架App Store的流程。

    此篇文章的逻辑如下图所示:

    图0-0 此篇文章的逻辑图

    Certificates

    什么是证书

    什么是证书?证书就是:证明证书拥有者拥有证书上所说的能力。一个证书要涉及到颁发者,拥有者,证明拥有者拥有了什么能力。例如,CET-4证书;颁发者:学校,拥有者:自己,证明的能力:英语达到四级水平。苹果开发者证书也是一样,颁发者:自己,拥有者:安装证书的电脑;证明的能力:可以安装或者打包某应用程序。开发者证书分为两种类型:Development Certificate(开发证书)和Production Certificate(发布证书)。

    开发者证书能力来源

    那么当某台电脑安装开发者证书后,这台电脑是如何拥有这种能力的呢?

    苹果在此运用了代码签名验证。代码签名验证允许我们的操作系统来判断是谁对App进行了签名,在安装了Xcode后,Xcode会在项目编译期间使用你的代码签名验证,这个验证是一个由Apple认证过的公钥-私钥对组成,私钥存储在你的钥匙串中(Mac本地,在系统实用工具中),公钥包含在证书(Certificates)中,证书在本地钥匙串和开发者账号中都有存储。另外,还有一个我们可以叫做媒介证书的证书来确保我们的证书(Certificates)是经过授权而发布的。当安装好Xcode时媒介证书(Intermediate Certificate)就已经安装到我们的钥匙串中去了。通过在开发者账号(Developer Account)和本地(Mac)都经过验证的证书(Certificate)我们就可以利用合法的证书进行App的测试和发布了。

    电脑向证书机构申请凭证

    在制作证书的时候会有一步让你上传一个CSR文件(用于换取证书的公钥文件),导出CSR这个过程其实就是电脑向证书机构申请凭证的过程。证书是你用电脑制作的并且颁发给你的电脑的。但是这台电脑是否具有制作证书的能力,就是要这个CSR文件来凭证。CSR从钥匙串中导出,具体步骤在制作证书的时候有具体描述,这里不再详细叙述。

    证书在Xcode工程中所对应的位置

    图1-1 证书在Xcode工程中所对应的位置

    Identifiers

    Identifiers中又分为App IDs、Pass Type IDs、Website Push IDs、iCloud Containers、App Groups、Merchant IDs、这里主要讲解App IDs。

    App ID是什么

    App ID其实就是一个App的身份证,一个App的唯一标示。在Project中称为Bundle ID。在Member Center、Project、iTunes Connect都是需要此ID去标示此App的唯一性。Bundle ID在不同环境下的表现关系。如(图2-1)所示。

    图2-1 Bundle ID在不同环境下的表现

    一个Bundle ID精确的标识了一个App。Bundle ID字符串中只能包含字符(A-Z,a-z,0-9),连接符(-),点(.)而且此字符串最好是reverse-DNS格式的。例如你公司的域名是Acme.com,你App的名字是Hello,那么你可以用com.Acme.Hello作为你的Bundle ID。

    Bundle ID的作用:

    • 在Xcode工程中,Bundle ID储存在Info.plist中,当你编译工程的时候,他会把此文件拷贝到你的app包中。
    • 在iTunes Connect,用Bundle ID去标识App,在你第一次构建上传之后,你就不能在改变或者删除你的Bundle ID了。
    • 在Member Center,你创建一个和Bundle ID相匹配的App ID。如果App ID是精准类型的,你就必须精确的去匹配你的Bundle ID,Bundle ID是大小写敏感的。

    在Member Center中添加App ID

    在Member Center中添加App ID也是很简单,选中App ID点击右上角的+号,App ID Description就是写一下这个App ID的描述了。App ID Prefix:App ID的前缀,这里苹果为了更精确的保证App ID的唯一性使用了开发者账号的Team ID作为App ID的前缀。App ID Suffix:App ID的后缀,这里有两种类型,一种是精准的,一种是通用的,我们在使用中大多数都是使用精准的,直接把我们的Bundle ID填进去就好。下面就是App包含的服务,这个根据自己业务所需的类型自己选择就可以了,而我们用的最多的也就是Push Notifications推送服务。然后continue就可以了。

    Devices

    Device就是用来测试的设备。在Member Center中添加device的步骤其实也很简单了,主要就是要拿到device的UDID,这里我们可以利用iTunes、iTools、Xcode这些工具都可以拿到设备的UDID。需要注意的就是,每个开发者账号,每年最多可以添加100台调试设备,而且不能更改,想要更改就要等到下一年重新续费的时候才能更改调试设备了。在下面要讲述的描述文件中只有发布到App Store和In House的时候这两种类型的描述文件的制作是不需要添加device的,而其他描述文件的制作都是需要添加device的。具体使用情况,参考下面的【Provisioning Profiles】。

    使用iTunes查找UDID

    图3-1 使用iTunes查找UDID

    使用Xcode查找UDID

    选择Xcode工具条上的Window,然后选Devices选项。

    图3-2 使用Xcode查找UDID

    Provisioning Profiles

    描述文件描述了可由哪台电脑,把哪个App,安装到哪台手机上面。一个描述文件的制作是需要App ID、Device、Certificate这些信息的。所以苹果在Member Center中把这个文件的制作排在最后面是很合理的。描述文件其实可以分为两种类型,一种是带有device信息的;而另一种是不带device信息的。

    带device信息的描述文件

    图4-1带有device信息的描述文件

    这种类型的描述文件包括所有开发类型的描述文件和发布到Ad Hoc上面的描述文件。开发和发布到Ad Hoc上都是需要指明具体要安装到哪部手机上的。

    不带device信息的描述文件

    图4-2不带device信息的描述文件

    不带device信息的描述文件只有发布到App Store和In House两种情况下才使用这个描述文件,因为通过这两个渠道发布的App我们是不能确定将来要安装到那一台设备上的,因此也就不会带有Device的信息。

    描述文件在Xcode中的位置

    图4-3 描述文件在Xcode中的位置

    团队开发证书的管理

    在团队开发的时候,最好是一个人去管理证书,当有其他人要用的时候,可直接导出.p12证书供其他开发者使用。证书出了问题,我感觉还是相当麻烦的,而App ID在添加之后,基本上是不会改变的,除非要为App添加新的服务,这时候才要重新编辑App ID,所以App ID最好也是管理证书的人去管理App ID。添加设备这一块就很随意了,所有的开发者都应该有权去管理添加设备这一块。描述文件的制作这个要区分一下是开发类型的描述文件,还是发布类型的描述文件。开发类型的描述文件应该是团队里的每一个开发者都有权去管理的,实际上当开发类型的描述文件出现问题的时候,开发者可以对此描述文件重新编辑一下进行使用,这样是不会影响其他开发者的,甚至你可以自己重新制作一个描述文件也没什么问题。但是发布类型的描述文件,这个最好还是管理证书的那个人去管理这个描述文件。打包发布的时候如果这个描述文件出现变化,还是很麻烦的,而且这个描述文件对于团队其他开发者来说也不是很常用,甚至是根本用不到这个描述文件。以上这些就是我个人对于团队开发证书管理的建议,当然也有不足之处,如你有好的建议,也欢迎你私密我,共同交流,共同进步。

    导出.p12

    .p12又称为个人信息交换证书。此证书实际包含了.cer证书及对应的私钥信息。上述证书中提到.cer文件中包含公钥,私钥在本地钥匙串中。而.p12包含了公钥私钥,所以可以分发给团队其他成员使用。.cer文件没有包含私钥,所以别人的电脑上用此证书时找不到对应私钥,从而使用不了。在导出p12的时候是点击证书导出的,如(图5-1)所示:有下标箭头的就是有对应的私钥。

    图5-1 .p12证书的导出

    举例使用

    上面几段可能原理性的内容过多了一些,但是个人感觉掌握这些原理还是很有必要的。下面举个例子,对应上面的原理,讲一下实际的运用。

    产品需求:我的一个App,包含推送功能,在开发状态下已经测试完成所有功能,但是这时产品经理为了保证产品在上线后也万无一失,就想测试一下上线后,推送的功能是否稳定。这时我们的App还没有上线,那我们要怎样才能去测试这样的一个功能呢?

    分析这个需求,要测试上线后推送功能,其实无非就是看上线后推送的证书会不会出现什么问题。这时候我们就会想到Ad Hoc。因为发布App除了App Store渠道之外,还可以选择Ad Hoc。这时候我们就先选定用哪几部手机进行测试,先添加到device中,然后开始制作描述文件。点击右上角+号 -> 然后选择Distribution中的Ad Hoc -> 点击continue -> 选择你要测试的App的App ID -> 点击continue -> 选择你发布到App Store时候所用的证书 -> 点击continue -> 选择你要安装的测试设备 -> 给此描述文件起一个名字 -> 点击generate。这样你就生成了一个发布到Ad Hoc上面对应的描述文件,用此描述文件打包出来的App和发布到App Store上面的App用的是同一个证书,所以在此情况下App的推送没有什么问题,基本可以推断App上线之后应该也是没有什么问题的。

    总结

    对于苹果开发者证书不是太了解的同学,证书问题可能是非常头疼的一件事情。因为开发者账号有三种类型,而在制作证书的时候,有开发证书,发布证书以及一些附带属性的证书,以及添加App ID,Device,制作描述文件,感觉就是很乱,搞了一堆的东西,最后也不知道这些东西到底都是干什么用的,运气好的话,可能这样瞎搞一通,App就能跑到真机上面了,但是也不排除,瞎搞一通,还是有各种问题。所以我们在学习知识的时候,还是要尽可能的去了解他的原理。关于开发者证书,我们还要根据实际需求自己去做一些判断,来满足实际的需求。这篇文章看起来可能有些乱,而且有些地方也没有提到。一些不足之处,还请多多见谅,同时也欢迎你私密我,私下交流共同探讨,共同进步。

    参考

    相关文章

      网友评论

      • a706aa61f4d8:谢谢分享
        TIME_for:@D0ME :smile:
      • 奔跑的鸿:我想问公钥和私钥是怎么配合进行签名验证的,通过你的描述,我知道了电脑里只有集齐公钥和私钥才能让xcode拥有打包app的能力,可是对两者的认证过程不太明白,望大神给予回复
        TIME_for:@奔跑的鸿 https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005929-CH1-SW1 看一下官方文档或者查一下其他文档,有更详细的解释,不是一两句话能说清楚的。
      • manajay:我想问一下, 一个开发者帐号 有几个推送证书 , 推送证书是 对应 APPID 的吗
        manajay:@TIME_for 我说的 appleID 是 指的 bundleID , 如果上限是两个的话, 那么就是说 只有一个 app 可以使用推送了,一个开发环境 一个生产环境
        TIME_for:@Manajay 推送证书也是制作的啊,上限2个吧,不太确定。是对应AppID的。
      • 071a958d5815:喜欢
        TIME_for:@071a958d5815 谢谢~~
      • SimpleBK:开发者证书
        TIME_for:@SimpleBK :smile:
      • c890b3e54937:已收藏
        TIME_for:@shenyuanluo :smile:
      • 90ae5a4c27a9:拨云见雾
        TIME_for:@90ae5a4c27a9 共同努力~~
      • f11fddbfe0a8:作者,你这个导图用啥做的?
        f11fddbfe0a8:@Toyun thxs
        TIME_for:@shaiman MindLine
      • ryugaku:马克
        TIME_for:@ryugaku 多多交流,共同进步~~
      • 口七:很不错,瞬间理清了各种关系
        TIME_for:@口七 谢谢,共同进步~~
      • 暗香有独:总结的不错,对于刚入行IOS开发人员而言,算是一篇精华之作
        TIME_for:@daojiao 谢谢~~
      • key君:有个问题,假如app的Bundle id跟证书的Bundle id不对应会出现什么问题
        TIME_for:@key君 就用不了啊。可以配置通用型的描述文件 Bundle id就一个*的那种
      • 90b1efa03d2e:有用
        TIME_for:@爬坡 共同进步~~
      • 32d94172a689:赞一个。谢谢。马上写完了。该试试听说很变态的苹果上线了
        TIME_for:@_Christina 共同进步,后半句什么意思啊,没看明白呢。
      • mark666:很不错,今天刚制作完证书和应用程序的打包,就看到你的这篇文章,不错
        TIME_for:@mark666 共同进步~~
      • f5c211433077:很清晰!
        TIME_for:@陈玉军 谢谢夸奖~~
      • cb3fc6332154:作者您好,您这篇文章的初衷非常不错。但是我想提两个建议,希望您能补充到文章中,这样就对新手更友好,作为经典资料也更完美了。1.记得是描述文件还是证书,你省了一个关键步骤,你没提到上传本电脑向证书机构申请凭证这一步,这一步标志着对这台电脑的开发授权;2.在导出p12的时候直接点证书导出还是展开后点私钥导出,这两者的区别和场景没有提到。这两点比较关键,毕竟我也是从新手过来的,要搞懂就不能含糊。非常感谢:pray:@Toyun
        TIME_for:@弗丁老爹 你提的这两点我已经更新到文章中了。再次感谢你的宝贵意见。如有不足之处,还请多多指教~~
        TIME_for:@弗丁老爹 感谢你提的宝贵意见,这两部分我回头在优化一下。再次感谢你的意见,让文章变的更加完美~~
      • 服了梨:值得收藏
        TIME_for:@966f27d2b518 非常感谢
      • 185c0e951b29:赞一个 学到了
        TIME_for:@185c0e951b29 共同进步啊!
      • Maginawin:马克
        TIME_for:@AnitMagic 谢谢~~
      • 751e26d056e2:iOS开发必学 涨姿势了
        TIME_for:@CDM0817 共同进步~~
      • 三粒黑子球:学到了很多东西呢~
        三粒黑子球: @Toyun 嗯呐嗯呐😁
        TIME_for:@三粒黑子球 共同进步~~
      • 庸者的救赎:收藏
        TIME_for:@庸者的救赎 谢谢~~
      • _誌念:啊啊啊
        TIME_for:@_誌念 有何不足之处,欢迎指正啊。
      • 不超过三种颜色:赞一个,解释完了再把证书使用步骤加上不就全套了么:joy:,第一次用多怕证书搞出问题来。
        TIME_for:@不超过三种颜色 制作过程根据提示下一步就好,算是比较简单一些,就没有一步步的去截图,可以参考我引用的第二篇文章苹果开发者账号那些事。同时,有问题也欢迎你简信我,共同交流,共同进步。
      • Syhpox:齐全,喜欢究根到底
        TIME_for:@Syhpox 共同交流,共同进步。
      • 垚子:mark
        TIME_for:@垚子 Thank you!
      • Young_Blood:好帖
        TIME_for:@八阿哥嘟嘟 谢谢,多多支持~~
      • 研磨時光:好帖,赞一个
        TIME_for:@夜无眠yszd 谢谢,多多交流。
      • 木子青青:刚好需要用到
        TIME_for:@木子青青 多多交流,感觉自己没写好啊。
      • 慕与:涨姿势了
        TIME_for:@慕与 共同进步~~
      • 曾樑:有用,学习了
        TIME_for:@曾樑 :fist:

      本文标题:不让苹果开发者账号折磨我

      本文链接:https://www.haomeiwen.com/subject/wmaihttx.html