隐藏

xamarin.Android自动升级

发布:2021/10/26 10:52:54作者:管理员 来源:本站 浏览次数:1000

在写这边文章的时候参考了很多其他人的博客,在此感谢各位。也是给其他的伙伴做一个总结。对于我们新手来说存在的问题还是比较多的。
一、搭建iis服务器

首先我们需要搭建一个可以提供app下载最新版本的网站。在这里直接使用iis服务器。具体搭建方法就不再介绍了。这里需要注意的是要添加mime类型。这样子才能够下载apk文件。具体方法请参考:https://blog.csdn.net/wsx5edc/article/details/88867019

好了iis服务器搭建完成后。放上我们新的apk安装包。

如何生成apk文件包具体方法请参考:https://www.cnblogs.com/hexu6788/p/10007336.html

然后同时创建一个txt文件里面放着我们最新版号。我这里是直接使用程序集版本号。update.txt文件里面直接写1.0.0.1

 到这里服务端就搭建完成了。
二、编写app升级代码

然后就是app文件的代码实现了。我是参考

https://blog.csdn.net/u011821152/article/details/112966956?spm=1001.2014.3001.5501

并根据自己的需求做了一些修改。

首先在程序启动的时候,读取iis服务器的update文件,对比一下当前的程序版本和服务端的是否一致。如果不一致开始下载操作

                //判断是否有新的版本需要更新
                WebClient client = new WebClient();
                Stream str = client.OpenRead("http://WWW.XXX.COM/update.txt");
                StreamReader reader = new StreamReader(str);
                var value = reader.ReadLine();
                var ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
                //对比版本号
                if (ver != value)
                {
                    //显示弹窗提示用户有新的版本需要更新
                    var builder = new Android.App.AlertDialog.Builder(this);
                    builder.SetTitle("有新版本!").SetMessage("请更新后进行使用,若是更新失败请联系公司管理员!当前安装版本为"+ ver + "最新版本为"+value).SetNegativeButton("确定", (e, s) =>
                     {
                         //版本不一致调用升级方法
                         runUpdate();
                     }).Show();
                }

在方法体的外部定义一个 ProgressDialog字段。代表进度条窗口

             ProgressDialog pg;//进度条
            public void runUpdate()
            {
                pg = new ProgressDialog(this);
                pg.SetTitle("文件下载中...");
                pg.Max = 100;
                pg.SetCancelable(false);
                pg.SetProgressStyle(ProgressDialogStyle.Horizontal);
                pg.Show();
                WebClient client = new WebClient();
                //传输过程中更新进度条
                client.DownloadProgressChanged += client_DownloadProgressChanged;
                //在异步下载完成时候发生
                client.DownloadFileCompleted += client_DownloadFileCompleted;
                //下载文件
                var saveFolder = Android.OS.Environment.ExternalStorageDirectory;
                var file = string.Format("{0}/{1}{2}", saveFolder, this.PackageName, ".apk");//fileName + "appName" + versionName + ext;
                client.DownloadFileAsync(new Uri("http://www.xxx.cn:/xxx.apk"), file);
                
            }
     //更新进度条
            void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                pg.Progress = e.ProgressPercentage;
            }
    /// <summary>
            /// 下载完成时进行安装
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
            {
                if (e.UserState == null)
                {
                    Intent i = new Intent(Intent.ActionView);
                    var saveFolder = Android.OS.Environment.ExternalStorageDirectory;
                    var file = string.Format("{0}/{1}{2}", saveFolder, this.PackageName, ".apk");
                    Java.IO.File apkFile = new Java.IO.File(file);
                    Intent intent = new Intent(Intent.ActionView);
                    intent.SetFlags(ActivityFlags.NewTask);
                    if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
                    {
                        intent.SetFlags(ActivityFlags.GrantReadUriPermission);
     
                        Android.Net.Uri uri = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", apkFile);
                        intent.SetDataAndType(uri, "application/vnd.android.package-archive");
                    }
                    else
                    {
                        intent.SetDataAndType(Android.Net.Uri.FromFile(new Java.IO.File(file)), "application/vnd.android.package-archive");
                    }
                    StartActivity(intent);
     
                }
                if (e.Error != null)
                {
                    Toast.MakeText(this, "更新异常:" + e.Error.Message, ToastLength.Long).Show();
                }
                pg.Dismiss();
            }

三、可能出现的异常解决方法

需要注意的是 Android 7.0到来后,为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用"file:///"绝对路径来传递文件地址的方式,

在接收方访问时会触发SecurityException的异常。

因此在提供文件给第三方应用访问时,我们就会用到FileProvider。

具体方法参考:https://www.cnblogs.com/devin_zhou/p/8520706.html

在下载完毕后进入安装过程中会出现应用未安装的错误

具体解决方法参考:https://blog.csdn.net/daijin888888/article/details/48413847