Из проекта Xamarin. iOS: [Firebase / Firestore] [I-FST000001] Не удалось связаться с бэкэндом Cloud Firestore - PullRequest
0 голосов
/ 19 января 2020

Здравствуйте, сообщество Xamarin,

Это был полный день, когда я столкнулся с очень распространенной проблемой:

6.5.0 - [Firebase / Firestore] [I-FST000001] Не удалось связаться с бэкэндом Cloud Firestore. Сервер не ответил в течение 10 секунд.

Эта ошибка возникает в моем проекте Xamarin. iOS, где я добавил пакет NuGet Xamarin.Firebase. iOS .CloudFirestore (v1.4.2.1).


Вот мой код:

AppDelegate.cs

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();
    LoadApplication(new App());

    Firebase.Core.App.Configure();
    Database = Firestore.SharedInstance;

    return base.FinishedLaunching(app, options);
}

CloudFirestore iOS .cs

public async Task < T > GetRandomItemAsync() {
    if (IsConnected) {
        try {
            var db = AppDelegate.Database;
            var myCollection = db.GetCollection("[COLLECTION_NAME]");

            var snapshots = await myCollection.GetDocumentsAsync();
            foreach(var snapshot in snapshots.Documents) {
                var documentContent = snapshot.Data;
                var fieldValue = documentContent["DOCUMENT_FIELD_NAME"] ? .ToString();
        }
        } catch (Exception ex) {

        }
    }

    return null
}

" Не удалось связаться с бэкэндом Cloud Firestore " при GetDocumentsAsyn c () при вызове метода.

Эта ошибка говорит о том, что:

Обычно это указывает на то, что ваше устройство в настоящее время не имеет исправного соединения Inte rnet.

Но я сделал HTTP-запрос вместо использования iOS CloudFirestore NuGet, и он отлично работает:

try {
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));
    var response = client.GetAsync("https://firestore.googleapis.com/v1/projects/[MY_PROJECT_ID]/databases/(default)/documents/[COLLECTION_NAME]/[DOCUMENT_ID]").Result;
    string content = await response.Content.ReadAsStringAsync();
    var z = response.StatusCode;

} catch (Exception ex) {

}

Следовательно, это может быть проблема конфигурации CloudFirestore , и я не знаю, как чтобы проверить, правильно ли инициализирован объект Firestore.ShareInstance.

Не могли бы вы сначала сказать мне, как это сделать? * 10 46 *


Вещи, которые я уже пробовал

  • Проверьте файл GoogleService-Info.plist (например, API_KEY, DATABASE_URL, PROJECT_ID)
  • Развернуть решение на физическое устройство
  • Стереть все содержимое и настройки симулятора
  • Сделать HTTP-запрос вместо использования iOS CloudFirestore NuGet
  • Понизить iOS CloudFirestore NuGet, но решение не было более готовым
  • Посмотрите этот очень хороший пример из Github , но решение не удалось собрать даже после восстановления пакетов

Вещи, которые я должен попробовать

  • Я должен повторить этот очень хороший пример от Github , чтобы лучше понять, где я не прав
  • Я должен попытаться воспроизвести запрос Cloud Firestore из Xamarin. Android проект

Спасибо за помощь!

1 Ответ

0 голосов
/ 25 января 2020

Мне действительно было тяжело с этим делом, но я наконец нашел способ заставить его работать!

Две вещи, которые могли бы, наконец, помочь:

  • Вызов Задачи CloudFirestore из ViewModel не удавался каждый раз, пока я не реализовал выполнение Команды
  • Я принудительно выполняю свою Задачу при загрузке моего Представления (я до сих пор не понимаю, почему, но при запуске моего приложения: в первый раз Моя задача была вызвана, я всегда получаю сообщение об ошибке)
  • Я больше не использую Firebase.SharedInstance в проекте Xamarin. iOS (это может объяснять пункт выше)

В проекте Xamarin.Forms

public SandboxViewModel()
{
Product = new Product { ProductTitle = "THIS IS A NICE TITLE" };

GetOneProductCommand = new Command(async () => await GetOneProductAsync());

GetOneProductCommand.Execute(null);
}

private async Task GetOneProductAsync()
{
try
{
Product product = await DataStore.GetOneItem();

if (product != null && !String.IsNullOrEmpty(product.ProductTitle))
Product = new Product { ProductTitle = product.ProductTitle };
else
Product = new Product { ProductTitle = "THIS IS A NICE ERROR..." };
}
catch (Exception ex)
{
Debug.WriteLine($"Unable to get products : {ex.Message}");
await Application.Current.MainPage.DisplayAlert("Error!", ex.Message, "OK");
}
}

В проекте Xamarin. iOS Проект

public async Task<Product> GetOneItem()
{
Product product = new Product();
Firestore dbRef = Firestore.Create(Firebase.Core.App.DefaultInstance);

CollectionReference Products = dbRef.GetCollection("Products");

var snapshot = await Products.GetDocumentsAsync();

foreach (var doc in snapshot.Documents)
{
if (doc.Exists)
{
var documentContent = doc.Data;

if (documentContent != null)
product = new ShortUserProduct { ProductTitle = documentContent["ProductTitle"]?.ToString() };
else
product = null;
}
}

return product;
}
...