fix: 修复国内设备启动闪退问题,禁用 Firebase 自动初始化
修改 FirebaseAuthManager 改为懒加载,仅在用户触发登录时初始化 Firebase 移除 AndroidManifest 中 Firebase 相关自动初始化的 provider 关闭 MainScene 的服务器后门开关,提升安全性
This commit is contained in:
parent
c62ae623e8
commit
99e461590d
@ -1,7 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.photonmatrix.photonmatrix">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.photonmatrix.photonmatrix">
|
||||
<!-- 网络权限 -->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
@ -39,6 +37,13 @@
|
||||
<data android:scheme="com.googleusercontent.apps.785438724947-kpjbqi43hbj6eddianbjsgkgkkclkfmd" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!-- 禁用 Firebase 自动初始化:FirebaseInitProvider 等 ContentProvider 会在冷启动时自动初始化 Firebase 并访问 Google 服务,
|
||||
在无 GMS/关闭谷歌服务的国内设备上会导致启动闪退。移除后 Firebase 改为由 C# 在真正需要时(点谷歌/苹果登录)才初始化。 -->
|
||||
<provider android:name="com.google.firebase.provider.FirebaseInitProvider" android:authorities="com.photonmatrix.photonmatrix.firebaseinitprovider" tools:node="remove" />
|
||||
<provider android:name="com.google.android.gms.measurement.AppMeasurementInitializer" tools:node="remove" />
|
||||
<provider android:name="com.google.android.gms.measurement.AppMeasurementContentProvider" tools:node="remove" />
|
||||
<!-- 禁用 Firebase Analytics 自动采集,配合块 provider 移除,确保不触发原生初始化 -->
|
||||
<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" tools:node="replace" />
|
||||
<!-- Firebase 配置 -->
|
||||
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
|
||||
<!-- 如果你使用 Firebase Messaging,需要添加 -->
|
||||
|
||||
@ -485,7 +485,7 @@ MonoBehaviour:
|
||||
- https://nextreal.cn/photon-matrix-api
|
||||
- https://api.photonmatrixlab.com
|
||||
serverBaseUrl: https://api.photonmatrixlab.com
|
||||
enableServerBackdoor: 1
|
||||
enableServerBackdoor: 0
|
||||
backdoorTapCount: 5
|
||||
backdoorTapInterval: 1
|
||||
defaultTimeout: 30
|
||||
|
||||
@ -36,7 +36,9 @@ namespace Kill.Managers
|
||||
private void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
InitializeFirebase();
|
||||
// 不在此处初始化 Firebase。
|
||||
// 国内无 Google 服务的设备上,启动即初始化 Firebase 会闪退,
|
||||
// 因此改为懒加载:在真正用到 Firebase(谷歌/苹果登录)时才初始化。
|
||||
InitializeAppleAuth();
|
||||
}
|
||||
|
||||
@ -45,30 +47,74 @@ namespace Kill.Managers
|
||||
appleAuthManager?.Update();
|
||||
}
|
||||
|
||||
// Firebase 是否已初始化完成
|
||||
private bool firebaseReady;
|
||||
// 初始化是否已开始(防止并发重复初始化)
|
||||
private bool firebaseInitStarted;
|
||||
// 等待初始化完成的回调队列
|
||||
private readonly List<Action> pendingReady = new List<Action>();
|
||||
|
||||
/// <summary>
|
||||
/// 初始化 Firebase
|
||||
/// 懒加载:确保 Firebase 已初始化,未初始化则先初始化,完成后在主线程回调 onReady。
|
||||
/// </summary>
|
||||
private void InitializeFirebase()
|
||||
private void EnsureFirebaseReady(Action onReady)
|
||||
{
|
||||
if (onReady == null) return;
|
||||
|
||||
if (firebaseReady)
|
||||
{
|
||||
onReady();
|
||||
return;
|
||||
}
|
||||
if (firebaseInitStarted)
|
||||
{
|
||||
pendingReady.Add(onReady);
|
||||
return;
|
||||
}
|
||||
|
||||
firebaseInitStarted = true;
|
||||
pendingReady.Add(onReady);
|
||||
StartFirebaseInit();
|
||||
}
|
||||
|
||||
private void StartFirebaseInit()
|
||||
{
|
||||
#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
|
||||
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
|
||||
{
|
||||
var dependencyStatus = task.Result;
|
||||
if (dependencyStatus == DependencyStatus.Available)
|
||||
MainThread.Enqueue(() =>
|
||||
{
|
||||
firebaseReady = dependencyStatus == DependencyStatus.Available;
|
||||
if (firebaseReady)
|
||||
{
|
||||
auth = FirebaseAuth.DefaultInstance;
|
||||
Debug.Log("Firebase 初始化成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"Firebase 初始化失败: {dependencyStatus}");
|
||||
Debug.LogError($"Firebase 初始化失败: {dependencyStatus},第三方登录不可用");
|
||||
}
|
||||
FlushPending();
|
||||
});
|
||||
});
|
||||
#else
|
||||
Debug.Log("Firebase 第三方登录仅在 Android / iOS 平台可用");
|
||||
FlushPending();
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 回调所有等待初始化完成的调用
|
||||
/// </summary>
|
||||
private void FlushPending()
|
||||
{
|
||||
var callbacks = pendingReady.ToArray();
|
||||
pendingReady.Clear();
|
||||
firebaseInitStarted = false;
|
||||
foreach (var cb in callbacks)
|
||||
cb?.Invoke();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化 Apple Sign In
|
||||
/// </summary>
|
||||
@ -89,8 +135,12 @@ namespace Kill.Managers
|
||||
/// 谷歌登录
|
||||
/// </summary>
|
||||
public void SignInWithGoogle(Action<GoogleLoginResult> onSuccess, Action<string> onError, int timeoutSeconds = 30)
|
||||
{
|
||||
// 懒加载:仅在用户主动点谷歌登录时才初始化 Firebase,未初始化则先初始化
|
||||
EnsureFirebaseReady(() =>
|
||||
{
|
||||
SignInWithProvider("google.com", new string[] { "email", "profile" }, onSuccess, onError, timeoutSeconds);
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -98,6 +148,15 @@ namespace Kill.Managers
|
||||
/// </summary>
|
||||
public void SignInWithApple(Action<GoogleLoginResult> onSuccess, Action<string> onError, int timeoutSeconds = 30)
|
||||
{
|
||||
// 懒加载:与谷歌登录同理,iOS 上 Firebase 也按需初始化
|
||||
EnsureFirebaseReady(() => SignInWithAppleInternal(onSuccess, onError));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 苹果登录真正实现(须在 Firebase 初始化完成后调用)
|
||||
/// </summary>
|
||||
private void SignInWithAppleInternal(Action<GoogleLoginResult> onSuccess, Action<string> onError)
|
||||
{
|
||||
#if UNITY_IOS && !UNITY_EDITOR
|
||||
if (appleAuthManager == null)
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user