Files
ichni_Official/Assets/Scripts/Online/Logic/ThirdPartyServiceManager.cs
Developer ebd5dafa2d update
2026-06-18 10:06:49 +08:00

144 lines
4.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 Cysharp.Threading.Tasks;
using Sirenix.OdinInspector;
using TapSDK.Core;
using TapSDK.Login;
using UnityEngine;
namespace IchniOnline.Online.Logic
{
public class ThirdPartyServiceManager:SerializedMonoBehaviour
{
public static ThirdPartyServiceManager Instance { get; private set; } = null!;
/// <summary>
/// TapTap 登录成功时触发,参数为登录获得的 TapTapAccount
/// </summary>
public event Action<TapTapAccount> OnLoginSuccess;
/// <summary>
/// TapTap 登录被用户取消时触发
/// </summary>
public event Action OnLoginCanceled;
/// <summary>
/// TapTap 登录失败时触发,参数为异常信息
/// </summary>
public event Action<string> OnLoginFailed;
/// <summary>
/// TapTap 登录成功并获取 AccessToken 后触发,参数为 TapTapAccount 和 AccessToken。
/// AuthService 可订阅此事件在通用成功流程之前拦截 token 进行 API 调用。
/// </summary>
public event Action<TapTapAccount, AccessToken> OnLoginWithToken;
// 使用 static 字段防止 Domain Reload 后重复初始化 TapSDK 原生模块导致崩溃
private static bool _sdkInitialized;
/// <summary>
/// Domain Reload 时重置 static 状态,确保 Play Mode 正确重新初始化
/// </summary>
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void ResetStatic()
{
_sdkInitialized = false;
}
private void Awake()
{
if (Instance != null)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
}
private void Start()
{
InitializeTapTapSDK();
}
private void InitializeTapTapSDK()
{
if (_sdkInitialized) return;
// 核心配置 详细参数见 [TapTapSDK]
TapTapSdkOptions coreOptions = new TapTapSdkOptions()
{
clientId = "hkbfpbh2jv2kbxupmo",
clientToken = "Cry8OrA9EmfAetgu1RduPrWntgba2Qt44uC5tfEB",
region = TapTapRegionType.Overseas,
preferredLanguage = TapTapLanguageType.en,
enableLog = true
};
try
{
TapTapSDK.Init(coreOptions);
_sdkInitialized = true;
}
catch (Exception e)
{
Debug.LogError($"[ThirdPartyServiceManager] TapSDK 初始化失败: {e.Message}");
}
}
/// <summary>
/// 发起 TapTap 登录,由 UI 按钮调用。
/// 登录结果通过事件 OnLoginSuccess / OnLoginCanceled / OnLoginFailed 通知。
/// </summary>
public void StartTapTapLogin()
{
StartTapTapLoginAsync().Forget();
}
private async UniTaskVoid StartTapTapLoginAsync()
{
// 确保 SDK 已初始化
if (!_sdkInitialized)
{
InitializeTapTapSDK();
}
try
{
// 定义授权范围
List<string> scopes = new List<string>
{
TapTapLogin.TAP_LOGIN_SCOPE_PUBLIC_PROFILE,
TapTapLogin.TAP_LOGIN_SCOPE_EMAIL
};
// 发起 Tap 登录
var account = await TapTapLogin.Instance.LoginWithScopes(scopes.ToArray());
Debug.Log($"TapTap 登录成功,用户 ID{account.openId}name{account.name}");
OnLoginWithToken?.Invoke(account, account.accessToken);
LoginCacheManager.SaveFromTapTapAccount(account);
OnLoginSuccess?.Invoke(account);
}
catch (TaskCanceledException)
{
Debug.Log("用户取消 TapTap 登录");
OnLoginCanceled?.Invoke();
}
catch (Exception exception)
{
Debug.LogError($"TapTap 登录失败:{exception}");
OnLoginFailed?.Invoke(exception.Message);
}
}
/// <summary>
/// 登出 TapTap
/// </summary>
public void Logout()
{
TapTapLogin.Instance.Logout();
Debug.Log("TapTap 已登出");
}
}
}