iOS 企业内部(In-House)应用分发

去年8月份的时候由于公司的需求,开发了一个只在司机间使用的企业内部的iOS应用,当时就打算写一篇文章来总结一下了,然而我是重度拖延症患者,一直拖着没完成。一年过去了,今天才想起来这回事,才开始动手写这篇文章。

企业内部应用

企业内部应用,即只在企业部门和员工内部使用、不对外公开的应用。苹果提供了专门的In-House证书用来发布这种应用,可以分发给任意的手机,只要通过一个URL即可下载安装,不用上传到App Stroe审核。我把企业内部应用也叫做In-House应用。

In-House应用,有时需要根据部门需求进行版本的快速迭代,因为不需要App Store审核,所以可以做到随时修改,随时发布,节省了大量的时间。In-House证书还可以用于应用的内测分发,现在大部分的内测分发平台如蒲公英,Fir.im等的公测功能就是使用In-House证书实现的。

必须具备的两个条件:

  • 企业开发者账号。99$的普通开发者账号不行,必须以企业的名义申请一个299$的企业开发者账号Apple Developer Enterprise Program
  • 带SSL证书的域名。企业内部应用需要把ipa文件上传到服务器,然后通过一个链接来下载安装,而苹果很重视安全性,要求这个链接的域名必须具有SSL证书,支持 https ,否则无法安装。

SSL证书其实并不是必需的,可以使用一些知名的云存储服务,比如亚马逊的AWS,阿里云等,这些大公司的云存储都支持Https,我用的就是AWS的S3云存储,但299$的企业开发者账号就避免不了。

准备的文件

  • ipa文件。
  • plist文件。名称必须与ipa文件一致,用于配置bundle id、版本号、ipa文件的URL、应用图标等。
  • @1x 和 @2x 的Icon。下载安装时显示应用图标。

打包

  1. 创建发布证书(Production Certificates),选择In-House类型的,过程我就不赘述了,和其他证书一样。
  2. 创建配置文件(Distribution Provisioning Profiles)

  3. 在Xcode选择对应的Code Signing 和 Provisioning Profile, Archive


  4. 导出 ipa 文件

plist 文件

Xcode 5 及其以前打包In-House应用会一起生成ipaplist文件,但Xcode 6 以后就只有ipa文件了,所以要手动生成 plist文件。
文件格式如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>items</key>
        <array>
            <dict>
                <key>assets</key>
                <array>
                    <dict>
                        <key>kind</key>
                        <string>software-package</string>
                        <key>url</key>
                        <string>[INSERT THE URL FOR YOUR IPA HERE. e.g : https://s3-us-west-2.amazonaws.com/folder/appName-version.ipa]</string>
                    </dict>
                    <dict>
                        <key>kind</key>
                        <string>full-size-image</string>
                        <key>needs-shine</key>
                        <true/>
                        <key>url</key>
                        <string>[INSERT THE URL FOR INSTALLATION @2x ICON HERE. e.g : https://s3-us-west-2.amazonaws.com/folder/images/Icon@2x.png]</string>
                    </dict>
                    <dict>
                        <key>kind</key>
                        <string>display-image</string>
                        <key>needs-shine</key>
                        <true/>
                        <key>url</key>
                        <string>[INSERT THE URL FOR INSTALLATION ICON HERE. e.g : https://s3-us-west-2.amazonaws.com/folder/images/Icon.png]</string>
                    </dict>
                </array>
                <key>metadata</key>
                <dict>
                    <key>bundle-identifier</key>
                    <string>[INSERT BUNDLE ID HERE]</string>
                    <key>bundle-version</key>
                    <string>[INSERT VERSION HERE]</string>
                    <key>kind</key>
                    <string>software</string>
                    <key>title</key>
                    <string>[INSERT APP TITLE HERE. The Title will present to the user installing the app]</string>
                </dict>
            </dict>
        </array>
    </dict>
    </plist>

plist文件中输入ipa的URL、安装时显示的 icon 的url、bundle id、版本号、安装前的提示信息。

发布与安装

发布

ipa、配置好的plist 文件和图标一起上传AWS的S3云存储上即可。

安装

iOS的企业内部应用是通过访问plist文件来安装的,因为plist文件中包含了对应的ipa文件和图标的URL,iPhone会根据URL自动下载并安装应用程序。

在iPhone的Safari浏览器中输入:

itms-services://?action=download-manifest&url=https://s3-us-west-2.amazonaws.com/folder/appName-version.plist

首先会询问是否打开要打开链接,点击“打开”

然后询问是否要安装App,点击“安装”

自动更新

为了避免每次发布后都需要通知别人更新App的麻烦事,自动更新是必备的。与后台沟通,设计一个更新接口GET /updates

Query Parameters
name required type description
platform YES String 平台,ios / android
version YES String 当前版本号,比如:1.0.0
Response

Status-Code: 200 OK

{
    "data": {
        "update" : true,
        "lastest" : "1.0.1",
        "url" : "itms-services://?action=download-manifest&url=https://s3-us-west-2.amazonaws.com/folder/appName-1.0.1.plist"
    },
    "error": {}
}

App一启动时,调用GET /updates接口传递平台参数和当前版本号给后台进行检查,后台判断当前版本是否为最新版,如果不是最新版,则返回最新版本号和对应的下载链接,然后用浏览器打开返回的URL进行安装即可。

代码如下:

func upgrade()
    {
        let params = [
            "platform" : "ios", 
            "version" : CKAppInfo.releaseVersion()
        ]
        ObjectRequest(URLRequest: UpdateRouter.CheckUpdate(params)).load(
            successHandler: { (promotion: Promotion?) -> Void in
                SWLog(promotion)
                
                if promotion?.update == true { // different version
                    
                    let alert = DVAlertController(title: "Upgrade", message: "update to latest version", preferredStyle: UIAlertControllerStyle.Alert)
                    alert.addAction(UIAlertAction(title: "Upgrade", style: UIAlertActionStyle.Default, handler: { (_) -> Void in
                        let url = NSURL(string:promotion!.url!)
                        UIApplication.sharedApplication().openURL(url!)
                    }))
                    
                    alert.show(animated: true, completion: nil)
                    SWLog("different version")
                }
            }, failHandler: { (error) -> Void in
                self.creatAlert("checkout upgrade failed")
        })
    }

不信任的企业开发者

如果你的手机是 iOS 9 系统,那么第一次打开企业级应用时,你并不能打开App,而是看到下面的信息:

苹果是一个极其重视安全性的公司,iOS 9 以后,安装的企业级应用在第一次打开之前必须要用户手动去信任这些App,参考Guidelines for installing custom enterprise apps on iOS。具体步骤如下:

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

推荐阅读更多精彩内容