Cordova 打包应用 - iOS篇

苹果开发知识储备

Certificates

Certificates 证书,是用来给应用程序签名(code sign),证明应用程序的合法性和完整性。对于想要安装到真机调试或者发布到应用商店的应用程序,只有经过签名,才能保证其来源可靠,并且代码完整,未经篡改的。

在Xcode Build Setting 的 Code Signing Identity 中,你可以设置用于为代码签名的证书。

  • 申请一个 Certificate 之前,需要先申请一个 Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你 Mac 的 Keychain 中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。
  • 如下图所示,在你 Mac 的 keychain 的 login 中存储着相关的公钥和私钥,而证书中包含了公钥。用私钥来进行签名,苹果就可以用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等。
  • 当你想与其他人或其他设备共享证书时,导出证书(.p12类型),把私钥传给它就可以了。


证书主要分为两类:Development 和 Production,Development 证书用来开发和调试应用程序,Production 主要用来分发应用程序。

Identifiers

App ID 用于标识一个或者一组 App,App ID 应该是和 Xcode 中的 Bundle ID 是一致的或者匹配的。App ID主要有以下两种:

  • An Explicit App ID Matches a Single App:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如 com.ABC.demo1,标识 Bundle ID 为 com.ABC.demo1 的程序。
  • Wildcard App IDs Match Multiple Apps:通配符App ID,用于标识一组应用程序。例如 * 可以表示所有应用程序,而 com.ABC.* 可以表示以 com.ABC 开头的所有应用程序。

Devices

Device 是指运行 iOS 系统用于开发调试 App 的设备。每台 Apple 设备使用 UDID 来唯一标识。设备的 UDID 可通过 iTunes->Summary 或者 Xcode->Window->Devices 获取。

Provisioning Profiles

一个 Provisioning Profile 文件包含了上述的所有内容:证书、App ID、设备

在打包应用程序或者在真机上运行调试一个应用程序的过程:

  • 使用 Certificates 证书来进行签名,用于标识该应用程序合法性和完整性
  • 指明该应用程序的 App ID,并且验证与 Bundle ID 是否一致
  • 到真机中运行调试该应用程序,确认该设备是否能够用来运行

Provisioning Profile 把这些信息全部打包在一起,在打包时嵌入 .ipa 的包里。如上所述,在一台设备上运行应用程序的过程如下:

与 Certificates 证书一样,Provisioning Profile 也分为 Development 和 Distribution 两种:

  • Development
  • Distribution: In House、Ad Hoc、App Store

注:使用 Development Provisioning Profiles 打包的应用程序在设备中运行,要求该设备 UDID 必须绑定添加到该 Provisioning Profiles 中,否则无法在该设备中运行。解决方法是:绑定添加该设备 UDID,更新 Provisioning Profiles,重新打包。

Xcode 调试

Xcode 模拟器调试

1
2
3
4
5
# 添加/移除 iOS 项目
phonegap platform add ios
phonegap platform remove ios
# 更新 iOS 项目
phonegap prepare ios

/platforms/ios 目录下双击打开 .xcworkspace 文件,Xcode 中选择对应的模拟器即可运行。

Xcode 真机调试

Xcode 真机调试需要申请 Certificates 证书,然后添加调试设备 UDID,生成 Provisioning Profiles(Development 类型),下载到电脑中,双击安装。
苹果设备连接电脑,Xcode -> Build Settings 设置 Code Signing Identity 和 Provisioning Profiles,设置完成后,选择该设备运行即可。

当然 Xcode7以后,无证书也能真机编译调试!

应用打包

cordova iOS 应用打包 参考文档

使用 Development 和 Distribution 的 Certificates 和 Provisioning Profiles 对应用程序进行打包的区别是:Development 打出来的包可以进行应用调试,譬如我们可以通过 Safari 对网页进行调试。

cordova 提供了一套打包解决方案,在项目根目录添加 build.json 文件,配置文件中需要指定的参数包括:

Parameter Flag Description
Code Sign Identity –codeSignIdentity Code signing identity to use for signing.
Provisioning Profile –provisioningProfile GUID of the provisioning profile to be used for signing. It is copied here on your Mac: ~/Library/MobileDevice/Provisioning\ Profiles/.
Code Sign Resource Rules –codesignResourceRules (Optional) Used to control which files in a bundle should be sealed by a code signature. For more details, read The OS X Code Signing In Depth article.
Development Team –developmentTeam This is new for Xcode 8. The development team (Team ID) to use for code signing. You would use this setting and a simplified Code Sign Identity (i.e. just ‘iPhone Developer’) to sign your apps, you do not need to provide a Provisioning Profile.
Packaging Type –packageType This will determine what type of build is generated by Xcode. Valid options are development (the default), enterprise, ad-hoc, and app-store.

解释一下需要用到的四个参数:

  • Code Sign Identity:应用程序签名时使用的证书标识。如下图
  • Provisioning Profile:Provisioning Profile 的 GUID。进入 ~/Library/MobileDevice/Provisioning\ Profiles/ 目录,即可获取到对应 Provisioning Profile 的 GUID
  • Development Team:开发团队 ID
  • Packaging Type:打包类型,包括:development、enterprise, ad-hoc, 和 app-store

build.json 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"ios": {
"debug": {
"codeSignIdentity": "iPhone Developer: Deng Yingshan (Z7********)",
"provisioningProfile": "91840e00-****-****-****-************",
"developmentTeam": "32********",
"packageType": "development"
},
"release": {
"codeSignIdentity": "iPhone Distribution: Zhuhai Kingsoft Office Software Co., Ltd.",
"provisioningProfile": "ce06cf9c-****-****-****-************",
"packageType": "enterprise"
}
}
}

❗️注意:

  • 签名证书 Identity 一定要和 Provisioning Profiles GUID 对应上,否则打包不成功
  • 打包类型 enterprise 即为使用 in house 类型的 Distribution Provisioning Profiles

Development

1
cordova build ios --device --debug
  • 打 Development 必须使用 Development 类型的 Certificates 和 Provisioning Profiles。
  • 配置文件中,在 debug 属性配置参数;打包命令指定 --debug

Distribution

1
cordova build ios --device --release
  • 打 Distribution 必须使用 Distribution 类型的 Certificates 和 Provisioning Profiles。
  • 配置文件中,在 release 属性配置参数;打包命令指定 --release
  • 由于 Distribution 类型包括:In House、Ad Hoc、App Store 三种,对应在配置文件中的 packageType 分别为:enterprise, ad-hoc, 和 app-store

最终打包成功后,我们在 platforms/ios/build/device 目录下找到 .ipa 文件

参考链接

Signing an App
关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系