fix: 修复国内设备启动闪退问题,禁用 Firebase 自动初始化

修改 FirebaseAuthManager 改为懒加载,仅在用户触发登录时初始化 Firebase
移除 AndroidManifest 中 Firebase 相关自动初始化的 provider
关闭 MainScene 的服务器后门开关,提升安全性
This commit is contained in:
“虞渠成” 2026-09-24 10:16:09 +08:00
parent c62ae623e8
commit 99e461590d
3 changed files with 81 additions and 17 deletions

View File

@ -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需要添加 -->

View File

@ -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

View File

@ -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)
{