iOS OTA 环境部署

一、Mac OS X 启用 web 服务器

Mac OS X 自带了Apache环境,我们只需要启动它就行了,可以通过在终端(terminal)输入 httpd -v 来查看Apache的版本信息:

$ httpd -v
Server version: Apache/2.4.18 (Unix)
Server built:   Feb 20 2016 20:03:19

启动Apache

在终端输入 sudo apachectl start 就可以启动Apache。

启动后,在浏览器中输入 http://127.0.0.1http://localhost 如果看到 It Works! 页面:

itworks.png

Apache 就启动成功了,站点的根目录为系统级根目录:

/Library/WebServer/Documents

停止Apache:

sudo apachectl stop

重启Apache:

sudo apachectl restart

二、开启 HTTPS 服务

iOS 7.1 以上的设备部署OTA环境必须使用HTTPS,可以配置Apache开启HTTPS服务。

创建自签名证书

  1. 首先创建一个ssl目录用来存放证书:

     $ cd /etc/apache2/
     $ sudo mkdir ssl
     $ cd ssl
    
  2. 创建主机密钥:

     $ sudo ssh-keygen -f 192.168.3.112.key
     Generating public/private rsa key pair.
     Enter passphrase (empty for no passphrase): 
     Enter same passphrase again: 
     Your identification has been saved in   192.168.3.112.key.
     Your public key has been saved in 192.168.3.112.key.pub.
     The key fingerprint is:
     SHA256:bNX90ww2g2GCh38Q/h68JnazkZYtnbkMEb1G5E51QWw root@XXdeiMac.local
     The key's randomart image is:
     +---[RSA 2048]----+
     |         oo.o +o+|
     |        o.o+ B E.|
     |         oo.+ %  |
     |       . ..o.* B.|
     |        S  .= +.+|
     |       .   . X o.|
     |          o & =  |
     |         . = B . |
     |            . o  |
     +----[SHA256]-----+
     $
    

    执行 sudo ssh-keygen -f 192.168.2.112.key 命令,会被要求提供一个密码用于主机密钥,可以选择任何的密码或直接留空。其中192.168.2.112是指Mac的内网地址,下同。

    也可以使用下面的命令创建密钥:

     $ sudo openssl genrsa -out 192.168.2.112.key 2048
     Generating RSA private key, 2048 bit long modulus
     ....+++
     ....+++
     e is 65537 (0x10001)
     $
    
  3. 创建签署申请:

     $ sudo openssl req -new -key 192.168.2.112.key -out 192.168.2.112.csr
     You are about to be asked to enter information that will be incorporated
     into your certificate request.
     What you are about to enter is what is called a Distinguished Name or a DN.
     There are quite a few fields but you can leave some blank
     For some fields there will be a default value,
     If you enter '.', the field will be left blank.
     -----
     Country Name (2 letter code) [AU]:
     State or Province Name (full name) [Some-State]:
     Locality Name (eg, city) []:
     Organization Name (eg, company) [Internet Widgits Pty Ltd]:
     Organizational Unit Name (eg, section) []:
     Common Name (e.g. server FQDN or YOUR name) []:192.168.2.112
     Email Address []:
    
     Please enter the following 'extra' attributes
     to be sent with your certificate request
     A challenge password []:
     An optional company name []:
     $
    

执行 sudo openssl req -new -key 192.168.2.112.key -out 192.168.2.112.csr 命令后,系统会提示输入各项信息,由于这是自签名的证书,除了 Common Name (e.g. server FQDN or YOUR name) []: FQDN( fully qualified domain name)必须是服务器域名或 IP 外,其他都不重要,可以随意填写或一路回车。

  1. 创建SSL证书:

    在生产环境中,我们需要提交证书申请(CSR)文件给证书颁发机构,由证书颁发机构提供SSL证书。

     $ sudo openssl x509 -req -days 365 -in 192.168.2.112.csr -signkey 192.168.2.112.key -out 192.168.2.112.crt
     Signature ok
     subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=192.168.2.112
     Getting Private key
     $
    

    我们也可以直接通过以下的命令创建证书:

     $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout 192.168.2.112.key -out 192.168.2.112.crt
    
  2. 创建NOPASS密钥:

     $ sudo openssl rsa -in 192.168.2.112.key -out 192.168.2.112.nopass.key
    

    到目前为止SSL目录下已经创建了下面一些文件,这些文件将在后面被用到:

     $ ls -l
     -rw-r--r--  1 root  wheel  1180 10 22 13:08 192.168.2.112.crt
     -rw-r--r--  1 root  wheel   993 10 22 11:58 192.168.2.112.csr
     -rw-------  1 root  wheel  1679 10 22 11:44 192.168.2.112.key
     -rw-r--r--  1 root  wheel   408 10 22 11:44 192.168.2.112.key.pub
     -rw-r--r--  1 root  wheel  1679 10 22 13:19 192.168.2.112.nopass.key
    

