killapp/Assets/Scripts/UI/UIManager.cs
“虞渠成” 10ad83d6b0 refactor: 优化密码校验与第三方登录逻辑,新增未设密码引导流程
1. 移除MainScene和UIManager中的首次启动标记逻辑
2. 新增DataManager的HasAnyPassword方法检测用户是否设置过密码
3. 完善HomePage的CheckPasswordPage,新增未设密码引导弹窗
4. 调整SelfVerificationCodePanel支持自定义返回回调
5. 适配苹果第三方登录无需强制设置密码的审核要求
6. 新增多语言词条支持密码引导文案
7. 移除HomePageCtrl在应用暂停时自动锁定按钮的逻辑
2026-09-20 14:04:59 +08:00

272 lines
8.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Kill.Managers;
using Kill.Network;
using Kill.UI.Components;
using Kill.UI.Pages;
using UnityEngine;
namespace Kill.UI
{
public class UIManager : MonoBehaviour
{
public enum PageName
{
nullPage = 0,
loginPage=1,
safetylearningPage=2,
homePage=3,
connectDevicePage=4,
deviceInfoPage=5,
selfPage=6,
videoPage=7,
rankPage=8
}
[System.Serializable]
public struct Page
{
public PageName pageName;
public string bundleName;
}
public static UIManager Instance;
public List<Page> pages;
public GameObject nowPage;
public PageName nowPageName = PageName.nullPage;
public Transform bg;
// 返回事件管理
private Action backAction;
private bool isMainPage = false;
private float lastBackTime = 0f;
private const float DOUBLE_BACK_INTERVAL = 1f;
void Awake()
{
Instance = this;
}
void Update()
{
// 监听返回键Android 物理返回键)
if (Input.GetKeyDown(KeyCode.Escape))
{
Debug.Log("返回键被按下");
OnBackPressed();
}
}
public Action GetBackAction()
{
return backAction;
}
/// <summary>
/// 注册返回事件
/// </summary>
public void RegisterBackAction(Action action)
{
backAction = action;
}
Action lastBackAction=null;
public void AddBackAction(Action action)
{
if(backAction!=null)
{
lastBackAction=backAction;
}
RegisterBackAction(action);
}
public void RecoverBackAction()
{
if(lastBackAction!=null)
{
RegisterBackAction(lastBackAction);
}
lastBackAction=null;
}
/// <summary>
/// 清除返回事件
/// </summary>
public void ClearBackAction()
{
backAction = null;
}
/// <summary>
/// 设置当前是否为主页面
/// </summary>
public void SetMainPage(bool isMain)
{
isMainPage = isMain;
}
/// <summary>
/// 返回键处理
/// </summary>
private void OnBackPressed()
{
if(LoadingUI.Instance.loadingPanel.activeSelf)
{
return;
}
// 如果有注册的返回事件,先执行
if (backAction != null)
{
Debug.Log("执行注册返回");
Debug.Log(backAction.Method.Name);
var action = backAction;
action.Invoke();
return;
}
// 没有返回事件时,按主页面处理(双击退出)
HandleMainPageBack();
}
/// <summary>
/// 处理主页面返回(双击退出)
/// </summary>
private void HandleMainPageBack()
{
Debug.Log("执行退出");
if (Time.time - lastBackTime < DOUBLE_BACK_INTERVAL)
{
// 退出应用
Application.Quit();
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
}
else
{
// 第一次返回,显示提示
lastBackTime = Time.time;
ToastUI.Show("100037");
}
}
public async Task Init()
{
if (DataManager.Instance.token == "")
{
OpenPage(PageName.loginPage, null, false);
}
else
{
bool hasToken=await DataManager.Instance.TokenLogin();
if(hasToken)
OpenPage(PageName.homePage, null, true);
else
OpenPage(PageName.loginPage);
}
}
public async void OpenPage(PageName pageName, Action backAction = null, bool isMainPage = false)
{
Debug.Log("打开页面:" + pageName);
// 清除之前的返回事件
ClearBackAction();
// 销毁旧页面
switch (nowPageName)
{
case PageName.nullPage:
break;
case PageName.loginPage:
Destroy(nowPage);
break;
case PageName.homePage:
DataManager.Instance.selectedDevice = HomePageCtrl.Instance.selectedDevice;
Destroy(nowPage);
break;
default:
Destroy(nowPage);
break;
}
// 设置返回事件和主页面标记
if (backAction != null)
{
RegisterBackAction(backAction);
}
SetMainPage(isMainPage);
int index = pages.FindIndex(x => x.pageName == pageName);
switch (pageName)
{
case PageName.nullPage:
break;
case PageName.loginPage:
string assetName = "loginPage.prefab";
GameObject prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.safetylearningPage:
assetName = "safetylearningPage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.homePage:
assetName = "homePage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.connectDevicePage:
assetName = "connectDevicePage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.deviceInfoPage:
assetName = "deviceInfoPage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.selfPage:
assetName = "selfPage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.videoPage:
assetName = "videoPage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
case PageName.rankPage:
assetName = "rankPage.prefab";
prefab = await LoadRes.Instance.LoadAssetAsync<GameObject>(pages[index].bundleName, assetName);
nowPage = Instantiate(prefab, bg);
nowPageName = pageName;
break;
}
}
/// <summary>
/// 打开子页面(自动注册返回事件)
/// </summary>
public void OpenSubPage(PageName pageName, Action backAction)
{
OpenPage(pageName, backAction, false);
}
/// <summary>
/// 打开主页面(双击返回退出)
/// </summary>
public void OpenMainPage(PageName pageName)
{
OpenPage(pageName, null, true);
}
}
}