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

本文译自:Provision iOS IPA App for In-House Enterprise Distribution
在企业内部分发 iOS 应用程序非常复杂。经过努力,我成功实现了在企业内部的应用程序分发。我决定用此文来记录我的最佳实践方法,以供将来参考。
如果你希望通过 Safari 能在任意的 iOS 设备上安装应用程序 (不需要发布到 App Store,也不需要通过 iTunes,以及 MDM - 通过 MDM 方法会用到本文创建的 IPA 和 manifest,那么这篇文章可以帮助你。
在开始发布企业应用之前,需要具备以下条件:
必须是 iOS Developer Enterprise Program 中的团队成员 (至少是一个 admin)。每年需要向苹果支付费用 299$。普通的 iOS Developer Program 无法进行企业应用发布。腻味苹果希望额外确保客户能够对你和你的公司信任,所以你需要申请企业计划。公司的 CEO 需要跟苹果签一个合同。
域名需要一个有效的 SSL 证书,该域名用来放置应用程序。没有有效的 SSL 证书,iOS 设备将无法从站点安装应用程序。这样的 SSL 证书也非常昂贵。

下面介绍一下我开发中的相关环境配置。我使用 Xcode 5.1,和 iOS 7.1。我还是一个 iOS Developer Program team 的 admin 成员。互联网上我发现许多过时的相关设置。如果在以后,你发现了错误,或者有更好的解决方案,请回复告诉我!
要想按照本文完成应用的企业分发,必须按照以下内容作为出发点:
在 Xcode 中有一个用于企业级分发的工程。
在 iOS Developer Enterprise Program team 中为此工程创建一个 App ID。稍后将在 配置文件中使用到这个 ID。如果还没有准备好这些,先来这里创建一个恰当的 App ID。此处不再详细介绍如何创建 App ID。

在本文中,我们将创建下面这些内容:
创建发布证书 (distribution certificate)
创建配置文件 (provisioning profile)
创建 IPA 和 manifest

创建发布证书 (distribution certificate)
针对企业级发布,需要一个发布证书 (发布证书与开发证书不同)对代码进行签名。这个证书仅对创建发布的应用程序有用。不能在 Xcode 的开发中使用。
如何获得发布证书:在 iOS Dev Center 中,导航至 Certificates 小节。这里需要登录到企业开发中心!另外还需要一个至少是 admin 的角色成员 (点击查阅iOS 开发中心更多关于角色介绍)。然后点击 Production,会看到如下内容 (敏感部位已经涂黑)


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

如果没有箭头,说明还没有私钥。要么就是私钥存储在另外一台 Mac 电脑,那么可以将其传到当前 Mac 电脑中。要么就是你没有私钥,这种情况下,你是不能用这个证书来签名分发应用程序的。解决办法就是:在苹果开发网站中试试别的证书,或者创建一个新的证书:通过在 Mac 电脑中创建一个新的证书签名请求文件。
如果还没有构建的话,通过点击右上角的 ➕ 按钮来创建发布证书,会看到如下界面 (希望截图与你看到的稍微有点不同):

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

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

选择 CSR 文件,然后点击Generate

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

上面的 URL 就是 IPA 文件在互联网中可被访问的路径。注意:虽然后面的处理过程都是基于 HTTPS 的,不过 IPA URL 必须是 HTTP。(注释:译者尝试过 IPA 的路径可以是 http 或 https,当然不排除以后苹果会严格限制)。
现在,你应该获得了两个文件,IPA 文件和 一个 manifest 文件。将它们上传到服务器上 (一般通过 FTP),路径就是在 manifest 文件中指定的相关路径 (本示例的路径是mydomain.com/apps
)。现在创建一个 html 文件,文件中包括如下 html 标记:

<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,我看到这些信息:

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 应用程序的技术原理了。
希望你也能很快掌握!

原文地址:http://beyondvincent.com/2014/07/30/2014-07-30-provision-ios-ipa-app-for-in-house-enterprise-distribution/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容