iOS通过OTA方式分发应用的实现

本文转载自

链接 http://blog.csdn.net/close_marty/article/details/38441903

作者 close_marty

最近设计的同事找到我,说有没有什么方法可以很方便的获取和安装我们应用最新的测试包,然后还给我看了别人通过微信朋友圈分享测试包的做法。好吧,虽然我手头没有外网服务器,那我就在内网搭一个吧,然后先在内网实现通过wifi直接安装测试包。

首先大概说下OTA吧,OTA就是over the air,是一种无线发布方式,它可以实现app的在线安装,不再需要数据线。目前国内有不少团队通过使用企业证书+OTA的方式来发布自己的应用,所以你会看到有的网页上有某个应用的广告,你点击之后就直接提示你是否安装这个app,一旦你确定,它就直接在你的手机上安装了,这中间完全没有经过appstore的参与和审核。这也是实现在不越狱的手机上安装未经审核app的方法。不过我们自己的测试包都是使用开发者证书来打包的,所以只有指定的设备才可以安装。

要实现OTA,需要准备下面这三个文件,然后把他们放到自己的web服务器上,通过访问你的web页面来实现在线安装。

  1. *.ipa文件,也就是你的安装包,可以是开发者证书签名的,也可以是企业证书,看你的用途和目的

  2. *.plist文件,这个描述文件主要是用来说明应用的安装信息的,下面一个简单的sample

<?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>http://${YOUR_DOMAIN_DOTCOM}/${PATH_TO_BETA_IF_ANY}/${APPLICATION_NAME}.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>${BUNDLE_IDENTIFIER}</string>
<key>bundle-version</key>
<string>${APPLICATION_VERSION}</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>${DISPLAY_NAME}</string>
</dict>
</dict>
</array>
</dict>
</plist>

其中指定了ipa文件的具体存放路径。这个plist可以在打包的过程中自动生成,具体方法可以参考这里,我不再赘述
http://aaronparecki.com/articles/2011/01/21/1/how-to-distribute-your-iOS-apps-over-the-air

也可以通过正常流程打包完ipa包之后,根据ipa文件来生成plist文件,可参考第三方的工具

https://github.com/sveinungkb/ios-ota-buddy

还可以自己手动去编写这么一个文件或者自己写个脚本去生成,只要包含这些主要信息即可。

  1. 一个或简单或复杂的发布页面,目的是提供一个itms-services协议的链接,让用户访问这个链接即可实现在线安装。一个最简单的html页面就是下面这样。

<a href="itms-services://?action=download-manifest&url=https://xxx.xxx.xxx/xxx.plist">Install App</a>

整个OTA的核心就是苹果的itms-services协议, safari通过解析类似于itms-services://?action=download-manifest&url=https://xxx.xxx.xxx/xxxx.plist 这样的一个链接来实现在线安装。url就是你的*.plist文件所在的地址,在iOS7.1以前,这个url是没有限制的,在7.1之后,苹果做了修改,要求这个url必须是可信任的https链接。其他地方的链接并没有要求。

对于https链接,目前主流的有三种解决方案。

方案1:交给公司解决,让公司提供一个可信的https连接,这个最直接。
方案2:采用第三方的网站提供的https连接,比较常见的就是把plist上传到dropbox,然后分享出去,它的外链就是https的(不过dropbox已经被墙了,so...),国内网盘的外链貌似都是http的,基本可以忽略
方案3:使用自建的https连接
我们是个小团队,采用的方案3,但是这里有个问题,https是需要有证书的,而可信的证书必须是由知名的CA所颁发,当然,向这些知名的CA申请证书是需要money的。由于我使用OTA的目的只是在团队内部分发一下测试包而已,所以我们采用自签名的证书来加密https。

自签名分为两个步骤,首先生成自己的CA根证书,再用这个根证书去签名我们服务器所使用的证书。

  1. 生成自己的根证书
    生成自己的密钥对

openssl genrsa -out ca.key 1024

生成证书请求文件,并使刚刚的key来加密CA根证书

openssl req -new -x509 -days 365 -key ca.key -out ca.crt
其中-x509选项表示生成自签名的证书,生成证书会要求填一系列的东西,此时可以任意填写,也可以直接回车,Common Name (e.g. server FQDN or YOUR name) []:,这一项建议填写一个便于识别的名字,比如可以是你的名字或者代号。
完成到这里你就已经生成了自己的根证书了,你也和那些知名CA机构一样,用根证书给别人的证书签名啦。。撒花。。。不过由于你不知名,没有人会认可你的证书,所以你签名的所有证书都是不会被信任的。

  1. 生成服务器使用的证书,并用自己的根证书签名
    步骤基本同上:
    生成一个密钥对

openssl genrsa -out server.key 1024
生成证书请求文件
openssl req -new -key server.key -out server.csr
这里又需要填写之前的那一堆东西,值得注意的是,
Common Name (e.g. server FQDN or YOUR name) []:
这里一定要填写你的https连接所对应的域名或者是服务器Ip, 比如xxx.xxx.com或者是192.168.25.68这样。

接下来我们需要使用根证书对这个证书进行签名,但是在签名之前,需要做一些准备工作, 我们需要构建这样一个目录结构,在当前目录新建文件夹demoCA,
进入demoCA,在demoCA下创建两个文件index.txt和serial ,以及文件夹newcerts,其中index.txt的内容为空,serial的内容为01。
完成之后,就可以开始签名了

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
这条命令中涉及的所有文件都是在之前步骤中生成的,如果缺少了什么文件,最好回去检查一下步骤是否有问题。
命令执行后会要求确认是否进行签名,确认即可。
到这里,证书的构造已经完成,最终的目录结构应该是这个样子

20140808182350924.jpeg
  1. 让iOS设备信任你的根证书
    之前说过了,自签名的证书是不可信的,所以你需要让通过OTA方式来安装app的手机去信任你的证书。

方式1:把你的根证书文件,也就是ca.crt 放到web服务器的某个位置,然后iOS设备通过safari去访问这个文件就会直接提示用户安装证书,点击安装即可。(只能是safari,不能是其他浏览器)
方式2:通过email方式,把ca.crt作为附件通过邮件发送到iOS设备上,然后也可以打开安装
方式3:其他我不知道的方式,比如什么iPhone配置实用工具之类的,总之呢,就是让iOS设备去打开并安装ca.crt这个文件。

我采用的方式1,我把ca.crt的url和itms-services链接一起放在一个简单的发布页面install.html里面的,然后把html的地址生成个了一个二维码,发给大家。其他人扫描二维码,访问这个页面,然后点击两下,第一下安装证书,第二下安装app,就可以搞定了。

安装之后,这个证书文件就会变为可信的了。可以在iOS设备上的通用-描述文件中查看这个证书的状态。

  1. 修改itms-services协议中的url为https

比如itms-services://?action=download-manifest&url=https://172.16.8.53/OTA-Install/xxxxxxx..plist,当然如果已经是https的,那就不用改了。
至于ipa文件是否使用https并不重要,苹果只要求itms-services协议中的url字段使⽤用https。

至此就可以在iOS7.1及以上的设备中通过OTA方式安装了。

附1:
前面的 openssl req 和 openssl ca 命令,有可能需要增加一个config参数
-config ..\conf\openssl.cnf
不过我没有加,所以默认使用的
Using configuration from /System/Library/OpenSSL/openssl.cnf

附2:Apache服务器的openssl配置(mac OSX 环境)

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

推荐阅读更多精彩内容