持续集成系列 - App 内测分发平台之 OTA

前言

目标是:建立自己的移动应用内测分发平台.方便测试人员快速的获取到最新的测试包.

流程:

  • 通过脚本,自动将项目打包编译,生成 AdHoc 版本的 ipa
  • 脚本自动上传 ipa 到公司内网的服务器
  • 然后邮件通知相关人员,邮件中内置 url
  • 在 Safari 中点开url,直接安装内测版本

注意事项:必要3条件

    1. AdHoc 版 ipa 文件
    1. AdHoc 版 plist 文件

如果是使用 Xcode 打包,会自动生成上述的两个文件,当然也可以使用脚本生成.plist 文件内容如下(小结末尾)

    1. 一个内测发布页面

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

<a href="itms-services://?action=download-manifest&url=https://1192.168.117.39/apps/manifest.plist">
  Download ADDemo
</a>
<!-- 或者这样 -->
<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链接。其他地方的链接并没有要求。

OTA就是over the air,是一种无线发布方式,它可以实现app的在线安装,不再需要数据线.

而对于 https,方案有:自己公司搭建;使用三方的云盘(hppts的,将 ipa 传上去);自己配置. 更详细的内容参考:iOS通过OTA方式分发应用的实现

相关资料: 1.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>https://192.168.117.39/apps/app.ipa</string>
                    <!-- 这里是服务器上的 ipa 的地址-->
                </dict>
                <dict>
                    <key>kind</key>
                    <string>display-image</string>
                    <key>url</key>
                    <string>https://avatar.csdn.net/F/2/A/1_close_marty.jpg</string>
                     <!-- 这是展示图片-->
                </dict>
                <dict>
                    <key>kind</key>
                    <string>full-size-image</string>
                    <key>url</key>
                    <string>https://avatar.csdn.net/F/2/A/1_close_marty.jpg</string>
                     <!-- 这是展示图片-->
                </dict>
            </array>
            <key>metadata</key>
            <!-- 如果是放在服务器上,以下的 内容要写成动态的 -->
            <dict>
                <key>bundle-identifier</key>
                <string>${BUNDLE_IDENTIFIER}</string>  
                <!-- <string>com.3code.ADDemo</string> -->
                <key>bundle-version</key>
                <string>${APPLICATION_VERSION}</string>  
                <!-- <string>1.0</string> -->
                <key>kind</key>
                <string>software</string>
                <key>title</key>
                <string>${DISPLAY_NAME}</string>  
                <!-- <string>AD_Demo</string> -->
            </dict>
        </dict>
    </array>
</dict>
</plist>
  1. web 页面的参考代码:
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 
  <title>Install Geoloqi</title>
  <style type="text/css">
    body {
      background: url(bkg.png) repeat #c5ccd4;
      font-family: Helvetica, arial, sans-serif;
    }
    .congrats {
      font-size: 16pt;
      padding: 6px;
      text-align: center;
    }
    .step {
      background: white;
      border: 1px #ccc solid;
      border-radius: 14px;
      padding: 4px 10px;
      margin: 10px 0;
    }
    .instructions {
      font-size: 10pt;
    }
    .arrow {
      font-size: 15pt;
    }
    table {
      width: 100%;
    }
  </style>
</head>
<body>

<div class="congrats">Congrats! You've been invited to the beta of Geoloqi.</div>

<div class="step">
  <table><tr>
    <td class="instructions">Install the<br />Geoloqi app</td>
    <td width="24" class="arrow">&rarr;</td>
    <td width="57" class="imagelink">
      <a href="itms-services://?action=download-manifest&url=http://loqi.me/app/Geoloqi.plist">
        <img src="geoloqi-icon.png" height="57" width="57" />
      </a>
    </td>
  </tr></table>
</div>

</body>
</html>

3.证书的配置,参见

OK ,以上是基本的知识储备.

构建内测分发平台;

整过程就是: Jenkins 构建成功后发送邮件给相关人员,邮件中附带二维码,其他人员扫描二维码访问install.html页面,点击即可自动安装最新的app.

1. 在web服务器上部署好目录结构

其中:

  • install.html 是一个非常简单的发布页面,这个页面的地址固定不变,其他人就总是通过访问 http://xxx.xxx.xxx/ota/install.html 来实现所有操作。
<div style="text-align:center;margin-top:50px"><a href="http://xxx.xxx.xxx/ota/ca.crt" style="font-size:70px;">Install Root Certificate</a></div>  
<div style="text-align:center;margin-top:100px"><a href="itms-services://?action=download-manifest&url=https://xxx.xxx.xxx/ota/iPhone/iPhoneOTA.plist" style="font-size:70px;">Install iPhone App</a></div>  
<div style="text-align:center;margin-top:100px"><a href="itms-services://?action=download-manifest&url=https://xxx.xxx.xxx/ota/iPad/iPadOTA.plist" style="font-size:70px;">Install iPad App</a></div> 
  • iPad和iPhone 目录中是各自对应的最新ipa文件 (通过脚本生成,然后上传过来的)
  • otabuddy.sh 用来根据ipa自动生成plist文件, 脚本地址如下AA1:
  • ca.crt是给https连接对应的服务器证书签名的根证书。 具体 参考这里

AA1:脚本 AA1:备份脚本

2. 在jenkins中用简单的脚本实现这个过程
#将二维码放到对应job的根目录下,便于作为邮件附件发送。install.png就是install.html的url对应的二维码  
cp /Users/marty/.jenkins/workspace/install.png /Users/marty/.jenkins/workspace/xxxx/  
#删除已有的ipa和plist  
cd /Library/WebServer/Documents/ota/iPad/  
rm -rf *.ipa  
rm -rf *.plist  
#把最新的ipa从jenkins工作目录复制到web服务器工作目录  
cp /Users/marty/.jenkins/workspace/xxxx/bin/*.ipa /Library/WebServer/Documents/ota/iPad/  
#生成Plist文件,plist文件采用固定名称。  
ipaName=`ls |grep ipa`  
./otabuddy.sh plist $ipaName http://xxx.xxx.xxx/ota/iPad/$ipaName iPadOTA.plist  
  • 在构建成功的邮件中增加一个附件,附件就是二维码

其他资料: -优秀教程: Jenkins Gitlab持续集成打包平台搭建

参考

支持一下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码支持一下

打开支付宝扫一扫,即可进行扫码打赏哦