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"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.photonmatrix.photonmatrix">
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
package="com.photonmatrix.photonmatrix">
|
|
||||||
<!-- 网络权限 -->
|
<!-- 网络权限 -->
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
@ -39,6 +37,13 @@
|
|||||||
<data android:scheme="com.googleusercontent.apps.785438724947-kpjbqi43hbj6eddianbjsgkgkkclkfmd" />
|
<data android:scheme="com.googleusercontent.apps.785438724947-kpjbqi43hbj6eddianbjsgkgkkclkfmd" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</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 配置 -->
|
<!-- Firebase 配置 -->
|
||||||
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
|
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
|
||||||
<!-- 如果你使用 Firebase Messaging,需要添加 -->
|
<!-- 如果你使用 Firebase Messaging,需要添加 -->
|
||||||
|
|||||||
@ -485,7 +485,7 @@ MonoBehaviour:
|
|||||||
- https://nextreal.cn/photon-matrix-api
|
- https://nextreal.cn/photon-matrix-api
|
||||||
- https://api.photonmatrixlab.com
|
- https://api.photonmatrixlab.com
|
||||||
serverBaseUrl: https://api.photonmatrixlab.com
|
serverBaseUrl: https://api.photonmatrixlab.com
|
||||||
enableServerBackdoor: 1
|
enableServerBackdoor: 0
|
||||||
backdoorTapCount: 5
|
backdoorTapCount: 5
|
||||||
backdoorTapInterval: 1
|
backdoorTapInterval: 1
|
||||||
defaultTimeout: 30
|
defaultTimeout: 30
|
||||||
|
|||||||
@ -36,7 +36,9 @@ namespace Kill.Managers
|
|||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
Instance = this;
|
Instance = this;
|
||||||
InitializeFirebase();
|
// 不在此处初始化 Firebase。
|
||||||
|
// 国内无 Google 服务的设备上,启动即初始化 Firebase 会闪退,
|
||||||
|
// 因此改为懒加载:在真正用到 Firebase(谷歌/苹果登录)时才初始化。
|
||||||
InitializeAppleAuth();
|
InitializeAppleAuth();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,30 +47,74 @@ namespace Kill.Managers
|
|||||||
appleAuthManager?.Update();
|
appleAuthManager?.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Firebase 是否已初始化完成
|
||||||
|
private bool firebaseReady;
|
||||||
|
// 初始化是否已开始(防止并发重复初始化)
|
||||||
|
private bool firebaseInitStarted;
|
||||||
|
// 等待初始化完成的回调队列
|
||||||
|
private readonly List<Action> pendingReady = new List<Action>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化 Firebase
|
/// 懒加载:确保 Firebase 已初始化,未初始化则先初始化,完成后在主线程回调 onReady。
|
||||||
/// </summary>
|
/// </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
|
#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
|
||||||
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
|
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
|
||||||
{
|
{
|
||||||
var dependencyStatus = task.Result;
|
var dependencyStatus = task.Result;
|
||||||
if (dependencyStatus == DependencyStatus.Available)
|
MainThread.Enqueue(() =>
|
||||||
{
|
{
|
||||||
auth = FirebaseAuth.DefaultInstance;
|
firebaseReady = dependencyStatus == DependencyStatus.Available;
|
||||||
Debug.Log("Firebase 初始化成功");
|
if (firebaseReady)
|
||||||
}
|
{
|
||||||
else
|
auth = FirebaseAuth.DefaultInstance;
|
||||||
{
|
Debug.Log("Firebase 初始化成功");
|
||||||
Debug.LogError($"Firebase 初始化失败: {dependencyStatus}");
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError($"Firebase 初始化失败: {dependencyStatus},第三方登录不可用");
|
||||||
|
}
|
||||||
|
FlushPending();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
Debug.Log("Firebase 第三方登录仅在 Android / iOS 平台可用");
|
FlushPending();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 回调所有等待初始化完成的调用
|
||||||
|
/// </summary>
|
||||||
|
private void FlushPending()
|
||||||
|
{
|
||||||
|
var callbacks = pendingReady.ToArray();
|
||||||
|
pendingReady.Clear();
|
||||||
|
firebaseInitStarted = false;
|
||||||
|
foreach (var cb in callbacks)
|
||||||
|
cb?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化 Apple Sign In
|
/// 初始化 Apple Sign In
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -90,7 +136,11 @@ namespace Kill.Managers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void SignInWithGoogle(Action<GoogleLoginResult> onSuccess, Action<string> onError, int timeoutSeconds = 30)
|
public void SignInWithGoogle(Action<GoogleLoginResult> onSuccess, Action<string> onError, int timeoutSeconds = 30)
|
||||||
{
|
{
|
||||||
SignInWithProvider("google.com", new string[] { "email", "profile" }, onSuccess, onError, timeoutSeconds);
|
// 懒加载:仅在用户主动点谷歌登录时才初始化 Firebase,未初始化则先初始化
|
||||||
|
EnsureFirebaseReady(() =>
|
||||||
|
{
|
||||||
|
SignInWithProvider("google.com", new string[] { "email", "profile" }, onSuccess, onError, timeoutSeconds);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -98,6 +148,15 @@ namespace Kill.Managers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void SignInWithApple(Action<GoogleLoginResult> onSuccess, Action<string> onError, int timeoutSeconds = 30)
|
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 UNITY_IOS && !UNITY_EDITOR
|
||||||
if (appleAuthManager == null)
|
if (appleAuthManager == null)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user