你迟早会将应用的运行、测试与调试从模拟器转换到实际设备上。模拟器很好,但它只是模拟而已;模拟器与实际设备间还是有很多差别的。模拟器实际上就是你的计算机,它速度很快并且拥有很多内存,这样内存管理与速度上的问题直到在设备上运行才会发现。与模拟器之间的用户交互只能限定在鼠标上:可以单击、拖曳,可以按住Option键来模拟用户的两指,但更多的手势只能在实际设备上使用。很多iOS功能(如加速计和访问音乐库等)是无法在模拟器上使用的,如果应用使用了这些功能,那么只能在设备上进行测试。
开发应用而不在设备上测试是绝对行不通的。应用只有在设备上运行,你才能知道应用的样子和行为。向App Store提交并未在设备上运行过的应用也是自讨苦吃。
在设备上运行应用是一件很复杂的事情。你需要在构建时对应用签名。没有针对设备进行恰当签名的应用是无法在该设备上运行的(假设没有越狱)。对应用签名需要两个东西:
一个身份
身份代表Apple允许团队在特定的计算机上开发的应用运行在设备上。它包含两部分:
私钥
私钥存储在计算机的钥匙链中。因此,它能识别出特定的计算机,团队可以在该计算机上开发应用,然后在设备上运行。
证书
证书是Apple颁发的一个虚拟许可。它包含了与私钥匹配的公钥(因为在申请证书时你向Apple提供了公钥)。借助证书的副本,拥有私钥的任何计算机实际上都可以在相应的团队名称下开发应用并在设备上运行。
配置文件
配置文件是Apple提供的虚拟许可,它包含了如下4项:
·一个身份。
·一个应用,通过其包id进行识别。
·符合条件的设备列表,通过其UDID(唯一识别标识符)进行识别。
·一个权利列表。权利指的是并非每个应用都需要的一个特权,比如,与iCloud通信的能力。只有编写需要权利的应用时才需要考虑这一点。
因此,在构建时,配置文件足以完成对应用的签名。它表示在这个Mac上所构建的应用是可以运行在这些设备上的。
有两种类型的身份,因此也有两种类型的证书,两种类型的配置文件:开发与发布(发布证书也叫作产品证书)。这里只关注开发身份、证书与配置;本章后面将会介绍发布方面的内容。
Apple公司是所有信息的最终保留者:证书、配置文件,以及注册的应用与设备等。当需要验证或获得这个信息的副本时,你与Apple公司之间的通信是通过如下两种方式达成的:
会员中心
一些网页,地址是https://developer.apple.com/membercenter。如果你是开发者计划成员,那么可以通过单击Certificates,Identifiers,& Profiles来访问当前会员类型与角色所能访问的所有特性与信息(这部分内容的正式名称叫作Portal)。
Xcode
除了获取发布配置文件,可以通过Xcode完成会员中心所能完成的一切事项。如果一切顺利,那么使用Xcode会更加简单!如果有问题,那么你可以访问会员中心寻求解答。
9.8.1 在没有开发者计划成员资格的情况下运行
过去,拥有iOS开发者计划成员资格是必要的前提,这意味着你需要支付年费才能在自己的设备上测试应用。不过在Xcode 7中,你可以在没有开发者计划成员资格的情况下配置应用在你的设备上运行。你所需要的只不过是一个Apple ID而已,而你肯定会有的。
因此,在介绍设备上运行应用的详情前,我先来谈谈在没有做任何准备的情况下如何在设备上运行你的应用:没有开发者计划成员资格、没有在Xcode中输入任何账户信息,之前也从未在设备上运行过应用:
1.编辑应用目标,切换至General窗格,查看Team弹出菜单。假设现在还没有团队,你首先要做的事情就是创建一个。从Team弹出菜单中选择Add an Account;这会打开Xcode账户首选项窗格,类似于按下“+”按钮并选择Add Apple ID。输入你的Apple ID与密码,这会创建一个免费账户。关闭账户首选项窗格。回到Team弹出菜单,选择刚才创建的团队。
2.在Team弹出菜单下,你会看到一个警告,告诉你还没有代码签名身份。单击Fix Issue。Xcode会与会员中心进行通信。这个问题会得到部分解决,不过你会看到一个对话框:“Unable to create a provisioning profile because your team has no devices registered in the Member Center...”。单击Done。
3.将设备关联到计算机上。等待符号文件进行处理(可以追踪这一过程,方式是选择Window→Devices并选中设备,这时可以喝杯咖啡,过会儿再过来了)。
4.现在,设备可用于开发了。在方案弹出菜单中将设备作为目标,运行项目!你会看到一个对话框:“Failed to code sign...”。单击Fix Issue。Xcode会再次与会员中心进行通信,接下来应用就会构建并在设备上运行了。
在后台,Xcode执行了如下几个必要的步骤:
·它在钥匙链中创建了一个开发者身份(可以通过钥匙链访问应用看到)。
·将你的设备注册到了会员中心(由于没有开发者计划成员资格,你无法直接登录到会员中心看到这一点)。
·创建并下载了一个团队配置文件,对上述内容进行了整合,也就是说,你的应用可以从这台计算机在该设备上运行了。
9.8.2 获取开发者计划成员资格
你早晚会需要一个开发者计划成员资格。进入iOS开发者计划页面(http://developer.apple.com/programs/ios)完成注册流程。一开始,个人计划就足够了。组织计划不会增加成本,不过可以添加其他开发者,并赋予不同角色。如果只是向其他用户分发应用来进行测试,那就不需要组织计划了。
iOS开发者计划成员涉及如下两点:
一个Apple ID
这是个用于在Apple网站标识你自己的用户ID(还有相应的密码)。你可以通过自己的开发者计划Apple ID做所有事情。除了准备应用以在设备上运行,你还可以通过该Apple ID在Apple开发论坛上发帖、下载Xcode Beta版等。
一个团队名称
同一个Apple ID可以隶属于多个团队。在每个团队中,你都会有一个角色,指明了你的权利是什么。如果你是团队的领导(或是团队中的唯一成员),那么你的角色就是Agent,这意味着你可以做一切事情:可以开发应用、在设备上运行、向App Store提交应用,并获取付费应用的收益所得。
创建了开发者计划Apple ID后,你应该在Xcode的账户首选项窗格中输入它。单击左下角的“+”按钮并选择Add Apple ID,输入Apple ID与密码。从现在开始,Xcode可以通过与这个Apple ID关联的团队名称识别出你;无须再向Xcode提供密码了。
9.8.3 获取证书
创建身份并获取证书(见图9-10)只须做一次即可(也许一年最多一次;如果每年的开发者计划成员过期并进行更新,你可能还要做一次)。还记得吧,证书依赖于私钥公钥对。私钥位于钥匙链中;公钥则会发送给Apple,它会被构建到证书中。你发给Apple公钥是通过对证书的请求进行的。理想情况下,你可以通过Xcode轻松做到这一点:
1.打开Xcode的账户首选项窗格。
2.如果没有输入过开发者Apple ID与密码,请现在输入。
图9-10:Keychain Access中显示的有效的开发证书
3.在左侧选择Apple ID,在右侧选择团队,单击View Details。
4.如果有证书,但被会员中心取消,但证书依旧有效,那就会看到一个请求并下载证书的对话框。单击Request。否则,单击iOS Development右侧的Create按钮。
接下来一切都会自动发生:私钥公钥对会在钥匙链中生成,证书请求会发送给会员中心、生成并下载,然后存储到钥匙链中,并列在Xcode账户首选项窗格View Details对话框的Signing Identities下面。此外,通用的团队开发配置文件也可能会生成,如图9-11所示。这样就具备了在设备上运行应用的全部。
图9-11:通用开发配置
了解生成私钥公钥对与证书请求的手工处理过程也是很有益的。过程发起后,处理命令也可以在会员中心找到(进入Certificates页面,单击右上角的“+”按钮):
1.启动Keychain Access并选择Keychain Access→Certificate Assistant→Request a Certificate from a Certificate Authority。将你的名字与Email地址作为标识符,生成一个2048位的RSA证书请求文件,并保存到磁盘中。私钥存储在钥匙链中;包含公钥的证书请求会被临时保存到计算机中(比如,可以保存到桌面上)。
2.在会员中心,你会看到一个上传所保存的证书请求文件的界面。上传,接下来会生成证书;单击会员中心的列表显示出Download按钮,然后单击Download。
3.找到并双击刚才下载的文件;Keychain Access会自动导入证书并将其存储到钥匙链中,现在Xcode也会看到它。
你不需要保存证书请求文件与下载的证书文件;钥匙链现在包含了所有需要的凭证。如果一切正常,你可以在钥匙链中看到证书,查阅其详细信息,你会发现它是有效的,并且链接到了私钥(如图9-10所示)。此外,你可以确认Xcode现在已经知道了该证书:在账户首选项窗格中,单击左侧的Apple ID与右侧的团队名称,然后单击View Details;这时会弹出一个对话框,你会看到顶部列出了一个iOS开发签名身份,其状态是有效的。
如果这是你第一次从会员中心获取证书,那么你还需要另一个证书:WWDR Intermediate Certificate。该证书用于证明由WWDR(Apple Worldwide Developer Relations Certification Authority)所颁发的证书是受信的(你不能自己创建)。Xcode应该会自动在钥匙链中安装该证书;如果没有,那么可以在添加证书的过程中,手工单击会员中心页面底部的链接获取其一份副本。
9.8.4 获取开发配置文件
如前所述,配置文件统一了身份、设备与应用包。如果一切顺利,那么你可以通过Xcode一步获取到开发配置文件,这是最简单的情形。如果应用不需要特殊的功能,那么与团队关联的单个开发配置就可以满足所有应用的需求,因此这一步只需执行一次即可。
通过9.8.3节的操作,你已经拥有了一个开发身份,可能还获取到了一个统一的团队开发配置文件!如果没有,那么最简单的办法就是打开Xcode并将设备连接到计算机上,经过一小段时间后(比如,告诉设备信任计算机等),将设备作为目标,并在其上运行项目。Xcode会帮你在会员中心注册设备,并且为该设备创建和下载统一的团队配置文件。
要确认设备已经添加到了会员中心,请打开浏览器访问会员中心,并单击Devices。要确认已经拥有了统一的团队开发配置文件,请单击账户首选项窗格的View Details(选择恰当的团队)。证书与文件都列在那儿。除了标题“iOS Team Provisioning Profile”,统一的团队开发文件有一个与之关联的普通的应用包id,通过一个星号标识(如图9-11所示)。
可以通过统一开发文件针对测试目的在目标设备上运行任何应用,只要应用不需要特殊功能即可(比如,使用iCloud)。
还可以手工在会员中心注册设备。在Devices下,单击“+”按钮并输入设备名与UDID。可以从Xcode的设备窗口中复制设备的UDID。此外,可以提交Tab分隔的UDID文本文件与名字。
根据需要,可以在会员中心为特定应用创建配置文件:
1.确保应用已经通过Identifiers→App ID在会员中心注册了。如果尚未注册,那就添加一个,如下所示:单击“+”按钮并输入该应用的名字。会员中心会为包标识符添加一个无意义的字母与数字前缀,不用管它们;使用Team ID。在Explicit App ID下输入Xcode中所显示的包标识符,在编辑应用目标时,这个包标识符位于Xcode General窗格的Bundle Identifier域中。
2.在Provisioning Profiles下单击“+”按钮。申请一个iOS应用开发配置文件。在下一个界面中选择App ID。接下来检查开发证书。然后选择想要运行的设备。接下来为该配置文件起个名字,单击Generate。最后单击Download按钮。
3.找到下载的配置文件,双击它以在Xcode中将其打开。然后就可以将下载的配置文件删除了,因为Xcode已经拥有了一个副本。
9.8.5 运行应用
拥有了适用于应用与设备的开发配置文件后(对于统一团队配置文件来说,就是所有应用与所有注册的设备),请连接设备,在方案弹出菜单中将其作为目标,然后构建并运行应用。如果要求提供对钥匙链的访问,请授权。如果必要,Xcode会将相关的配置文件安装到设备上。
应用构建,然后加载到设备上,最后在设备上运行。只要是在Xcode中启动应用,那么一切就像是在模拟器中运行一样;你可以运行、调试,运行着的应用可以与Xcode通信,这样就可以停在断点处,查看控制台中的信息等。区别在于你是通过设备(连接到了电脑上)而非模拟器与应用进行交互。
通过Xcode在设备上运行应用还可以用于将当前版本的应用复制到设备上。接下来可以停止应用的运行(在Xcode中操作),断开设备与电脑的连接,在设备上启动应用,然后使用。这是一种非常棒的测试方式。现在不是在调试,因此无法从Xcode获得反馈,不过稍后可以获得写到内部控制台的信息。
9.8.6 配置文件与设备管理
可以通过Xcode的账户首选项窗格查看身份与配置文件。
账户首选项窗格的一个重要特性是它可以导出账户信息。如果想在不同的计算机上开发,那么你就需要这个特性。选中一个Apple ID,然后选择窗格底部齿轮菜单中的Export Developer Accounts。你需要提供一个文件名以及保存的位置,还需要一个密码;这个密码只与该文件有关系,并且只在另外一台计算机上打开该文件时才需要。将之前导出的文件复制到另外一台计算机上,然后运行Xcode并双击导出的文件;Xcode会要求你提供密码。输入完密码后,整个团队、身份、证书与配置文件就会神奇地出现在这个Xcode中,甚至包括钥匙链中的那些内容。
此外,你可能只想导出身份,而不导出配置文件。这可以通过账户首选项窗格View Details对话框中的上下文菜单实现。
如果账户首选项窗格View Details对话框中列出的配置文件与会员中心的不同步,那么请单击左下角的Download All按钮。如果这么做不起作用,那么请关闭Xcode,然后在Finder中打开用户目录下的Library/MobileDevice/Provisioning Profiles目录,删除里面的全部内容,重新启动Xcode。在账户窗格下,配置文件会消失不见,现在再单击Download All按钮。Xcode会下载配置文件的新副本,这样配置文件就会与会员中心同步了。
当设备连接到了计算机上时,它会出现在Xcode的设备窗口中。单击其名字可以查看设备的信息。你会看到(也可以复制)设备的UDID,以及(也可以删除)使用Xcode进行开发时在设备上安装的应用。可以实时查看设备的控制台日志(这个界面有点隐蔽:请单击设备窗口主窗格左下角的向上小箭头)。借助齿轮菜单,你可以查看到安装到设备上的配置文件。可以查看到设备上出现的崩溃日志报告;还可以对设备界面进行截屏;在将应用提交到App Store时,你需要这么做。