iOS客户端的在线安装和更新——针对ADHoc证书
这篇文章纯给自己留个备份,所以对AdHoc证书内部分发和对iOS客户端开发不了解的请直接无视。
一般在iOS游戏或应用开发过程中,正式发布到App Store之前,都需要内部的测试,客户端的安装是个不大不小的问题。苹果提供了AdHoc的证书(普通版可以装100台设备,企业版无限),登记设备号的即可通过iTunes或者无线网络安装使用AdHoc证书的App。具体不多赘述。
参考资料:
http://www.alexcurylo.com/blog/2010/08/27/wireless-ad-hoc-distribution/http://www.hanchorllc.com/2010/08/24/introducing-ios-beta-builder/
之前有用过一款产品叫HockeyApp(http://hockeyapp.net/),帮助实现内部的分发和安装,支持在线安装、检测更新,非常方便,简单分析了一下其原理:
1. 服务端提供API供客户端获取最近版本信息,参考如下:
[
{
"timestamp": 1349965666,
"shortversion": "4.2.1",
"mandatory": false,
"appsize": 115812817,
"title": "Metal Nation",
"version": "4.2.1.12101102",
"notes": "修复BUG"
},
{
"timestamp": 1349788437,
"shortversion": "4.2.0",
"mandatory": false,
"appsize": 115866480,
"title": "Metal Nation",
"version": "4.2.0.12100902",
"notes": "修复BUG"
},
{
"timestamp": 1349704154,
"shortversion": "4.2.0",
"mandatory": false,
"appsize": 115866530,
"title": "Metal Nation",
"version": "4.2.0.12100801",
"notes": "<p>解决无法访问的问题。</p>"
},
{
"timestamp": 1348125250,
"shortversion": "4.1.0",
"mandatory": true,
"appsize": 133946599,
"title": "Metal Nation",
"version": "4.1.0.12092001",
"notes": "<p>新版本更新主要内容:建造建筑变更为分阶层进行</p>"
},
{
"timestamp": 1345717028,
"shortversion": "3.9.4",
"mandatory": false,
"appsize": 90793414,
"title": "Metal Nation",
"version": "3.9.4.12082301",
"notes": "<p>3.9.4更新内容细节</p>"
},
{
"timestamp": 1345115309,
"shortversion": "3.9.3",
"mandatory": false,
"appsize": 69261482,
"title": "Metal Nation",
"version": "3.9.3.12081601",
"notes": "<p>本次更新主要内容</p>"
},
{
"timestamp": 1344597742,
"shortversion": "3.9.2",
"mandatory": false,
"appsize": 67664284,
"title": "Metal Nation",
"version": "3.9.2.12081002",
"notes": "<p>PA3.9.2更新说明</p>"
},
{
"timestamp": 1344332672,
"shortversion": "3.9.1",
"mandatory": false,
"appsize": 66645470,
"title": "Metal Nation",
"version": "3.9.1.12080701",
"notes": "<p>主要改进的数值</p>"
},
{
"timestamp": 1343992275,
"shortversion": "3.9.1",
"mandatory": false,
"appsize": 66622883,
"title": "Metal Nation",
"version": "3.9.1.12080302",
"notes": "<p>本次更新主要内容</p>"
},
{
"timestamp": 1343992251,
"shortversion": "3.9.1",
"mandatory": false,
"appsize": 66622828,
"title": "Metal Nation",
"version": "3.9.1.12080301",
"notes": ""
},
{
"timestamp": 1343813073,
"shortversion": "3.9.1",
"mandatory": false,
"appsize": 66602801,
"title": "Metal Nation",
"version": "3.9.1.12080101",
"notes": ""
},
{
"timestamp": 1343727905,
"shortversion": "3.9.1",
"mandatory": false,
"appsize": 66560890,
"title": "Metal Nation",
"version": "3.9.1.12073101",
"notes": ""
}
]
2. 客户端根据版本列表判断是不是最新版本,和是不是要强制更新,如果需要更新,可以类似与HockeyAPP内嵌一个网页显示版本信息,点击更新按钮后,访问服务端的下载更新包的API。
网页更新链接代码如下:
<a href="itms-services://?action=download-manifest&url=https://sdk.hockeyapp.net/api/2/apps/565b9262a3913bb1123c71ba6575e07b?format=plist&udid=d2134514a9c016fbd016a0815f1b3f41d9f38c82">Tap Here to Update</a>
3. 服务端提供下载更新包的API,传入用户设备号和请求的版本号参数,返回一个manifest.plist文件,本质是一个XML,包含更新包描述信息,参考如下:
<?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://sdk.hockeyapp.net/api/2/apps/565b9262a3913bb1123c71ba6575e07b?format=ipa&udid=d2134514a9c016fbd016a0815f1b3f41d9f38c82</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<false />
<key>url</key>
<string>https://sdk.hockeyapp.net/api/2/apps/565b9262a3913bb1123c71ba6575e07b?format=png&udid=d2134514a9c016fbd016a0815f1b3f41d9f38c82</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.idfsoft.idfCity</string>
<key>bundle-version</key>
<string>4.2.1.12101102</string>
<key>subtitle</key>
<string>4.2.1 (4.2.1.12101102)</string>
<key>title</key>
<string>Metal Nation</string>
<key>kind</key>
<string>software</string>
</dict>
</dict>
</array>
</dict>
</plist>
其中software-package对应的Url为ipa文件下载地址,其中display-image对应的Url为App的图标图片URL
5. 后台管理中,需要增加页面让用户可以上传最新的ipa文件和输入版本更新信息,其中ipa文件的解析逻辑如下:
- 将ipa文件作为zip文件解压缩
- 解压后,读取根目录下的Info.plist文件,是一个XML格式文件
- 读取CFBundleShortVersionString节点,或得版本号简写
- 读取CFBundleVersion获取版本号
- 读取CFBundleIdentifier获取唯一编号
- 读取CFBundleDisplayName获取名称
- 保存这些信息到数据库中,在生成manifest.plist的API中用以显示相应数据。
基本上就这样。
iOS客户端的在线安装和更新——针对ADHoc证书的更多相关文章
- 在线安装WordPress更新 失败的解决办法
1. 登录ftp登录不上 , 总是登录失败 在服务器上新建了一个vsftpd服务器,并设置了相应的虚拟用户,修改chroot到网站目录 相关连接:https://blog.csdn.net/zhan ...
- IOS Socket 05-XMPP开始&安装服务器openfire&安装配置客户端
1. 即时通讯技术简介(IM) 即时通讯技术(IM-Instant Messageing)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方 ...
- 更新日志 - BugHD iOS 客户端上线
中秋.十一长假归来,"满血复活"的我们做了 fir.im 和 BugHD 的优化更新:) BugHD 新增功能 1.iOS 客户端上线 BugHD iOS 客户端上线了,你可以随时 ...
- IOS在线安装App
在越狱设备上可以安装,如果设备不越狱也想安装,就要企业发布权限了,可惜我没有,所以不能测试了! 1.创建ipa及plist文件: XCode菜单栏->Product->Archive-&g ...
- 软件包管理 之 Fedora/Redhat 在线安装更新软件包,yum 篇 ── 给新手指南
在本文中,我们主要解介绍 Fedora core 4.0 通过软件包管理工具yum来在线安装更新软件:关于apt工具应用,我们会在另外一篇中介绍: 一. yum 的使用:有些初学Linux的弟兄可能问 ...
- 开源中国iOS客户端学习
开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客 http://blog.csdn.net/column/details/xfzl-kykhd.html ...
- Appium robotframework-appium (ios 客户端测试)环境搭建
一. 简介 1.1摘要 本人测试新人,最近在搞ios客户端的自动化,准备采用robotframework-appium来实现自动化测试,一边学习一边总结,此安装说明文档是基于mac系统10.11版本, ...
- 猿题库 iOS 客户端架构设计
原文: http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=444322139&idx=1&sn=c7bef4d439f4 ...
- 改进iOS客户端的升级提醒功能
改进iOS客户端的升级提醒功能 功能设计 先申明一下,我是码农,不是一个产品经理,但我觉得现有市面上的很多 App,设计的 "升级提示功能" 都不太友好.在此分享一下我的想法,欢迎 ...
随机推荐
- cmd
ExecuteNonQuery 返回影响的行数 ExecuteScalar 返回第一行第一列
- Log4net日志GUI配置工具
关于log4net的配置文章在园子里真的很多,但是有关GUI界面配置的文章确定太少,改写了一个以前很早的工具 以前的那个有很多的问题,这个基本的大的问题没有,可能一个小问题还是需要修改下,基本功能肯定 ...
- 5.4-5.8webstorm css
关于使用css3 动画完成牛顿摆球效果: 使用的规则为@keyframes,不过目前的浏览器都不支持该规则. Firefox 支持替代的 @-moz-keyframes 规则. Opera 支持替代的 ...
- QT--以共享的方式发布应用,QT依赖库
Building Qt as a Shared Library 因为:QT基本上都是采用动态编译的(被安装的OS中的),(如安装包往往都是默认动态编译处理好的动态库),所以我们采用动态连接的方式进行发 ...
- PHP--Warning: Invalid argument supplied for foreach() in ...
1.背景 今天学习PHPExcel的使用,在代码执行foreach($data as $value){...}的时候出现这样一个警告提示:Warning: Invalid argument suppl ...
- Oracle11G R2用exp无法导出空表解决方法
在11G R2中有个新特性,当表无数据时,不分配segment,以节省空间Oracle当然在执行export导出时,空表则无法导出,但是还是有解决办法的: 解决方法: 一.insert一行,再roll ...
- Oracle数据库字符集修改
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.一般来说,数据库字符集在安装数据库实例时就 ...
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
最近研发BDC 云开发部署平台的数据路由及服务管理器意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提 ...
- 大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
- Linux 进程
Linux 进程 在用户空间,进程是由进程标识符(PID)表示的.从用户的角度来看,一个 PID 是一个数字值,可惟一标识一个进程.一个 PID 在进程的整个生命期间不会更改,但 PID 可以在进程销 ...