美文网首页iOS 开发tom技术其他
实现 iOS App 在线安装(局域网OTA)

实现 iOS App 在线安装(局域网OTA)

作者: sunljz | 来源:发表于2015-10-19 15:42 被阅读9036次

    因为数据线已经严重破损,动不动就会自动断开连接,而且一天到晚连着设备感觉它老是在边充电边放电。另外迭代测试的时候每次都要给测试发包,��忍受着那无下限的网速,所以就想做个 App 分发站点,直接在网页中点击安装,这样比较省事

    在网上找了一些资料,但实际搭建的过程中还是遇到不少问题,所以自己整理了一篇笔记,内容分为3个部分

    一、App 打包,生成 plist 文件

    1. 打包

    打包的方法就不再叙述了,最后输出 .ipa 包就可以
    但想要要在线安装,还需要一个 plist 文件
    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>http://172.17.22.124/test.ipa</string>
                    </dict>
                </array>
            <key>metadata</key>
                <dict>
                    <key>bundle-identifier</key>
                    <string>com.sunli.test</string>
                    <key>bundle-version</key>
                    <string>1.1.0</string>
                    <key>kind</key>
                    <string>software</string>
                    <key>releaseNotes</key>
                    <string>1.1版本发布</string>
                    <key>title</key>
                    <string>testDemo</string>
                </dict>
            </dict>
        </array>
    </dict>
    </plist>
    

    url 中需要填写你的 ipa 包下载地址
    bundle-identifier 填写你打包时的 bundle id
    bundle-version 版本号
    reseaseNotes 发布信息
    title app名称,下载时会弹出安装提示,提示内容包含 title

    特别说明:
    在线安装的前提是你的开发者证书已经对 iOS 设备授权,这里不涉及绕过苹果认证的内容

    二、启动 apache 服务,配置 Https

    1. 启动 Apache

    Mac OS X 自带了 Apache 服务,我们只需要启动它就可以了
    在终端中输入

    sudo apachectl start
    

    然后在浏览器中尝试输入 http://127.0.0.1 , 如果出现 It Works!那么就是启动成功

    站点的默认目录是 /Library/WebServer/Documents/

    2. 开启 Https 服务

    因为 iOS7.1 以后, Apple 不再支持 HTTP 方式的 OTA ,所以需要为 Apache 开启 HTTPS 服务

    ①. 制作 OpenSSL 证书

    生成服务器私钥

    mkdir /private/etc/apache2/ssl 
    cd /private/etc/apache2/ssl
    sudo openssl genrsa -out server.key 1024
    

    生成签署申请

    需要完整填写各项信息,Common Name必须是服务器 ip 或域名,其他信息可以随意填写

    sudo openssl req -new -key server.key -out server.csr
    

    如果这一步漏填信息,可能会导致最后生成的 ca 文件是空的

    生成 CA 私钥

    sudo openssl req  -new -x509 -days 365 -key ca.key -out ca.crt
    

    创建 demoCA

    在 ssl 目录下创建 demoCA 文件夹,然后进入 demoCA ,创建一个 index.txtserial ,index.txt 为空, serial 内容为01,然后再创建一个空文件夹 newcerts
    然后执行命令

    sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
    

    ②. 配置 SSL 服务

    编辑 httpd.conf 文件

    sudo vim /private/etc/apache2/httpd.conf
    

    把以下三行代码前头的注释去掉

    LoadModule ssl_module libexec/apache2/mod_ssl.so
    Include /private/etc/apache2/extra/httpd-ssl.conf
    Include /private/etc/apache2/extra/httpd-vhosts.conf
    

    注意:如果你的 httpd.conf 中缺少了某行,你可以自行添加进去即可。(我的 httpd.conf 中就没有后面两行,自己加上去的)

    编辑 httpd-ssl.conf 文件

    sudo vim /private/etc/apache2/extra/httpd-ssl.conf
    

    把以下两行代码的注释去掉

    SSLCertificateFile "/private/etc/apache2/server.crt"
    SSLCertificateKeyFile "/private/etc/apache2/server.key"
    

    全文搜索是要注意,可能它的路径和我贴的不一致
    然后修改路径,改成你的证书文件路径

    SSLCertificateFile "/private/etc/apache2/ssl/server.crt"
    SSLCertificateKeyFile "/private/etc/apache2/ssl/server.key"
    

    编辑 httpd-vhosts.conf 文件

    sudo vim /private/etc/apache2/extra/httpd-vhosts.conf
    

    在 *NameVirtualHost :80 后面添加

    NameVirtualHost *:443
    

    然后在文件末尾添加

    <VirtualHost *:443> 
        SSLEngine on 
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile /private/etc/apache2/ssl/server.crt
        SSLCertificateKeyFile /private/etc/apache2/ssl/server.key
        ServerName 172.17.22.124
        DocumentRoot "/Library/WebServer/Documents/"
    </VirtualHost>
    

    ServerName 填写你的 ip
    DocumentRoot 填写你的站点路径

    **检查 apachectl 配置 **

    sudo apachectl configtest
    

    如果它提示:Syntax OK ,那就完成90%了,如果它提示有错,那就要根据错误提示自行解决了
    我在这个环节遇到了一个错误

    SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
    

    解决方案是参考这篇文章 http://stackoverflow.com/questions/20127138/apache-2-4-configuration-for-ssl-not-working

    sudo vim /private/etc/apache2/httpd.conf
    

    然后把以下代码的注释去掉

    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    

    但我的配置文件中,路径跟上述的不一致,我的是下面这行

    LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
    

    去掉注释后,保存,重新检查配置,直到成功

    重启 Apache 服务

    sudo apachectl restart
    

    这样就可以用 https 访问本地服务器了

    三、建立在线安装服务

    跳转到你的站点目录,我是 /Library/WebServer/Documents/

    cd /Library/WebServer/Documents/
    

    然后把 plist 文件,ipa 包,还有前面生成在 ssl 目录中的 ca.crt 文件都拖到站点目录中
    然后新建网页

    sudo vim index.html
    

    输入以下内容

    <html>
    <body>
    <a href="itms-services://?action=download-manifest&url=https://172.17.22.124/test.plist" class="app_link">click to install app</a>
    <br><br>
    <a title="iPhone" href="http://172.17.22.124/ca.crt">ssl install</a>
    </body>
    </html>
    

    url中必须填写 https 开头的 ipa 包下载地址,然后下载前需要安装 ssl 证书,所以第二行附上 ca.crt 证书的下载地址

    最后在 iphone 的 Safari 浏览器中输入地址 http://172.17.22.124/index.html 或者 https://172.17.22.124/index.html
    先安装证书,再安装 app,大功告成!

    参考资料:
    http://www.jianshu.com/p/35ca63ec0d8e
    http://stackoverflow.com/questions/20127138/apache-2-4-configuration-for-ssl-not-working

    相关文章

      网友评论

      • __shunshun__:命令没对上吧
      • impBearXXX:MARK!
      • 1f107aff83c8:遇到了这么个问题,所有的操作都已完成就是在下载的时候 安装ssl证书 手机上显示 forbidden you do not have permission to access /ca.crt this server,您知道什么原因吗?谢谢
        heiheiwanne:我的也是显示证书无效
      • 小小小小饼:server.crt 这个文件怎么生成的呢
      • a577ad24f23a:是不是说,有了SSL认证就可以安装自己的ipa了是吧。那软件需要签名不?
      • 枫枫大世界:局域网的OTA 和 第三方如蒲公英,ipa下载安装速度上有明显的差别吗?
        cc6d7c66d0c1:@Aliv丶Zz 可能是企业证书有问题,查看证书是否过期。
        Aliv丶Zz:@18764080929 OTA安装提示无法下载项目,请稍后重试,是什么原因,又遇到吗?
        cc6d7c66d0c1:一个内网 一个外网 性质不同.
      • a3da2251f35e:你好,我这个有个能问一下吗?
        我做到生成 CA 私钥这一步时,失败了
        Mac-Mini:ssl admin$ sudo openssl req -new -x509 -days 365 -key ca.key -out ca.crt
        Password:
        Error opening Private Key ca.key
        4466:error:02001002:system library:fopen:No such file or directory:/SourceCache/OpenSSL098/OpenSSL098-52.10.1/src/crypto/bio/bss_file.c:356:fopen('ca.key','r')
        4466:error:20074002:BIO routines:FILE_CTRL:system lib:/SourceCache/OpenSSL098/OpenSSL098-52.10.1/src/crypto/bio/bss_file.c:358:
        unable to load Private Key

        这是什么原因或者问题呢?
        c40e2b876e8f:@a3da2251f35e 上述命令中的ca改为server
      • 纵横四海:搭建OTA 的应用必须是用企业账号发布的吗?
        纵横四海:@sunljz 嗯 知道了 。。。刚刚才知道 我们要做的是在线更新固件
        sunljz:@不会飞的猫 用企业账号只是可以给更多的人安装而已
      • zhouhao_180:你好,我启动Apache服务器后网页打开http://127.0.0.1显示页面加载失败,但是ping 127.0.0.1是通的,请问这个算成功嘛?还有mkdir /private/etc/apache2/ssl这部时,显示mkdir: /private/etc/apache2/ssl: Permission denied不允许创建文件夹
        cc6d7c66d0c1:终端: su root 后在执行 mkdir /private/etc/apache2/ssl
      • 雄心Best:能详细解释下这里吗?怎样找到SSL目录呢,能截图看下吗?新手,不懂,求指教
        创建 demoCA

        在 ssl 目录下创建 demoCA 文件夹,然后进入 demoCA ,创建一个 index.txt 和 serial ,index.txt 为空, serial 内容为01,然后再创建一个空文件夹 newcerts
        然后执行命令

        cc6d7c66d0c1:终端: cd /private/etc/apache2/ssl
        Finder: 前往文件夹 /private/etc/apache2/ssl
      • 3727db4452eb:我之前维护的项目都是这样操作的,我用企业证书打包完成后,将ipa包发给后台的同事,后台同事把包放到公司的服务器上,替换掉之前的旧版本,并修改plist文件中的版本号,数据库插入一条新版本的纪录,然后就可以在线安装了。后台怎么配置的我就不清楚了。不知道是不是跟文章中提到的阿帕奇配置步骤相同
        sunljz:@3727db4452eb 原理是一样的,不过你们做得比较完善,而我这个只是个人使用,所以比较简单
      • 余不悟:相当有用 !
        sunljz:@Prolospro thanks
      • 921daab44a8c:学习了
      • Teehom:使用蒲公英或者fir更方便
        a79722cdd6f2:@Teehom https://github.com/bumaociyuan/ios-ipa-server
        用这个更简单
        Teehom:@sunljz 嗯,之前我们公司也自己搭OTA
        sunljz:@Teehom 是的,那些是比较成熟的方案,不过我比较喜欢自己研究原理

      本文标题:实现 iOS App 在线安装(局域网OTA)

      本文链接:https://www.haomeiwen.com/subject/tivzcttx.html