整包更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17813937/article/details/82254393

有时候热更也不能满足需求时只能整包更新

using LitJson;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoSingleton<GameManager> {

    public Transform root;
    public Transform app;
    public Text current;
    public Text total;
    public Slider progress;
    public Text secondSize;
    public Text info;

    private APKInstall apk;

    private void Awake()
    {
        Screen.SetResolution(1024, 768, false);
        apk = APKInstall.GetInstance();
        apk.winDownloadUrl = QAPIHelper.Host+ "software/爱家.exe";
        apk.macDownloadUrl = QAPIHelper.Host + "software/爱家.pkg";
        apk.linuxDownloadUrl = QAPIHelper.Host + "software/爱家.out";
        apk.iosDownloadUrl = QAPIHelper.Host + "software/爱家.ipa";
        apk.iosIpadDownloadUrl = QAPIHelper.Host + "software/爱家.opa";
        apk.androidDownloadUrl = QAPIHelper.Host + "software/爱家.apk";
        apk.androidIpadDownloadUrl = QAPIHelper.Host + "software/爱家.apk";

        QMessage.AddEventListener(QMsgType.LoadingInfo,(string str)=> { info.text = str; });
        QMessage.AddEventListener(QMsgType.LoadingProgress, (float value) => { progress.value = value; });
    }

    private void Start()
    {
        if (QGlobalFun.IsNotNetwork())
        {
            QMessage.TirggerEvent(QMsgType.LoadingInfo, "联网失败");
        }
        
        string serverVersion =string.Empty;
        var version = PlayerPrefs.GetString("apkVersion", "1.0");

        apk.onCurrent = (a, b) => { QMessage.TirggerEvent(QMsgType.LoadingInfo, string.Format("{0}/{1}",a,b)); };
        apk.onStart = a => total.text = a.ToString();
        apk.onProgress = a => progress.value = a;
        apk.onSecondSize = a => secondSize.text = a;
        apk.onError = a => QMessage.TirggerEvent(QMsgType.LoadingInfo, a); 
        apk.onCompleted = () => PlayerPrefs.SetString("apkVersion", serverVersion);
        
        QMessage.TirggerEvent(QMsgType.LoadingInfo, "检查软件版本");
        
        apk.IsUpdate= data => {
            var obj = JsonMapper.ToObject(data);
            if (obj["returnType"].ToString() == "success")
            {
                QMessage.TirggerEvent(QMsgType.LoadingInfo, "更新软件版本");
                serverVersion = obj["returnMsg"].ToString();
                    if (version != serverVersion) return true;
            }
            QDebug.Log("检查完毕");
            EnterGame();
            return false;
        };

    }

    bool isCheck = true;

    private void Update()
    {
        if (isCheck && !QGlobalFun.IsNotNetwork())
        {
            isCheck = false;
            CheckVersion();
        }
    }

    private void CheckVersion()
    {
        var api = QAPIHelper.ApkVersion;
#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || UNITY_STANDALONE_LINUX
        api+="PC";
#elif UNITY_IPHONE
        api += (apk.IsIPad() ? "IPAD" : "IOS");
#elif UNITY_ANDROID
        api += (apk.IsIPad() ? "IPAD" : "ANDROID");
#endif
        apk.CheckVersion(api, Application.persistentDataPath, "aijia", "apk");

    }

    private void EnterGame()
    {
        app.SetActive(true);
    }
}
using UnityEngine;
using System;
using QWeb;

public class APKInstall
{
    private static APKInstall instance;
    private AndroidJavaObject currentActivity;
    public Func<string, bool> IsUpdate;
    public Action<float> onProgress;
    public Action<string> onSecondSize;
    public Action<long> onStart;
    public Action<long,long> onCurrent;
    public Action<string> onError;
    public Action onCompleted;
    public string winDownloadUrl;
    public string linuxDownloadUrl;
    public string macDownloadUrl;
    public string iosDownloadUrl;
    public string iosIpadDownloadUrl;
    public string androidDownloadUrl;
    public string androidIpadDownloadUrl;

