从零开始自制远程更新

2018-12-27 20:28:24 -0500
从零开始自制远程更新 | 一个博客

从零开始自制远程更新

远程更新实现的原理

The first

首先,我们这里使用Http异步网络模块来实现远程更新。
从Alua手册中可知,此模块有三个方法:Http.get,Http.post,Http.downland
我们这里只要用到一个方法,Http.get(url,cookie,charset,header,callback)
从手册中可知,除urlcallback以外的参数都可以省略。
其中,callback又有四个返回值codecontentcookiehead

更新的实现过程

Created with Raphaël 2.2.0触发更新事件获取本地应用版本获取远端应用版本远端版本是否高于本地版本提示更新结束不做反应yesno

开始

远程更新服务器

这个有什么用

这东西的用途很简单:提供远端的(最新的)应用版本和下载地址。

怎么弄

可以自己买服务器,可以GitHub,也可以使用QQ收藏、讯飞语记等。

往远端服务器上存放数据

此处以QQ收藏为例
新建收藏
之后将此收藏转发到随意位置以获取此收藏的链接。实例链接
数据格式:

1
2
【版本】此处填写内部版本号【版本】
【下载】此处填写下载地址,需要http【下载】

本地代码

触发更新事件

一般来讲,我们习惯于在应用启动时检查更新。因此我们将检查更新的代码置于程序启动事件中即可。

获得本地应用版本

此实例中使用内部版本号来检测更新。
获取方法:

1
2
3
4
PackageName=this.getPackageName()--包名
PackInfo=this.getPackageManager().getPackageInfo(PackageName,64)--包信息
本地版本=tonumber(PackInfo.versionCode)--版本号,这是我们要用的
--由于之后需要进行判断,因此此处使用tonumber()方法转换为数字

获得远端应用版本

首先我们要从服务器获取数据。

1
2
3
4
5
6
7
8
URL="https://sharechain.qq.com/e568128f6e54ac8acf8feade92984606"--你的远端数据的地址
Http.get(URL,function(code,cont)
if code ~= 200 then --如果服务器返回数据异常,则退出程序
print("服务器失联")
activity.finish()
end
--cont就是服务器返回的数据,之后所有的代码都写在这里
end)

之后,我们要把我们需要的东西从网页里一堆乱七八糟的东西里抓取出来。
从手册可知,可以使用strings:match("前(.-)后")的方法提取中间的文字。
所以,我们可以这样获得我们需要的内容:

1
2
远端版本=cont:match("【版本】(.-)【版本】")
下载地址=cont:match("【下载】(.-)【下载】")

判断远端版本是否高于本地版本

首先我们要把远端版本变成一个数字:tonumber(远端版本)
之后我们可以使用if函数来进行判断。

1
2
3
if tonumber(远端版本)>本地版本 then
--提示检测更新
end

我们该如何让用户来更新呢?方法有很多。
此处使用最简单的一种方法:使用浏览器打开下载地址。

1
2
3
4
5
6
7
8
import "android.content.Intent"
import "android.net.Uri"
viewIntent = Intent("android.intent.action.VIEW",Uri.parse(下载地址))
activity.startActivity(viewIntent)
--顺带提醒下用户,免得他们一脸懵逼
print("请在打开的页面中下载更新并安装~")
--当然如果你想强制更新的话,可以把下面这一行加上
activity.finish() --结束程序

当然如果没有更新的话,自然不需要任何提示。

总结

肯定有人想要直接复制粘贴,那我就贴一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
URL="https://sharechain.qq.com/e568128f6e54ac8acf8feade92984606"--你的远端数据的地址
Http.get(URL,function(code,cont)
if code ~= 200 then --如果服务器返回数据异常,`
print("服务器失联")
activity.finish()
end
--cont就是服务器返回的数据,之后所有的代码都写在这里
--local用来声明局部变量,及这里的所以东西对你的其他代码的都没有任何影响。
local PackageName=this.getPackageName()--包名
local PackInfo=this.getPackageManager().getPackageInfo(PackageName,64)--包信息
local 本地版本=tonumber(PackInfo.versionCode)--版本号,这是我们要用的
--由于之后需要进行判断,因此此处使用tonumber()方法转换为数字
local 远端版本=cont:match("【版本】(.-)【版本】")
local 下载地址=cont:match("【下载】(.-)【下载】")
if tonumber(远端版本)>本地版本 then
--提示检测更新
import "android.content.Intent"
import "android.net.Uri"
local viewIntent = Intent("android.intent.action.VIEW",Uri.parse(下载地址))
activity.startActivity(viewIntent)
--顺带提醒下用户,免得他们一脸懵逼
print("请在打开的页面中下载更新并安装~")
--当然如果你想强制更新的话,可以把下面这一行加上
activity.finish() --结束程序
end
end)

小站不易,望支持。

Owner

gggxbbb commented 1 week ago

测试

The above comments are provided by comment.js with the help of Github issue.

去评论

https://gggxbbb.github.io/2018/12/02/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E8%87%AA%E5%88%B6%E8%BF%9C%E7%A8%8B%E6%9B%B4%E6%96%B0/

«Newer      Older»
Comment:
Name:

Back to home

Subscribe | Register | Login | N