xamarin.Android自动升级

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

一、搭建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

xamarin.Android自动升级_第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;
        }
/// 
        /// 下载完成时进行安装
        /// 
        /// 
        /// 
        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

你可能感兴趣的:(xamarin)