我正在研究Unity 2017.2.0f3和firebase SDK 4.2.1当我在Unity编辑器环境中运行PC时,它可以正常工作,当我将其构建到APK并在Android上运行它时设备,firebase给我一个错误。
我的代码:
FirebaseApp.DefaultInstance.SetEditorP12FileName("xxxxxxxxxxxxxxx-admin-sdk.p12");
FirebaseApp.DefaultInstance.SetEditorServiceAccountEmail("xxxxxxxxxxxxxxx.iam.gserviceaccount.com");
FirebaseApp.DefaultInstance.SetEditorP12Password("notasecret");
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
dependencyStatus = task.Result;
if (dependencyStatus == DependencyStatus.Available) {
InitializeFirebase();
} else {
Debug.LogError(
"Could not resolve all Firebase dependencies: " + dependencyStatus);
}
});
我正在使用服务帐户来连接,在我运行该应用程序时,它在Unity编辑器上的工作非常完美。但是,当我生成APK并将其安装在Android设备(Samsung S7,Android 7.0)上时,当我运行应用程序时,LogCat会给我这个错误:
11-22 21:23:58.819: E/Unity(5835): Firebase.Database.Internal.Core.ValueEventRegistration:FireCancelEvent(DatabaseError)
11-22 21:23:58.819: E/Unity(5835): Firebase.Database.Internal.Core.View.CancelEvent:Fire()
11-22 21:23:58.819: E/Unity(5835): Firebase.Database.Internal.Core.View.Runnable30:Run()
在此链接上还报告了错误:https://github.com/firebase/quickstart-unity/issues/120
欢迎任何帮助..
好吧...我犯了夫妇错误,终于解决了。由于某种原因,还不足以在您的项目上设置服务帐户,可以从Firebase实时数据库读取/编写数据。运行游戏时,它可以在Unity编辑器上使用。但是,当您在移动设备(Android)上符合APK时,App(Game)必须验证有效的firebase用户
我在Firebase控制台上创建了一个用户签名方法电子邮件/密码。然后,我使用Firabase Authetication Unity软件包在5月应用程序上进行了身份验证,瞧,...它有效。当用户在firebase上进行身份验证时,firebase系统会自动将实时数据库规则更改为true
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
https://firebase.google.com/docs/database/unity/start
我的工作代码,即使在Unity编辑器和移动设备上也是如此:
private Firebase.Auth.FirebaseAuth auth;
private Firebase.Auth.FirebaseUser newUser;
void Awake() {
//Using Firebase SDK
//This is needed only for the unity editor
FirebaseApp.DefaultInstance.SetEditorP12FileName("xxxxxxxxxxxxxxxxxxx-admin-sdk.p12");
FirebaseApp.DefaultInstance.SetEditorServiceAccountEmail("xxxxxxxxxxxxxxxx@yyyyyyyyyyyyyyyyy.gserviceaccount.com");
FirebaseApp.DefaultInstance.SetEditorP12Password("notasecret");
//--------------------------------------
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
dependencyStatus = task.Result;
if (dependencyStatus == DependencyStatus.Available) {
InitializeFirebase();
} else {
Debug.LogError(
"Could not resolve all Firebase dependencies: " + dependencyStatus);
}
});
}
// Initialize the Firebase database:
protected virtual void InitializeFirebase() {
FirebaseApp app = FirebaseApp.DefaultInstance;
// NOTE: You'll need to replace this url with your Firebase App's database
// path in order for the database connection to work correctly in editor
//This is needed only for the unity editor
app.SetEditorDatabaseUrl("https://xxxx.yyyyyyyyy.com/");
if (app.Options.DatabaseUrl != null) app.SetEditorDatabaseUrl(app.Options.DatabaseUrl);
//--------------------------------------
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
auth.SignInWithEmailAndPasswordAsync("mail@mail.com", "strongpassword").ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("SignInWithEmailAndPasswordAsync encountered an error: " + task.Exception);
return;
}
Firebase.Auth.FirebaseUser newUser = task.Result;
Debug.LogFormat("User signed in successfully: {0} ({1})",
newUser.DisplayName, newUser.UserId);
//Getting client id for FB using device id
FirebaseDatabase.DefaultInstance.GetReference("node1").Child(node2).Child("node3")
.ValueChanged += HandleChanged;
});
}
注意:密码应该很强。不要忘记在销毁方法上进行登录,否则下次尝试连接时会出现错误。
auth.SignOut();