Unity, интегрированный с firebase, работает в редакторе Unity, но не на мобильном устройстве

# #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 .

Опять же, я рекомендую, чтобы это было ваше последнее средство, а не первое. И я бы попросил вас сообщить об ошибке, если вам придется это сделать.