# #c# #android #firebase #unity3d #firebase-realtime-database
Вопрос:
Я создал простое приложение на Unity 2020.3.0.f1 с интеграцией Firebase sdk 7.1.0. Я в основном выполняю простое чтение и запись в firebase. Он хорошо работает в редакторе Unity, но не в мобильной сборке, хотя сборка apk на 100% успешна.
Операционная система: Ubuntu 20.04(LTS).
Вот мой простой код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Firebase.Database;
using TMPro;
public class firebase_script : MonoBehaviour
{
DatabaseReference reference;
string text_place;
public TextMeshProUGUI text;
// Start is called before the first frame update
void Start()
{
reference= FirebaseDatabase.DefaultInstance.RootReference;
}
public void get_updates(){
reference.Child("plant").GetValueAsync().ContinueWith(task => {
if(task.IsFaulted){
Debug.Log("Failed to fetch Value");
}
else if(task.IsCompleted){
DataSnapshot snapshot =task.Resu<
text_place=snapshot.Child("moisture").Value.ToString();
}
});
}
// Update is called once per frame
void Update()
{
text.text=text_place;
}
}
Редактировать: Когда я вижу logcat, я обнаруживаю, что инициализация приложения Firebase завершается неудачно, но при работе в редакторе unity такой ошибки не наблюдается, и приложение отлично работало в редакторе Unity, но не на устройстве Android
03-23 00:45:45.253 9618 9707 I Unity : Company Name: <Striped>
03-23 00:45:45.253 9618 9707 I Unity : Product Name: <Striped>
03-23 00:45:48.719 9618 9707 E Unity : InitializationException: Firebase app creation failed.
03-23 00:45:48.719 9618 9707 E Unity : at Firebase.FirebaseApp.CreateAndTrack (Firebase.FirebaseApp CreateDelegate createDelegate, Firebase.FirebaseApp existingProxy) [0x000e3] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.719 9618 9707 E Unity : at Firebase.FirebaseApp.Create () [0x00027] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.719 9618 9707 E Unity : at Firebase.FirebaseApp.get_DefaultInstance () [0x00017] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.719 9618 9707 E Unity : at Firebase.Database.FirebaseDatabase.get_DefaultInstance () [0x00000] in <265179cd3d324ba1be0c68f88dea310a>:0
03-23 00:45:48.719 9618 9707 E Unity : at firebase_script.Start () [0x00000] in <a8ca21255e29484580e851c97ded26fa>:0
03-23 00:45:48.719 9618 9707 E Unity :
03-23 00:45:48.739 9618 9707 E Unity : InitializationException: Firebase app creation failed.
03-23 00:45:48.739 9618 9707 E Unity : at Firebase.FirebaseApp.CreateAndTrack (Firebase.FirebaseApp CreateDelegate createDelegate, Firebase.FirebaseApp existingProxy) [0x000e3] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.739 9618 9707 E Unity : at Firebase.FirebaseApp.Create () [0x00027] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.739 9618 9707 E Unity : at Firebase.FirebaseApp.get_DefaultInstance () [0x00017] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.739 9618 9707 E Unity : at Firebase.Database.FirebaseDatabase.get_DefaultInstance () [0x00000] in <265179cd3d324ba1be0c68f88dea310a>:0
03-23 00:45:48.739 9618 9707 E Unity : at button_script.Start () [0x00000] in <a8ca21255e29484580e851c97ded26fa>:0
03-23 00:45:48.739 9618 9707 E Unity :
03-23 00:45:48.759 9618 9707 E Unity : InitializationException: Firebase app creation failed.
03-23 00:45:48.759 9618 9707 E Unity : at Firebase.FirebaseApp.CreateAndTrack (Firebase.FirebaseApp CreateDelegate createDelegate, Firebase.FirebaseApp existingProxy) [0x000e3] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.759 9618 9707 E Unity : at Firebase.FirebaseApp.Create () [0x00027] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.759 9618 9707 E Unity : at Firebase.FirebaseApp.get_DefaultInstance () [0x00017] in <efce830506c14731bd3b7a14d631487d>:0
03-23 00:45:48.759 9618 9707 E Unity : at Firebase.Database.FirebaseDatabase.get_DefaultInstance () [0x00000] in <265179cd3d324ba1be0c68f88dea310a>:0
03-23 00:45:48.759 9618 9707 E Unity : at button_script.Start () [0x00000] in <a8ca21255e29484580e851c97ded26fa>:0
03-23 00:45:48.759 9618 9707 E Unity :
03-23 00:45:48.830 9618 9707 E Unity : Failed to read Firebase options from the app's resources. Either make sure google-services.json is included in your build or specify options explicitly.
03-23 00:45:48.830 9618 9707 E Unity :
03-23 00:45:48.830 9618 9707 E Unity : Failed to read Firebase options from the app's resources. Either make sure google-services.json is included in your build or specify options explicitly.
Комментарии:
1. Что не работает, какие-нибудь ошибки?
2. В этом-то и проблема. Внутри редактора Unity при нажатии кнопки он выполняет get_updates() и сохраняет значение в text_place, которое позже обновляется в text.text. Но когда я создаю такую же сборку на мобильном устройстве, она отлично строится, но теперь она не извлекает данные из базы данных в реальном времени
Ответ №1:
У меня была такая же проблема с google-сервисами.json не загружается (Unity 2021.1.4 f) и потратил много времени на поиски ответов, но ни одно из предложенных решений, которые я нашел, не сработало. Наконец я попытался позвонить на Базу огня.Создайте() вручную с помощью вручную созданных приложений со значениями, скопированными из google-services.json.
Firebase.AppOptions options = new Firebase.AppOptions();
options.ApiKey = "XXXXXXXXXXX";
options.AppId = "XXXXXXXXXXXX";
options.MessageSenderId = "XXXXXXXXXXXXX";
options.ProjectId = "my-app";
options.StorageBucket = "my-app.appspot.com";
var app = Firebase.FirebaseApp.Create( options );
Не идеальное решение, но работает до тех пор, пока эта ошибка не будет исправлена.
Ответ №2:
Согласно вашему журналу, у вас отсутствует google-services.json
файл, необходимый для подключения вашей игры к серверной части Firebase. Для этого может быть несколько причин и несколько обходных путей.
Самое простое решение:
Убедитесь, что где-то в вашем Assets/
каталоге есть ваш google-services.json
файл. Вы можете загрузить это с панели управления Firebase, если вы забыли это сделать.
Получите файл конфигурации для вашего приложения для Android
Перейдите в настройки своего проекта в консоли Firebase.
В карточке «Ваши приложения» выберите имя пакета приложения, для которого вам нужен файл конфигурации.
Нажмите google-services.json.
Изменено для Unity: Переместите файл конфигурации в ресурсы/ каталог вашей игры.
Убедитесь, что в вашем приложении есть только этот последний загруженный файл конфигурации.
google-сервисы.json существует, я все еще получаю ошибку
Убедитесь, что вы python
установили и что у вас в пути есть исполняемый файл с именем python
, а не python3
.
Обычно разработчики Android используют плагин play services gradle для преобразования google-services.json
в xml (процесс подробно описан здесь). Плагин Firebase Unity по-прежнему поддерживает Unity вплоть до 2017 года, что предшествовало стабильной поддержке gradle в играх (раньше он поддерживал ветку 5, но он достаточно стар, поэтому трудно найти тестовые машины для запуска редактора). Из-за этого плагин Firebase Unity вместо этого запускает скрипт python с именем generate_xml_from_google_services_json.py
(скомпилированный generate_xml_from_google_services_json.exe
в Windows), который генерирует файл Assets/Plugins/Android/FirebaseApp.androidlib/res/values/google-services.xml
. Обычно этого не хватает, когда вы видите ошибку, в которой говорится, что вам не хватает google-services.json
файла в контексте Unity.
Этот сценарий перекрестно совместим с Python 3 и 2 (2, потому что он все еще поставляется в macOS), но инструмент пытается выполнить его с python
помощью вашего пути. Поскольку вы работаете в Linux, вы можете попробовать устранить эту ошибку: https://github.com/firebase/quickstart-unity/issues/1005 (упомяните @patm1987 в комментариях, если вы считаете, что его следует открыть, и никто не отвечает-напомните мне об этом ответе).
Ни то, ни другое не работает
Я бы рекомендовал открыть ошибку здесь, но есть обходной путь для всех google-service.json
связанных с этим проблем.
Обратите внимание, что я рекомендую не делать этого в качестве первого шага, так как эта конфигурация не ожидается и может привести к тому, что люди будут пытаться помочь вам в будущем. Это также довольно хрупко из-за того, как взаимодействуют Unity и Firebase.
Когда вы вызываете FirebaseApp.DefaultInstance
или любой другой .DefaultInstance
класс Firebase, Firebase.Create()
он неявно лениво вызывается, если нет FirebaseApp
имени приложения по умолчанию. Из-за ошибки вы не можете переопределить приложение по умолчанию после его создания (что я подразумеваю под хрупкостью этого процесса), но если вы сделаете вызов .Create(AppOptions)
до создания приложения по умолчанию (до любого вызова .DefaultInstance
в любом потоке), вы можете предоставить свои собственные параметры приложения.
Затем вы можете поместить свой google-services.json
файл в StreamingAssets/
каталог и загрузить его напрямую или создать AppOptions
его, скопировав/вставив поля из вашего google-services.json
.
Опять же, я рекомендую, чтобы это было ваше последнее средство, а не первое. И я бы попросил вас сообщить об ошибке, если вам придется это сделать.