Flutter下载更新App的方法示例
程序员文章站
2022-09-05 20:48:15
1. 说明
ios 和android 更新是完全不一样的。
ios 只能跳转到 appstore,比较好实现
android则需要下载apk包,由于android机型...
1. 说明
ios 和android 更新是完全不一样的。
ios 只能跳转到 appstore,比较好实现
android则需要下载apk包,由于android机型较多,这里我们用 dart 连接第三方(这里)的原生 android 下载库。
更新界面和下载更新分开处理的。
ios 没得下载进度这一说,android 则有。
2. 代码
2.1 ios 直接采用url_launcher就可以了
if (platform.isios) { final url = "https://itunes.apple.com/cn/app/id1380512641"; // id 后面的数字换成自己的应用 id 就行了 if (await canlaunch(url)) { await launch(url, forcesafarivc: false); } else { throw 'could not launch $url'; } }
2.1 android实现
2.1.1 在 android/app/build.gradle 文件添加下载库
dependencies { // 只复制这一行 implementation 'com.king.app:app-updater:1.0.4-androidx' }
2.1.2 在 androidmanifest.xml添加存储权限
<uses-permission android:name="android.permission.write_external_storage"/> <uses-permission android:name="android.permission.read_external_storage"/>
2.1.3 在 android 项目中编写插件
package com.iwubida.flutter_yuedu.plugins; import android.content.context; import android.util.log; import com.king.app.updater.appupdater; import com.king.app.updater.callback.updatecallback; import java.io.file; import java.util.hashmap; import java.util.map; import io.flutter.plugin.common.eventchannel; import io.flutter.plugin.common.pluginregistry.registrar; /** updateversionplugin */ public class updateversionplugin implements eventchannel.streamhandler { private static string tag = "my_update"; private static context context; public updateversionplugin(context context) { this.context = context; } /** plugin registration. */ public static void registerwith(registrar registrar) { final eventchannel channel = new eventchannel(registrar.messenger(), "plugins.iwubida.com/update_version"); channel.setstreamhandler(new updateversionplugin(registrar.context())); } @override public void onlisten(object o, eventchannel.eventsink eventsink) { if (o.tostring().length() < 5) { eventsink.error(tag, "url错误", o); return; } if (!o.tostring().startswith("http")){ eventsink.error(tag, "url错误", o); } appupdater update = new appupdater(context,o.tostring()).setupdatecallback(new updatecallback() { map data = new hashmap<string, object>(); // 发送数据到 flutter private void senddata() { eventsink.success(data); } @override public void ondownloading(boolean isdownloading) { } @override public void onstart(string url) { data.put("start", true); data.put("cancel", true); data.put("done", true); data.put("error", false); data.put("percent", 1); senddata(); } @override public void onprogress(int progress, int total, boolean ischange) { int percent = (int)(progress * 1.0 / total * 100); if (ischange && percent > 0) { data.put("percent", percent); senddata(); } } @override public void onfinish(file file) { data.put("done", true); senddata(); } @override public void onerror(exception e) { data.put("error", e.tostring()); senddata(); } @override public void oncancel() { data.put("cancel", true); senddata(); } }); update.start(); } @override public void oncancel(object o) { log.i(tag, "取消下载-集成的第三方下载没有提供取消方法"); } }
2.1.4 在 mainactivity 中注册插件
// 注册更新组件 在oncreate方法中 updateversionplugin.registerwith(registrarfor("iwubida.com/update_version"));
我们需要获取到下载进度,所以我们采用eventchannel来持续单向通讯。
2.3 dart端实现
static const channelname = 'plugins.iwubida.com/update_version'; static const stream = const eventchannel(channelname); // 进度订阅 streamsubscription downloadsubscription; int percent = 0; // 开始下载 void _startdownload() { if (downloadsubscription == null) { downloadsubscription = stream .receivebroadcaststream(widget.data.apkurl) .listen(_updatedownload); } } // 停止监听进度 void _stopdownload() { if (downloadsubscription != null) { downloadsubscription.cancel(); downloadsubscription = null; percent = 0; } } // 进度下载 void _updatedownload(data) { int progress = data["percent"]; if (progress != null) { setstate(() { percent = progress; }); } }
2.4 其它
另外 android 还有权限申请的问题。可以参考下面项目中的代码。
dart 代码: lib/widget/update_version.dart
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。