有时候热更也不能满足需求时只能整包更新
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;
}