自从一周以来我在 Xamarin Android 应用程序上遇到了这个问题。 我用这个方法得到了令牌:
public async void GetToken()
{
var AppCheckToken = await AppCheck.GetToken(false);
if (AppCheckToken is AppCheckTokenResult Tok)
{
string r;
r = Tok.Token;
Preferences.Set("AppCheckToken", r);
}
}
在调试和物理(生产)模式下始终返回此字符串
eyJlcnJvciI6IlVOS05PV05fRVJST1IifQ==
。我还尝试在 Play Console 中进行内部测试,然后从那里下载应用程序,但结果始终相同。
这是我初始化 AppCheck 的方法:
auth = FirebaseAuth.GetInstance(app);
PlayIntegrityAppCheckProviderFactory f = new PlayIntegrityAppCheckProviderFactory();
f.Create(app);
AppCheck = FirebaseAppCheck.GetInstance(app);
AppCheck.InstallAppCheckProviderFactory(f);
AppCheck.SetTokenAutoRefreshEnabled(true);
我还注意到 GetToken() 方法中声明的 AppCheckToken 变量始终为 null 并返回此 FirebaseException:
--- 托管 Firebase.FirebaseException 堆栈跟踪结束 --- com.google.firebase.FirebaseException: null at com.google.firebase.appcheck.internal.DefaultFirebaseAppCheck.lambda$getToken$1(DefaultFirebaseAppCheck.java:205) 在 com.google.firebase.appcheck.internal.DefaultFirebaseAppCheck$$ExternalSyntheticLambda1.then(未知 来源:0) 于 com.google.android.gms.tasks.zze.run(com.google.android.gms:play-services-tasks@@18.0.2:1) 在 android.os.Handler.handleCallback(Handler.java:942) 处 android.os.Handler.dispatchMessage(Handler.java:99) 位于 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7892) 在 java.lang.reflect.Method.invoke(本机方法) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 引起 通过:java.lang.NumberFormatException:null at java.lang.Long.parseLong(Long.java:699) 在 java.lang.Long.parseLong(Long.java:861) 在 com.google.firebase.appcheck.playintegrity.internal.PlayIntegrityAppCheckProvider.lambda$getPlayIntegrityAttestation$4$com-google-firebase-appcheck-playintegrity-internal-PlayIntegrityAppCheckProvider(PlayIntegrityAppCheckProvider.java:105) 位于 com.google.firebase.appcheck.playintegrity.internal.PlayIntegrityAppCheckProvider$$ExternalSyntheticLambda1.then(未知 资料来源:4) 于 com.google.android.gms.tasks.zzo.run(com.google.android.gms:play-services-tasks@@18.0.2:1) ...还有8个
我还尝试从 Firebase 控制台生成调试令牌,以便在调试模式下在应用程序中使用,但是当我调用 Firebase Storage(已强制执行)时,它一直显示“AppCheck 令牌无效”。
更新: 我也尝试过这种方法:
FirebaseAppCheck AppCheck = FirebaseAppCheck.Instance; AppCheck.InstallAppCheckProviderFactory(PlayIntegrityProviderFactory.Instance);
仅一次,FirebaseException 会说“您的设备中的 PlayStore 未更新”之类的内容。所以我更新了 PlayStore,现在它抛出了与上述相同的错误。我尝试使用 AddOnSuccessListener(this)
获取令牌,但结果是相同的。
另外我必须告诉,在 if 语句之前声明的 var AppCheckToken
始终成为类 DefaultFirebaseAppCheckTokenResult 的对象。
我不知道还能做什么...
恕我直言,对象声明(为空)存在问题,但由于没有关于如何在 C# 上使用 AppCheck 的文档,我完蛋了。
嘿,我面临着类似的问题,发现以下内容对我有用。问题是在调试中 AppCheckTokenResult 的结果与您在发布版本中收到的结果类型不同。我检索令牌的方法只是添加了一种进一步的类型检查来解释这一点。
public async Task<string> GetAppCheckToken()
{
var appCheck = FirebaseAppCheck.GetInstance(_firebaseApp);
var token = string.Empty;
var appCheckToken = await appCheck.GetAppCheckToken(false);
if (appCheckToken is AppCheckTokenResult Tok)
{
token = Tok.Token;
}
else if (appCheckToken is DefaultAppCheckToken defaultToken)
{
token = defaultToken.Token;
}
return token;
}
DefaultAppCheckToken
位于 Firebase.AppCheck.Internal 命名空间中,因此您需要在文件顶部包含以下内容 using Firebase.AppCheck.Internal;
为了清楚起见,我按以下方式为应用程序检查设置了 Firebase 配置
var firebaseApp = FirebaseApp.InitializeApp(activity);
// Get an instance of FirebaseAppCheck
FirebaseAppCheck firebaseAppCheck =
FirebaseAppCheck.GetInstance(firebaseApp);
//// Continue with Firebase AppCheck initialization
#if DEBUG
firebaseAppCheck.InstallAppCheckProviderFactory(
DebugAppCheckProviderFactory.Instance);
#else
firebaseAppCheck.InstallAppCheckProviderFactory(
PlayIntegrityAppCheckProviderFactory.Instance);
#endif
我希望这有帮助。我也因缺乏有关 Firebase 的 dotnet 接口的文档而苦苦挣扎。但这样做是非常有意义的。