    public static APKInstall GetInstance()
    {
        if (instance == null)
        {
            instance = (APKInstall)Activator.CreateInstance(typeof(APKInstall), true);
        }
        return instance;
    }

    public bool IsIPad()
    {
        return Screen.width > Screen.height;
    }

    public void CheckVersion(string versionUrl, string savePath, string fileName, string suffix)
    {
        {
            string serverVersion=null;
            Loom.RunAsync(()=> {
                
                using (WebClientEx wc = new WebClientEx(5))
                {
                    try
                    {
                        serverVersion = wc.DownloadString(versionUrl);
                    }
                    catch (Exception e)
                    {
                        QDebug.LogError(e);
                        if (onError != null) onError.Invoke(e.Message);
                    }
                }
                
                Loom.QueueOnMainThread(()=> {
                    Debug.Log(serverVersion);
                    if (IsUpdate(serverVersion))
                    {
#if UNITY_STANDALONE_WIN
                        UpdateWin();
#elif UNITY_STANDALONE_LINUX
                    UpdateLinux();
#elif UNITY_STANDALONE_OSX
                    UpdateMac();
#elif UNITY_ANDROID
                    UpdateAndroid(savePath,fileName,suffix);
#elif UNITY_IPHONE
                    UpdateIos();
#endif
                    }
                });
            });
            
        }
    }

    private void UpdateWin()
    {
        Application.OpenURL(winDownloadUrl);
    }

    private void UpdateLinux()
    {
        Application.OpenURL(linuxDownloadUrl);
    }

    private void UpdateMac()
    {
        Application.OpenURL(macDownloadUrl);
    }

    private void UpdateAndroid(string savePath, string fileName, string suffix)
    {
        string download = IsIPad() ? androidIpadDownloadUrl : androidDownloadUrl;
        QWebManager.Add(
            new QDownloadFile(download)
            .SetPath(savePath)
            .SetFileName(fileName)
            .SetSuffix(suffix)
            .OnCompleted((v) =>
            {
                if (onCompleted != null) onCompleted.Invoke();
                InstallAPK(v.GetSavePath());
            })
            .OnStart((a, b) => {
                if (onStart != null) onStart.Invoke(b);
            })
            .OnProgress(i => {
                if (onProgress != null) onProgress.Invoke(i);
                if (QGlobalFun.IsNotNetwork())
                {
                    if (onError != null) onError.Invoke("无法联网");
                }
            })
            .OnSecondSize(str => {
                if (onSecondSize != null) onSecondSize.Invoke(str);
            })
            .OnReceivedAmount((a, b) => {
                if (onCurrent != null) onCurrent.Invoke(a, b);
            })
            .OnErrorMsg(str => {
                if (onError != null) onError.Invoke(str);
            })
        );
    }

    private void UpdateIos()
    {
        Application.OpenURL(IsIPad() ? iosIpadDownloadUrl : iosDownloadUrl);
    }

    private bool InstallAPK(string path)
    {
        try
        {
            var Intent = new AndroidJavaClass("android.content.Intent");
            var ACTION_VIEW = Intent.GetStatic<string>("ACTION_VIEW");
            var FLAG_ACTIVITY_NEW_TASK = Intent.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
            var intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);
            var file = new AndroidJavaObject("java.io.File", path);
            var Uri = new AndroidJavaClass("android.net.Uri");
            var uri = Uri.CallStatic<AndroidJavaObject>("fromFile", file);
            intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
            intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
            intent.Call<AndroidJavaObject>("setClassName", "com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity");
            var UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            var currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            currentActivity.Call("startActivity", intent);
            return true;
        }
        catch (System.Exception e)
        {
            Debug.Log(e.Message);
            return false;
        }
    }

}
    /// <summary>
    /// 没有网络
    /// </summary>
    /// <returns></returns>
    public static bool IsNotNetwork()
    {
        return Application.internetReachability == NetworkReachability.NotReachable;
    }

猜你喜欢

转载自blog.csdn.net/qq_17813937/article/details/82254393