using UnityEngine;
#if UNITY_IOS && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif
namespace BF
{
public class GameLaunchManager : ManagerBase
{
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern void IOS_ATTrack();
#endif
public LaunchRequester LaunchRequester { get; private set; }
public int LaunchTimes { get; private set; }
public bool LoadedFirstAb = false;
private bool isShowAtt = false;
GameLaunchProcessorBase currentProcessor;
static GameLaunchManager instance;
public static GameLaunchManager Create()
{
BFLog.LogAssert(instance == null, "This method only allows BFMain to call once");
instance = new GameLaunchManager();
return instance;
}
GameLaunchManager() { }
public override void SetMono(MonoBehaviour mono)
{
base.SetMono(mono);
}
public override void Init()
{
LaunchRequester = new LaunchRequester();
LaunchTimes = 0;
}
public override void Update()
{
if (currentProcessor != null)
{
currentProcessor.Update();
}
}
public override void Destroy()
{
}
public void ShowIOSATTrack()
{
#if UNITY_IOS && !UNITY_EDITOR
// ATT的回调里面会初始化广告SDK,所以这里处理一下如果多次调用,只会生效一次
if (!isShowAtt)
{
isShowAtt = true;
IOS_ATTrack();
}
#endif
}
///
/// 游戏启动入口
///
public void LaunchGame()
{
LaunchTimes++;
#if USE_AB
GameLaunchProcessorBase processor = new LaunchSuccProcessor();
BFMain.IsStandAlone = false;
processor = new FixUpProcessor(processor);
processor = new DownloadUpdateProcessor(processor);
processor = new CalculateDiffProcessor(processor);
processor = new OnGetVersionProcessor(processor);
processor = new RequestVersionProcessor(processor);
processor = new PreCheckProcessor(processor);
processor = new FirstABProcessor(processor);
processor = new PrepareProcessor(processor);
processor.Process(LaunchRequester);
#else
GameLaunchProcessorBase processor = new LaunchSuccProcessor();
processor = new RequestLoginCenterConfigProcessor(processor);
processor.Process(LaunchRequester);
#endif
}
///
/// 选服拉更新时版本不一致调用,除首包外的资源和lua全部要卸载掉
///
public void LaunchForLogin(string versionJson)
{
LaunchTimes++;
GameLaunchProcessorBase processor = new LaunchSuccProcessor();
processor = new FixUpProcessor(processor);
processor = new DownloadUpdateProcessor(processor);
processor = new CalculateDiffProcessor(processor);
processor = new OnGetVersionProcessor(processor);
LaunchRequester.SetVersionInfo(versionJson);
processor.Process(LaunchRequester);
BFLog.LogDebug(BFLog.DEBUG_GAME_LAUNCH, "green", "LaunchForLogin " + versionJson);
}
///
/// 游戏过程中踢下线再登陆时版本不一致调用,要卸载掉所有资源和lua,重新把首包加回来
///
public void LaunchForRelogin(string versionJson)
{
LaunchTimes++;
GameLaunchProcessorBase processor = new LaunchSuccProcessor();
processor = new FixUpProcessor(processor);
processor = new DownloadUpdateProcessor(processor);
processor = new CalculateDiffProcessor(processor);
processor = new OnGetVersionProcessor(processor);
processor = new FirstABProcessor(processor);
LaunchRequester.SetVersionInfo(versionJson);
processor.Process(LaunchRequester);
BFLog.LogDebug(BFLog.DEBUG_GAME_LAUNCH, "green", "LaunchForRelogin " + versionJson);
}
///
/// 切语言调用,不用请求版本
///
public void LaunchForLanguage(string language)
{
LaunchTimes++;
LaunchRequester.isHotUpdate = true;
LaunchRequester.versionAbcc = LaunchRequester.persistentAbcc;
GameLaunchProcessorBase processor = new LaunchSuccProcessor();
processor = new FixUpProcessor(processor);
processor = new DownloadUpdateProcessor(processor);
processor = new CalculateDiffProcessor(processor);
processor = new OnGetVersionProcessor(processor);
processor = new FirstABProcessor(processor);
processor.Process(LaunchRequester);
BFLog.LogDebug(BFLog.DEBUG_GAME_LAUNCH, "green", "LaunchForLanguage " + language);
}
public bool IsNetworkReachability()
{
return Application.internetReachability != NetworkReachability.NotReachable;
}
public bool IsWifi()
{
return Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork;
}
public void SetCurrentProcessor(GameLaunchProcessorBase processor)
{
BFLog.LogDebug(BFLog.DEBUG_GAME_LAUNCH, "green", "current processor " + processor);
currentProcessor = processor;
}
///
/// 是否是白名单版本
///
public bool IsVersionWhiteList()
{
if (BFPlatform.IsPublishChannel())
{
return false;
}
else
{
#if SKIP_VERSION
return true;
#else
return false;
#endif
}
}
public AssetBundle GetFirstAB()
{
return LaunchRequester.firstAb;
}
public string GetCurrentVersion()
{
if (LaunchRequester.persistentAbcc != null)
{
return LaunchRequester.persistentAbcc.version;
}
#if UNITY_EDITOR && !USE_AB
return "0.1.0";
#else
return "";
#endif
}
public void QuitGame()
{
Application.Quit();
}
public static string ForJustice(string str)
{
if (!str.StartsWith(BFMain.FILE_HEAD_BASE64))
{
return str;
}
var bytes = System.Convert.FromBase64String(str);
var index = 0;
var headCount = BFMain.FILE_HEAD.Length;
var bytesCount = bytes.Length;
var key = BF.Utils.GetFreeChar();
var keyLength = key.Length;
var realCount = bytesCount - headCount;
for (int i = 0; i < realCount; i++)
{
bytes[i] = (byte)(bytes[i + headCount] ^ (key[index % key.Length]));
index++;
if (index >= keyLength) {
index = 0;
}
}
return System.Text.Encoding.UTF8.GetString(bytes, 0, realCount);
}
}
}