Не удается установить Xamarin.Firebase.Common в общем проекте Xamarin

Должен ли пакет Xamarin.Firebase.Common быть установлен в общем проекте Xamarin?

Пытаюсь установить, но получаю ошибку:

Ошибка NU1202 Пакет Xamarin.Firebase.Common 120.1.0.1 не является совместим с netstandard2.0 (.NETStandard, Version=v2.0). Упаковка Xamarin.Firebase.Common 120.1.0.1 поддерживает:

  • monoandroid12.0 (MonoAndroid, версия = v12.0)
  • net6.0-android31.0 (.NETCoreApp, версия = v6.0)

И Target Framework, и Target Android Version установлены на Android 13 для проекта Android.

Нет, это не так. «Общий» — это не описание общей кроссплатформенной библиотеки, а означает, что она содержит общие классы, совместно используемые несколькими другими nugets для Firebase. Вам нужно установить это в свой проект Android.

ewerspej 08.02.2023 11:00

Что я должен установить в общий проект? Я пытаюсь использовать FirebaseNetworkException в своем коде, но он не распознается. Visual Studio предлагает установить Xamarin.Firebase.Common, чтобы исправить ошибку. Я уже сделал это для проекта Android. Это невозможно для общего проекта.

Costas 08.02.2023 11:10

Вам не нужно иметь дело с этим в вашем общем проекте, потому что сетевые исключения зависят от платформы. Ваше приложение Xamarin размещается внутри собственного приложения и поэтому не знает особенностей платформы, на которой оно работает. Чего именно вы пытаетесь достичь? Как вы думаете, для чего вам нужен FirebaseNetworkException?

ewerspej 08.02.2023 13:04

Просто чтобы доставить соответствующее сообщение пользователю.

Costas 08.02.2023 13:40

Больше контекста, пожалуйста. Для чего вы используете Firebase в своем приложении?

ewerspej 08.02.2023 13:58

Это аутентификация Firebase. Есть и другие исключения, которые также полезно поймать, например, WeakPassword. Я тоже использую Plugin.FirebaseAuth.

Costas 08.02.2023 14:09

Аутентификация Firebase реализована по-разному на Android и iOS, для каждой есть отдельные библиотеки, но есть и кроссплатформенные библиотеки, такие как Plugin.FirebaseAuth, которые под капотом обрабатывают специфику платформы, но по сути работают одинаково. В любом случае вы не можете перехватывать исключения из кода, специфичного для платформы, из общего контекста. Причина в направлении зависимостей. Код конкретной платформы зависит от общего кода, а не наоборот. Plugin.FirebaseAuth определяет FirebaseAuthException с полем ErrorType, которое вы можете использовать.

ewerspej 08.02.2023 14:44

Вы должны обновить свой вопрос и объяснить, что вы на самом деле пытаетесь выполнить в вопросе, потому что в настоящее время ответ на ваш текущий вопрос просто: нет, вы не можете установить Xamarin.Firebase.Common в общий проект. Не забудьте включить код, в котором вы пытаетесь перехватить исключение.

ewerspej 08.02.2023 14:50
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
8
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как сказал ewerspej, вам необходимо установить пакет Xamarin.Firebase.Common в Android-части проекта xamarin.forms.

Затем вы можете создать класс в части Android и использовать FirebaseNetworkException в методе класса. После этого вы можете использовать службу зависимостей для вызова метода в общем проекте Xamarin.

Для получения дополнительной информации вы можете обратиться к официальному документу о Xamarin.Forms DependencyService Introduction .

Я вижу, что у Plugin.FirebaseAuth есть Error Types: github.com/f-miyu/… Это не исключения, поэтому их нельзя использовать в блоке try-catch, верно? Хотя как их можно использовать? Вероятно, их можно использовать в общем проекте, поэтому нет необходимости использовать Dependency Service.

Costas 09.02.2023 11:08
Ответ принят как подходящий

Прежде всего, вы не можете использовать пакет Xamarin.Firebase.Common, который зависит от Android, в общем проекте вашего приложения Xamarin.Forms.

Во-вторых, вы не можете использовать собственные исключения в общем кроссплатформенном контексте. Поэтому у вас не будет доступа к FirebaseNetworkException и т. д. в общем проекте.

Вместо этого, поскольку вы уже используете Plugin.FirebaseAuth, вам нужно вместо этого перехватывать FirebaseAuthException, который упаковывает различные исключения для конкретной платформы и скрывает их за кодами ошибок.

Ваш код должен выглядеть примерно так:

try
{
    var provider = new OAuthProvider("google.com");
    var result = await CrossFirebaseAuth.Current.Instance.SignInWithProviderAsync(provider);
}
catch (FirebaseAuthException e)
{
    switch(e.ErrorType)
    {
        case ErrorType.NetWork:
            //handle network error 
            break;
        case InvalidCredentials:
            //handle invalid credentials
            break;
        //...
        default: break;
    }
}

Полный список сопоставления перечисления ErrorTypeс исключениями Firebase есть в документации.

Поэтому везде, где вам нужно поймать исключение, вы можете проверить ErrorType и выполнить соответствующую операцию или показать пользователю сообщение об ошибке.

ХОРОШО. Вот как ErrorType можно использовать в коде. Спасибо, что разъяснили!

Costas 09.02.2023 11:26

Другие вопросы по теме