在企业内部分发 iOS 应用程序

在企业内部分发 iOS 应用程序非常复杂。经过努力,我成功实现了在企业内部的应用程序分发。我决定用此文来记录我的最佳实践方法,以供将来参考。

如果你希望通过 Safari 能在任意的 iOS 设备上安装应用程序 (不需要发布到 App Store,也不需要通过 iTunes,以及 MDM – 通过 MDM 方法会用到本文创建的 IPA manifest,那么这篇文章可以帮助你。

在开始发布企业应用之前,需要具备以下条件:

1. 必须是 iOSDeveloper Enterprise Program 中的团队成员 (至少是一个 admin)。每年需要向苹果支付费用 299$。普通的 iOS Developer Program 无法进行企业应用发布。腻味苹果希望额外确保客户能够对你和你的公司信任,所以你需要申请企业计划。公司的 CEO 需要跟苹果签一个合同。

2. 域名需要一个有效的 SSL 证书,该域名用来放置应用程序。没有有效的 SSL 证书,iOS 设备将无法从站点安装应用程序。这样的 SSL 证书也非常昂贵。

下面介绍一下我开发中的相关环境配置。我使用 Xcode 5.1,和 iOS 7.1。我还是一个 iOS Developer Program team admin 成员。互联网上我发现许多过时的相关设置。如果在以后,你发现了错误,或者有更好的解决方案,请回复告诉我!

要想按照本文完成应用的企业分发,必须按照以下内容作为出发点: 1. Xcode 中有一个用于企业级分发的工程。 2. iOS Developer Enterprise Program team 中为此工程创建一个 App ID。稍后将在配置文件中使用到这个 ID。如果还没有准备好这些,先来这里 创建一个恰当的 App ID。此处不再详细介绍如何创建 App ID

在本文中,我们将创建下面这些内容:

1. 创建发布证书 (distribution certificate)

2. 创建配置文件 (provisioning profile)

3. 创建 IPA manifest

创建发布证书 (distribution certificate)

针对企业级发布,需要一个发布证书 (发布证书与开发证书不同)对代码进行签名。这个证书仅对创建发布的应用程序有用。不能在 Xcode 的开发中使用。

如何获得发布证书:在 iOSDev Center 中,导航至 Certificates 小节。这里需要登录到企业开发中心!另外还需要一个至少是 admin 的角色成员 (点击查阅iOS 开发中心更多关于角色介绍)。然后点击 Production,会看到如下内容(敏感部分已经涂黑)

在企业内部分发 iOS 应用程序在上图中,列出了创建好的所有证书。如果已经创建了一个发布证书,可以重用。不过,重要的是创建证书时所用的证书签名请求文件。如果这个文件没有,那么在 Keychain 中的证书将不会有对应的私钥,也就不能用这个证书对代码做签名。


如果你已经记不得是否创建过证书,可以先下载相关的证书,然后双击打开它,在 Keychain Access 应用程序中可以看到相关信息。如果在证书的左侧有一个小的箭头,那么说明在你们的 Mac 电脑中已经存储了此证书对应的私钥,也就可以用该证书对代码进行签名。通过单击箭头展开证书,看起来如下图所示:

如果没有箭头,说明还没有私钥。要么就是私钥存储在另外一台 Mac 电脑,那么可以将其传到当前 Mac 电脑中。要么就是你没有私钥,这种情况下,你是不能用这个证书来签名分发应用程序的。解决办法就是:在苹果开发网站中试试别的证书,或者创建一个新的证书:通过在 Mac 电脑中创建一个新的证书签名请求文件。

如果还没有构建的话,通过点击右上角的 ? 按钮来创建发布证书,会看到如下界面 (希望截图与你看到的稍微有点不同)

在企业内部分发 iOS 应用程序

选中圆形按钮 In-House and Ad Hoc。不知道为何,当我为本文截图时,我无法点击这个按钮。可能是我已经创建了一个发布证书,所以这个按钮不可选。不管怎样,你应该可以选这个按钮的。

在接下来的界面中,会看到这样:

这个界面告诉你如何创建一个 CSR 文件,该文件用于证书的创建。如果你不知道是否已经创建好了这样的一个文件,那么建议在 Spotlight 中输入 certSigningRequest,对电脑中的内容进行搜索。如果有这样一个文件,可以将其用来创建证书,要是没有的话,就手动创建一个。

创建好 CSR 文件之后,点击 Continue 来到下一个界面:

在企业内部分发 iOS 应用程序

选择 CSR 文件,然后点击 Generate

现在,证书已经创建好了:

在企业内部分发 iOS 应用程序

将其下载到本地,然后双击安装到 Keychain中。

创建配置文件 (provisioning profile)

要创建用于发布的配置文件,定位到 Provisioning Profiles Distribution小节。然后点击右上角的 ? 按钮。现在看到如下图所示界面:

在企业内部分发 iOS 应用程序

选中 In House,然后单击 Continue。选择为程序创建的 App ID

在企业内部分发 iOS 应用程序

然后单击 Continue。现在选择正确的发布证书:

在企业内部分发 iOS 应用程序

单击 Continue。最后,命名配置文件,然后单击 Generate

下载生成的配置文件,双击安装它:

在企业内部分发 iOS 应用程序

创建 IPA manifest

打开 Xcode,开始创建 IPA 文件。单击左上角中的项目名称。在中间区域,选择 targets 中的项目名称。选择顶部的 General。在 Team 中,选择 iOS Developer Enterprise Program 团队的名称。(为了本文,我选择了私人账号中的团队,记得用企业团队替代!)

在企业内部分发 iOS 应用程序

在中间区域,选择 Project 中的工程名。单击顶部的 Build Settings。在 Code Signing 中选择发布证书:

在企业内部分发 iOS 应用程序

回到中间区域的 target 中。单击项目名称。单击顶部的 Build Settings。在 Debug, Any iOS SDK, Release Any iOS SDK 中选择发布证书。在 provisioning,选择之前创建的配置文件:

在企业内部分发 iOS 应用程序

记住,上面这样的配置无法从 Xcode 应用程序运行至设备中。这些配置仅用于发布。(你可以点击 ? Xcode 将编译整个工程,并尝试将程序运行到设备或者模拟器中。但是之后会看到一个错误信息)。现在,点击菜单中的 Product –> Archive。如果 Archive 不可用,那么需要在 run scheme 中选择一个真实的 iOS 设备。Run scheme 的意思是:

选择 Archive 将为程序创建一个 archive。位了创建一个 archive,需要按照上面介绍的,安装一个合适的配置文件。archiving 完成之后,Xcode 将在 Organizer 中显示 archive

在企业内部分发 iOS 应用程序

点击 Distribute...,选择 Save for Enterprise or Ad Hoc Deployment

在企业内部分发 iOS 应用程序

接着在下拉列表中选择之前创建的配置文件:

在企业内部分发 iOS 应用程序

接下来的界面中,勾选上 Save for Enterprise Distribution。将会呈现出一些文本框,此处允许你输入一些信息,这些信息将被填入程序的 manifest 文件中。这个 manifest 文件是一个 plist 文件,我们可以用文本编辑器对其编辑。所以,这里填错了没关系,稍后可以对其修改。我填入的信息如下所示:

在企业内部分发 iOS 应用程序

上面的 URL 就是 IPA 文件在互联网中可被访问的路径。注意:虽然后面的处理过程都是基于 HTTPS 的,不过 IPA URL 必须是 HTTP。(注释:译者尝试过 IPA 的路径可以是 http https,当然不排除以后苹果会严格限制)。


现在,你应该获得了两个文件,IPA 文件和一个 manifest 文件。将它们上传到服务器上 (一般通过 FTP),路径就是在 manifest 文件中指定的相关路径 (本示例的路径是mydomain.com/apps)。现在创建一个 html 文件,文件中包括如下 html 标记:

  1. <a href="itms-services://?action=download-manifest&url=https://mydomain.com/apps/MyInHouseApp.plist" id="text">Install the In-House App</a>

manifest 文件的路径必须是 HTTPS!将 html 文件跟 IPA manifest 文件一起放置到服务器上。

现在我们来了解一下 HTTPS/SSL:为了能够通过互联网安装 IPA 文件,自从 iOS 7.1 以来,苹果就强制要求,manifest 文件必须通过 HTTPS 方式加载。

为了允许 IPA 文件安装成功,HTTPS 连接需要用 SSL 证书来认证,这个证书是从证书签发中心那里针对域名注册得到的。这样的证书非常的昂贵。不过你都已经为 iOS Enterprise Developer Program 支付了299$,那证书的价格就不算什么了。

为了安装 IPA,我们在 iOS 设备的 Safari 中输入 html 文件的 URL 地址( HTTPS 开头),然后点击链接,并确认安装提示。

如果安装过程中又错误提示框,大多数时候这个错误提示框无法定位具体原因。为了找到错误原因,将 iOS 设备连接到电脑,在 Xcode 中的 Organizer 里面选择对应设备中的 Console,就可以看到并分析相关的日志信息:

在上面示例中,我试图使用自签名的证书,通过 HTTPS 来安装程序。但是点击连接之后,我遇到了一个错误提示信息:Cannot connect to johannesluderschmidt.de。通过 Xcode 中的 Console,我看到这些信息:

  1. NSErrorFailingURLStringKey=https://johannesluderschmidt.de/app/appName.plist, NSUnderlyingError=0x165c7f30 “The certificate for this server is invalid. You might be connecting to a server that is pretending to be “johannesluderschmidt.de” which could put your confidential information at risk.”

看吧,Safari 给的提示信息很少,但是在 console 中提供的信息就非常有用。

就是这样啦。非常容易,不是吗?我大约用了一天时间,并查阅了 stackoverflow 中的许多文章就搞定在企业内部分发 iOS 应用程序的技术原理了。

希望你也能很快掌握!


你可能感兴趣的:(在企业内部分发 iOS 应用程序)