配置 SSL

  1. 编辑 /etc/apache2/httpd.conf 文件,删除下列代码前的注释符号 #:

     LoadModule ssl_module libexec/apache2/mod_ssl.so
     Include /private/etc/apache2/extra/httpd-ssl.conf
    
  2. 编辑 /etc/apache2/extra/httpd-ssl.conf 文件,添加 <VirtualHost>httpd-ssl.conf 中已经有一条 <VirtualHost> 记录,我们将其注释掉,新建一条:

     <VirtualHost *:443>
     #General setup for the virtual host
     DocumentRoot "/Library/WebServer/Documents"
     ServerName 192.168.2.112
    
     #SSL Engine Switch:
     SSLEngine on
    
     #Server Certificate:
     SSLCertificateFile "/etc/apache2/ssl/192.168.2.112.crt"
    
     #Server Private Key:
     SSLCertificateKeyFile "/etc/apache2/ssl/192.168.2.112.key"
    
     #SSL Engine Options:
     <FilesMatch "\.(cgi|shtml|phtml|php)$">
         SSLOptions +StdEnvVars
     </FilesMatch>
     <Directory "/Library/WebServer/CGI-Executables">
         SSLOptions +StdEnvVars
     </Directory>
     </VirtualHost>
    

检查配置文件并重启 Apache

命令行输入 $ sudo apachectl -t,可能会提示:

AH00526: Syntax error on line 92 of /private/etc/apache2/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

根据提示,编辑 /etc/apache2/httpd.conf 文件,删除下列这些代码前的注释符号 #

LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so

再次测试,显示 Syntax OK:

$ sudo apachectl -t
Syntax OK

说明测试通过,重启 Apache:

$ sudo apachectl restart

此时,就可以使用 HTTPS 访问本地服务了,在浏览器中输入 https://192.168.2.112/ 。

三、使用企业级证书打包生成ipa及plist文件:

打包具体步骤这里就不详述了,主要说一点,打包最后一步中,填写如下manifet.plist文件:

manifest.png

其中,各项都必须填写,URL是指相应文件在web服务器中的URL,比如ipa文件,如果直接放在服务器主目录下,则App URL为 https://192.168.2.112/TESTAPP.ipa

各项都填写好,Export ipa成功后,需要将 ipa、两个image文件以及manifest.plist文件放到刚刚填写的URL对应的服务器目录下。

四、为web服务器生成首页文件:index.html :

  1. 创建一个如下内容的index.html文件:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://     www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>应用名字</title>
    </head>
    <body>
    <h1 style="font-size:40pt">iOS应用OTA安装<h1/>
    <h1 style="font-size:40pt">
    <a title="iPhone" href="itms-services://?action=download-manifest&url=https://192.168.3.112/manifest.plist">点击安装</a>
    <h1/>
    <a title="iPhone" href="http://192.168.3.112/192.168.3.112.crt">ssl 证书安装</a>
    <h1/>
    </body>
    </html>
    

    其中,https://192.168.3.112/manifest.plist指向打包生成的plist文件,http://192.168.3.112/192.168.3.112.crt指向服务器中的CA证书,也就是上述生成crt证书,因此,需要将上述生成的crt证书copy到web服务器目录下。

  2. 将index.html放到web服务器主目录下。

  3. 为了使web服务器能够正常的传输plist及ipa文件,需要配置 Web 服务器,设定服务器 MIME 类型,即编辑/etc/apache2/mime.types文件,添加如下两种类型:

     application/octet-stream ipa
     text/xml plist
    
  4. 打开iPhone或者iPad中的浏览器,输入web服务器地址:https://192.168.2.112,如果出现如下内容,说明服务器已搭建成功:

home.png

先点击ssl安装证书安装相应的CA证书,然后在点击点击安装进行app安装。

五、安装过程中可能遇到的问题及解决方案:

  1. 显示下载失败:

    官方文档中指出三种原因:

    1)请确定应用已正确进行签名。测试方法是使用 Apple Configurator 2 将它安装到设备上,然后查看是否发生错误。

    2)请确定清单文件的链接是否正确,清单文件是否可供网络用户访问。

    3)请确定 .ipa 文件(在清单文件中)的 URL 是否正确,并且该 .ipa 文件是否可供网络用户通过 HTTPS 访问。

  2. 无法连接到“192.168.3.112”:

    1)是否先下载了CA证书

    2)CA证书中的服务器与
    <a href="itms-services://?action=download-manifest&url=https://192.168.3.112/manifest.plist">Install App</a>中的url是否匹配,因为点击下载时,iOS会使用下载下来的CA证书进行验证,只有验证通过才能进行下载安装。比如我就出现这个问题,CA证书中服务器是自己定义的域名,而manifest中的url用的是IP地址。

  3. 无法下载应用程序 此时无法安装“XXX”:

    1)我出现这个问题的原因是,没有提供Xcode打包时,manifest.plist中指定的两个image,将两个相应的image放到web服务器中后就可以下载安装了。

参考文章:
http://help.apple.com/deployment/ios/#/apda0e3426d7
//www.greatytc.com/p/35ca63ec0d8e
//www.greatytc.com/p/d006a34a343f

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

推荐阅读更多精彩内容