Chinaunix首页 | 论坛 | 博客
  • 博客访问: 405223
  • 博文数量: 44
  • 博客积分: 4980
  • 博客等级: 上校
  • 技术积分: 1035
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-09 20:39
个人简介

偶尔编程的胖子 40岁之后还能坚持学习

文章分类

全部博文(44)

文章存档

2023年(12)

2022年(2)

2011年(1)

2010年(6)

2009年(1)

2008年(22)

我的朋友

分类: Android平台

2023-11-21 21:56:26

软件第一版发布后,就存在一个自动升级问题,不能每次都是手动发给客户吧;
主要参考,segmentfault.com/a/1190000042373082,前面加上https的头啊,好像链接不给放;
就这个链接的例子,还是比较实用的;
说说自动升级的主要过程吧;
核心是:1,检查版本,也就是在公网上放一个版本记录文件,每次启动时主动从这个文件读一个版本号,看看是否需要更新,因为一般放在网上的都是最新的,所以,只要不同就可以更新,所以就放在字符串,因为Android编译后默认的版本号是1.0.0这样的格式,所以那个文件里面就这么放就可以了;2,放最新的apk文件,但这里有个坑,因为不知道从什么时候开始,apk文件各种云存储不让直接下载安装了,所以你需要给个扩展名,否则一直异常。
例子里面用了masa,其实没必要,用你以前熟悉的界面就可以,
关键代码解释下:
var currentVersion = VersionTracking.CurrentVersion;
var latestVersion = await _client.GetStringAsync(url);


第一句是系统级的版本,这个是在maui项目文件中编写的,注意要跟网上放那个版本定义文件同步修改;
第二句就是从url里面获取一个版本号,;
类似于这样的格式,update.txt文件里面就放一个1.0.2这样的字符串就可以了,跟你放网上版本一致就可以了;

下面这段就是download apk文件的代码了,其中URL类似于wonengEMT.rom,我把apk改成了rom了
    var req = new HttpRequestMessage(new HttpMethod("GET"), url);
    var response = _client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead).Result;
    var allLength = response.Content.Headers.ContentLength;
    var stream = await response.Content.ReadAsStreamAsync();
    var file = $"{FileSystem.AppDataDirectory}/{NameOfApk}";
    await using var fileStream = new FileStream(file, FileMode.Create);
    await using (stream)
    {
        var buffer = new byte[10240];
        var readLength = 0;
        int length;
        while ((length = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
        {
            readLength += length;
            action(readLength, allLength!.Value);
            // 写入到文件
            fileStream.Write(buffer, 0, length);
        }
    }
}
最后有个安装新版本的代码,这个就不拷贝了,例子里面有;
其他界面显示根据自己项目用的库来,用标准maui就可以,
我用了阿里云的oss存储,不过杯具的是,新手免费3个月的试用我没点上,后面再点就不符合要求了,我就买了个套餐,测试用先,后续转给公司买单。
根据例程,就这么做完了,速度还可以,其中出了一个问题,debug模式下没问题,release编译时一直操作,一直找不到一个文件,最后我就复制下,看下图:

图中xml文件夹下的两个文件一模一样的内容,但是release时一直提示找不到上面那个文件,我干脆就直接做了个一个文件,编译就通过了,debug也可以,我也没有删除原来那个provider_paths.xml,不知道问题在哪,就这么着了。
自动升级我觉得核心就在于从云上下载个文件,其他就正常操作就可以了

阅读(284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~