缘起
其实这个想法早在十年前我还在做桌面应用的时候就想过了,而且还在一个DELPHI程序里尝试了一下,但是因为后来没再做桌面应用,这事也就放下了。
最近在做移动应用,又开始觉得需要这样一个功能。本来这种事情交给Google Play处理就好了,但是因为国内的奇葩环境,完全依赖Google Play并不现实,所以大部分国产应用都实现了自己的自动更新功能。
我不知道别人是怎么实现应用的自动更新的,但基本功能不外就是:服务端提供一个API,客户端定期调用取得最新版本信息,与当前版本比较,如果更新则提示下载更新。
问题在于发布更新的过程我希望能简单化,所以选中了RSS作为服务端的API。这样每次发布一个新版本,我只需要简单地发一篇BLOG即可——只要在其中提供必要的版本信息,客户端即可从RSS输出中得到版本更新的信息。
本来是只需要在客户端实现一个RSS解析功能即可,但是因为我已经实现了一套REST的客户端库,所以为了统一访问,又做了个服务端,把RSS转成JSON返回。
服务端
是一个简单的PHP页面,功能就是用CURL读取RSS的内容,然后通过正则表达式解析(懒得用XML了),转成JSON格式返回。
代码如下:
<?php
header('Content-type: application/json; charset=utf-8');
define('USER_AGENT', 'auto update');
define('RSS_URL', 'http://yourdomain.com/rss');
function rss_process($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$response = curl_exec($ch);
$response_info = curl_getinfo($ch);
curl_close($ch);
switch(intval($response_info['http_code']