免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!
原文链接地址: http://www.raywenderlich.com/2915/ios-code-signing-under-the-hood
注:本文由翻译团队成员 skingTree翻译。
教程截图:
下面是一篇有澳洲墨尔本的一名全职 iOS 开发者 提供的文章。他在论坛上是一个很摩登的年轻人 – Adam Eberbach 。
· Bundle identifier
· provisioning profiles
· App ID
· certificate signing request
对于新手,的确很难一口气搞清楚这些东东到底有什么区别。
下面我们来揭开它们的神秘面纱,在读完这篇文章后,你应该可以把这些东西联系起来,你能够理解它们是怎么工作,并能够顺利地在 device 上运行你的应用了。
当然,这里假设你已经是一个 iOS 开发者,拥有 IDP ,并已经有一定的 xcode 和 iOS 开发经验了。如果你只是刚刚开始学习 iOS ,你可以先看看其它入门教程。
好吧,我们开始了。
它们有多重要?
Code signing 对你来说,最主要的意义就是它能让你的 App 在设备上运行。不管是你自己的设备,甲方客户的,还是在 App store 上购买你的消费者。
如果没有 code signing ,你只可以在模拟器上,或者一台越狱过的机器上运行你的应用 ---- 当然,仅仅如此是不能满足我们的。
模拟器的测试仅仅是一种初步测试,模拟器不能替代真机调试,因为:
·真正的设备会通常比模拟器慢
模拟器使用的是你的 MAC 机上的处理器,而一台真正的 iphone 可远远没有这种条件。所以如果你不在设备上真正运行,你可能就会忽略实际的性能问题。
比如你新建一个ViewBased应用,然后在 viewDidLoad里面加入下列代码:
int count=200000; NSMutableArray * array =[NSMutableArray arrayWithCapacity:count]; for (inti =0; i <count; ++i) { [array addObject:[NSString stringWithFormat:@"%d", i]]; } 上面这段代码在模拟器上可能1-2秒就能运行完,但是在真机上面(比如iphone 3GS),大约要花7秒左右的时间。
同理的,模拟器使用你 MAC 上的内存,而一台真正的 iphone 的内存少得多。
特别是游戏,通常会使用大量的图片,占用大量的内存。在老一点型号的机器上,一个纹理图片的大小上限是 24MB ,也就是 1024X1024 的 8bit 纹理图。
内存耗尽绝对是你不想见到的,因为占用的内存超过一定范围, OS 会强行退出你的 app ,对用户来说,就认为是你的 app 崩溃了。
·有些 API 只在设备上有效
譬如 In-App purchase 的 API ,或者 Instrument 中的 Core Animation 。这些都要在真机上测试出来。(可能以后版本的 iOS 或者 xcode 能够支持,但毕竟真机测试是一种保障)
总的来说,你没有在真机上测试过,等于你没有真的测试完。
·(译者注:一些视觉上的效果在模拟器上看到的可能会与真机不一致)
在 Xcode 中有一些懒人的方法:
在 organizer 的界面中,选中 devices 右键 Developer Profile ,你可以看到这样一个菜单。
里面有大部分这篇文章将要讲到的内容 。
这里你可以 sign in 你的开发者账号,自动登记你的 app 并运行到你的 device 上。
当然,如果这样总是好用的话,这篇文章就没有意义了。
作为一个开发者,你应该知道更多。
Public and Private Keys 公钥私钥
在继续剖析之前,我们先简单地解析公钥私钥。
这世上有两种加密方法: symmetric cryptography 对称密码和 asymmetric cryptography 非对称密码。
对于对称密码,只有一种 key 。譬如你有一个密钥,以及对应的一个加密过的信息。
那只有知道密钥的人可以解读这个信息。
对于非对称密码,有两个 key – 公钥和私钥。
譬如你用某个私钥加密一些信息,别人收到这个信息后可以通过那个私钥对应的公钥来加密。这样他们就可以肯定,这个信息是从你那里来的(至少是你加密的)。
这个私钥就相当于一个“签名”。 (你加的密,就是你签的字)
而这个,就是在 iOS 中 code signing 背后的原理。
Code Signing Objects
与 Code Signing 有关的东西有 :
Provisioning Profiles , App IDs , UDIDs …
在这一节,我们会一个一个地解说。
我用 Core Data 绘制了一个图表,用来描述这些对象之间的关系。
这是针对开发人员的 ( Development Profile ),发布人员的图会有小小区别。
私钥 Private Key :
在 Mac OS X 以后, key 由一个叫做 Keychain 的 app 来管理。 你可以在 Application\Utilities 中找到。
运行 Keychain ,你可以看到在你的名下有哪些公钥和私钥。类似这样的:
(这是私隐,要加码的)
如果你没有看到任何 key 的列表,不用担心。在你第一次使用认证的时候, Keychain 会帮你创建。
在这里列出的 key 是你的 provisioning 或者 code signing 的基础。
你必须有 key 才能 sign code 或者在 App store 中发布你的 app 。
如果 key 丢失了?
你必须把整个流程重新做一次 – 因为没有 key ,你的认证不再有效,你的 provisioning profile 只会生成 error 。你会浪费很多时间,所以,好好保管它。
如果你没有备份过,我建议你马上把它 export 出来,通过 File\Export Items ,保存在一个安全的地方,例如一个很小的分区中。或者通过你的 Mobile Me 账号来同步保存。
有多个 Key ?
如果你在不同的 Mac 机上创建过 account ,你将会有多个 key 。
这样会带来一个问题,在机器 A 上生成的认证,在没有私钥的机器 B 上会失效。
所以,你可以把你所有的 key 复制到你所有的 Mac 机上。(这样就不用烦了)
或者,我更建议只用一个 Key 。
UDID
UDID ( Unique Device Identifier )是区分物理设备的唯一标识。
所有你的 iPhone 肯定有一个与众不同的 UDID ,包括你的 iPad 等等。
通常, UDID 会是一个 40 位十六进制字符串。
也就是下图的 identifier :
如果 App 不是从 app store 上来,你的代码需要有 UDID 的信息才能运行。
怎么知道你拥有的设备的 UDID ?有几个方法。
1 如果你的设备连到 Xcode 的机器上,你可以在 Organizer 中看到 UDID 。
2 没有 xcode 的朋友也可以,在 iTunes 的 Summary 界面,有 serial number (序列号)的信息,点击可以看到。
3 这是最简单的方法,在 App Store 中下载一个 Ad Hoc Helper 吧。
Certificate 认证
认证,就是你的个人开发者认证,或者更华丽地说:“ Apple Worldwide Developer Relations Certification Authority Certificate ”(这不翻译了),
这个本质上就是一些代表着信任 - 授权的数据而已。
获取一个认证,你需要子啊 Keychain Access 中生成一个 Certificate Signing Request ,并把它发给 Apple 。这会创建一对 公钥 - 私钥(如果还没有的话)。
Apple 收到后会验证信息,然后给你创建一个认证。
App ID
在 Xcode4 中创建一个项目,你要提供 Product Name 和 Company Identifier 的信息。
Product Name ,就是你的 app 的一个较短的名称。
Company identifier ,通常会是一个反转的 DNS 串,例如: com.mycompanyname
这两者合起来,就似乎 Bundle Identifier 。你会在 Info.plist 中找到。
对于每一个你要发布的 app ,你需要到 iTunes Developer Center 中注册你的 App ID 。如下图。
这个需要与你在 Info.plist 中设置的保持一致。
Provisioning Profile
把前面讲到的东西合起来:
· App ID ( app 的唯一标识)
· UDID (在某台设备上运行的唯一标识)
· Certificate (开发者认证)
就是所谓的 Provisioning Profile 。
Provisioning Profile 通过 xcode 或者 itunes 导入到 device 中,或者打包到一个包含 app 和 profile 的 .ipa 文件中。
你可以在 iOS Provisioning Portal 中创建你的 Provisioning Profile 。
新建一个,有一下几个步骤:
·为 profile 命名,以后你会在 xcode 的 organizer , Buid Settings 以及其它一些地方中看到
·选择你的 certificate
·选择你的 App ID ,要如 Info.plist 中的一致。
·选择要应用到的设备。通常,我都是把我的设备全选的。
个人用途的签名 Signing
假设你已经有一个准备测试的 App ,而你有 IDP ,并且处理好 Provisioning Profile 的事情了。
现在你清楚已经知道它们的逻辑了,如果你新加入,下面这些是你要做的:
1 检查你的公钥私钥,为以后检查方便,起个好名吧。
2 用 Keychain Access 来创建你的开发认证。然后下载 Apple 给你的认证,双击安装,然后你可以在 Keychain 中看到了吧。
3 下载“ Apple Worldwide Developer Relations Certification Authority Certificate ”( WWDR )也是双击安装,也可以到 Keychain 中看到。
4 检查你项目的 Bundle ID ,到 Provisioning Portal 中创建一个一致的 App ID 。
5 在 Provisioning Portal 中加入你想要的 UDID 。(全部加上好了)
6 针对你的 Certificate 创建 Provisioning Profile, 指定你的 app ID 和 UDID 。
7 下载刚刚创建的 Profile ,拖到你的 xcode Organizer 中。
然后,你就可以 sign 你的 project ,并让它们在你的 device 上运行了。
在 Target – Build Settings ,往下滚动到 Code Signing 一节。
试试编辑一下 Debug schema ,它适合于团队协作:
在 Automatic ProfileSelector 中选择“ iPhone Developer ”,你会看到你的认证已经自动选上了。
一切都搞定了,连接你的 device ,在 xcode 中选择 Debug build , build & run 。
xcode 会到你的设备里装上这个 provisioning profile ,并运行你的 App 。