iOS构建自分发平台

简述:iOS开发平时发布内测应用,大家经常用的有蒲公英、fir.im等第三方服务平台,无论是手动打包上传至内测平台,还是使用jenkins或者第三方内测平台提供的脚本、或者自己编写脚本实现CI,这些都依赖于第三个平台提供服务。而且每次有版本更新都需要提醒测试人员有新版本,给他们截图二维码等等......最近公司有需求要构建自己的内测分发平台,这样平时内测时,只需要把打包的ipa文件上传至公司服务器,测试人员打开app后就能发现是否有新版本,并且无需扫描二维码,直接在app内进行安装升级。

参考链接如下:
以无线方式安装企业内部应用

自分发必须条件

  • 后台服务器要有一个检测是否有新版本的接口,该接口应该可以返回一个 企业内部预置描述文件的地址,即一个.plist文件
  • 后台服务器应该提供开发人员上传.ipa包的入口
  • 后台服务器返回的.plist文件应该是基于iOS开发人员上传的.ipa文件动态构建的,.plist文件里面的app下载地址应当是最新上传的版本

iOS 支持以无线方式安装自定的企业内部应用,而无需使用 iTunes 或 App Store。应用的格式必须为 .ipa,并且使用企业内部预置描述文件进行构建。无线安装要求:
1. XML 清单文件
2. 可让设备访问 Apple iTunes 服务器的网络配置
3. 对于 iOS 7.1 或更高版本,使用 HTTPS
为了安装应用,用户使用特殊的 URL 前缀从您的网站上下载清单文件。您可以通过短信或电子邮件分发用于下载清单文件的 URL,这里我们公司是将清单文件的下载地址配置在了请求版本信息的接口中,或将其嵌入创建的另一企业应用中。
您负责设计和托管用于分发应用的网站。请确定用户已通过认证(可能是使用基本认证或基于目录的认证),并确定网站可通过内联网或互联网进行访问。您可以将应用和清单文件放入隐藏目录或任何可使用 HTTPS 读取的位置。

XML文件清单说明(.plist文件)

清单文件是一个 XML plist 文件,可供 Apple 设备用来从您的 Web 服务器上查找、下载和安装应用。清单文件由 Xcode 创建,使用的是您在共享用于企业分发的归档应用时所提供的信息。
以下栏是必填项:

  • URL:应用 (.ipa) 文件的完全限定 HTTPS URL(即必须是https链接)
  • display-image:57 x 57 像素的 PNG 图像,在下载和安装过程中显示。指定图像的完全限定 URL
  • full-size-image:512 x 512 像素的 PNG 图像,表示 iTunes 中相应的应用
  • bundle-identifier:应用的包标识符,与 Xcode 项目中指定的完全一样
  • bundle-version:应用的包版本,在 Xcode 项目中指定
  • title:下载和安装过程中显示的应用的名称

样本清单文件还包含可选键。例如,如果应用文件太大,并且想要在执行错误检验(TCP 通信通常会执行该检验)的基础上确保下载的完整性,可以使用 MD5 键。
通过指定项目数组的附加成员,您可以使用一个清单文件安装多个应用(这个不做说明,我没试)。
首次进行平台的创建,需要给服务器人员一个.plist样板,在打包过程中我没可以选择生成一个.plist文件,位置如下:

图片.png

图中红色框中默认是没有勾选的,第一次构建分发平台的时候需要勾选,只是为了搞一个.plist文件的样板,后续打包就不需要了。
点击图中下一步见下图:

图片.png

Name已经默认生成,Display Image URL: Full Size Image URL:是存放在公司服务器上的两个图片地址,位置可以放在服务器上任意位置。App URL:就是每次上传到公司服务器的内测.ipa包的下载地址,所以整个.plist文件需要动态进行构建,后续都需要从服务器拿.plist文件地址。
打包完成后可以发现生成了一个manifest.plist文件。

图片.png
图片.png

如何安装到手机中

下面列出我们后台升级请求接口中返回的版本信息,其中包含manifest.plist的下载地址

{
    data =     {
        description = "1\U3001\U66f4\U65b0\U53cb\U76df\U5206\U4eabSDK\Uff0c\U9002\U914dhttps\U3002
\n2\U3001\U5f3a\U5236\U5347\U7ea7\Uff0c\U9ebb\U70e6\U91cd\U65b0\U6d4b\U8bd5\U4e00\U4e0b\U5206\U4eab\U529f\U80fd\U3002
\n3\U3001\U8c22\U8c22\U3002";
        force = 1;
        size = "2.5 MB";
        toggle = on;
        "update_time" = "2016-12-19";
        url = "itms-services://?action=download-manifest&url=https://alpha.yihuangjin.com/api/mobile/manifest.plist";
        version = "1.0.8";
    };
    message = ok;
    "ret_code" = 0;
}

其中:
url = "itms-services://?action=download-manifest&url=https://alpha.example.com/api/mobile/manifest.plist";
中的
https://alpha.example.com/api/mobile/manifest.plist";
是.plist文件的地址,url中的
itms-services://?action=download-manifest
是iOS系统用来直接安装到手机需要解析用的。

使用openUrl的方式安装

在app中定义如下方法:

+ (void)openUrlWithString:(NSString *)urlString
{
    NSURL *url = [NSURL URLWithString:urlString];
    if (IS_IOS_10) {
        NSDictionary *dic = [NSDictionary dictionary];
        [[UIApplication sharedApplication] openURL:url options:dic completionHandler:nil];
    }else
    {
        [[UIApplication sharedApplication] openURL:url];
    }
}

直接
[self openUrlWithString:@"url对应的value值"];
就可以实现直接安装到手机中。

轻点 Web 链接后会下载清单文件,并触发下载和安装

您的网站可以是链接到清单文件的单个页面。用户轻点 Web 链接后会下载清单文件,并触发下载和安装。

以下是示例链接:
<a href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">Install App</a>
请勿添加归档应用 (.ipa) 的网站链接。载入清单文件时,设备会下载该 .ipa 文件。虽然 URL 的协议部分是“itms-services”,但 iTunes Store 并不参与此过程。
此外,请确定 .ipa 文件可通过 HTTPS 进行访问,并且您的站点已使用 iOS 信任的证书进行了签名。如果自签名证书没有受信任的锚点并且无法由 iOS 设备验证,安装会失败。

服务器端的要求

设定服务器 MIME 类型,您可能需要配置 Web 服务器,让清单文件和应用文件可正确传输。
对于 Server 应用,请将 MIME 类型添加到网页服务的 MIME 类型设置:

application/octet-stream ipa
text/xml plist

对于微软的互联网信息服务器 (IIS),请使用 IIS Manager 在服务器的“属性”页面中添加 MIME 类型:

.ipa application/octet-stream
.plist text/xml

说明

其实manifest.plist这个文件可以每次打包都重新生成,由于我们这边管理后台是已经开发好的,然而管理后台只能上传一个文件,就是说上传了.ipa文件后,再上传manifest.plist文件,就会把.ipa文件覆盖,自建内测分发平台的时候这两个文件都是必须的,就想了一个折中的办法,动态构建.plist文件,.plist文件里面的.ipa下载地址也由服务器人员进行构建。
正常情况下:
将这些项目上传到网站上可供已认证的用户访问的区域:

应用 (.ipa) 文件
清单 (.plist) 文件

每次打包都重新构建并上传这两个文件,可以使用上面所述的两种方式先去请求.plist文件所在地址,解析.plist文件中.ipa的下载地址,然后触发下载和安装。

推荐阅读更多精彩内容