iOS Code Signing: 解惑

系统 1693 0

 

免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿之人无任何关系。谢谢合作!

原文链接地址: 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

iOS Code Signing: 解惑


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论