iOS Code Signing: 解惑

注:本文由翻译团队成员skingTree翻译。ios

教程截图:xcode

Learn all about how Code Signing works!

    下面是一篇有澳洲墨尔本的一名全职iOS开发者提供的文章。他在论坛上是一个很摩登的年轻人 – Adam Eberbach安全

  ·Bundle identifierapp

  ·provisioning profilesiphone

  ·App IDide

  ·certificate signing request性能

  对于新手,的确很难一口气搞清楚这些东东到底有什么区别。学习

  下面咱们来揭开它们的神秘面纱,在读完这篇文章后,你应该能够把这些东西联系起来,你可以理解它们是怎么工做,并可以顺利地在device上运行你的应用了。测试

 

  固然,这里假设你已是一个iOS开发者,拥有IDP,并已经有必定的xcode和iOS开发经验了。若是你只是刚刚开始学习iOS,你能够先看看其它入门教程。ui

 

  好吧,咱们开始了。

 

它们有多重要?

  Code signing 对你来讲,最主要的意义就是它能让你的App在设备上运行。不论是你本身的设备,甲方客户的,仍是在App store上购买你的消费者。

 

  若是没有code signing,你只能够在模拟器上,或者一台越狱过的机器上运行你的应用----固然,仅仅如此是不能知足咱们的。

 

  模拟器的测试仅仅是一种初步测试,模拟器不能替代真机调试,由于:

·真正的设备会一般比模拟器慢

  模拟器使用的是你的MAC机上的处理器,而一台真正的iphone可远远没有这种条件。因此若是你不在设备上真正运行,你可能就会忽略实际的性能问题。

  好比你新建一个ViewBased应用,而后在viewDidLoad里面加入下列代码:

 

int count =200000;
NSMutableArray
* array = [NSMutableArray arrayWithCapacity:count];
for (int i =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,你能够看到这样一个菜单。

  里面有大部分这篇文章将要讲到的内容

Automatic provisioning with Xcode 4

 

  这里你能够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绘制了一个图表,用来描述这些对象之间的关系。

Objects related to Code Signing

 

  这是针对开发人员的Development Profile),发布人员的图会有小小区别。

 

 

私钥 Private Key

  在Mac OS X 之后,key由一个叫作 Keychain的app来管理。你能够在 Application\Utilities 中找到。

运行Keychain,你能够看到在你的名下有哪些公钥和私钥。相似这样的:

Keychain Access showing public/private keys

 

(这是私隐,要加码的)

 

  若是你没有看到任何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:

How to see your device's UDID in XCode Organizer

 

  若是App不是从app store上来,你的代码须要有UDID的信息才能运行。

 

  怎么知道你拥有的设备的UDID?有几个方法。

  1 若是你的设备连到Xcode的机器上,你能够在Organizer中看到UDID。

 

  2 没有xcode的朋友也能够,在iTunes的 Summary界面,有serial number(序列号)的信息,点击能够看到。

How to find a device's UDID in iTunes

 

 

  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。以下图。

Finding the Bundle Identifier in your Info.plist

  这个须要与你在Info.plist中设置的保持一致。 

Provisioning Profile

  把前面讲到的东西合起来:

  ·App ID app的惟一标识)

  ·UDID (在某台设备上运行的惟一标识)

  ·Certificate (开发者认证)

  就是所谓的Provisioning Profile

 

  Provisioning Profile 经过xcode或者itunes导入到device中,或者打包到一个包含app和profile的.ipa文件中。

 

  你能够在iOS Provisioning Portal 中建立你的Provisioning Profile。

Creating a Provisioning Profile in the iOS Provisioning Portal

 

  新建一个,有一下几个步骤:

  ·为profile命名,之后你会在xcodeorganizerBuid 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。