Подтвердить что ты не робот

Почему Navigation.PushAsync падает после Azure MobileServiceClient LoginAsync()?

Изменить: Пример проекта, который демонстрирует крах, можно найти здесь: https://github.com/rringham/brokenazurexamforms - вам нужно установить собственный URL-адрес службы поиска Azure в:

  • SRC/BrokenAzureForms/Droid/Услуги/Пользователь/DroidUserService.cs
  • SRC/BrokenAzureForms/IOS/Услуги/Пользователь/IosUserService.cs

Я вижу Xamarin Forms Navigation.PushAsync() сбой на Android, когда я пытаюсь использовать его после аутентификации с помощью Azure MobileServiceClient. Эта авария изолирована от Android - это не происходит на iOS.

Здесь настройка - у меня есть базовая NavigationPage в качестве моей главной страницы приложения:

MainPage = new NavigationPage(new LoginPage());

В моем LoginPage я аутентифицируюсь с использованием класса DependencyService -injected, который выполняет аутентификацию в моем проекте Android:

private async void OnMicrosoftAccountTapped(object sender, EventArgs args)
{
    IUserService userService = DependencyService.Get<IUserService>();
    bool authenticated = await userService.LoginWithAzureAD();
    if (authenticated)
    {
        await Navigation.PushAsync(new HomePage(), false);
    }
 }

В моей реализации Android IUserService я делаю это (в точности, что показывают обучающие программы Azure/Xamarin Forms):

public async Task<bool> LoginWithAzureAD()
{
    try
    {
        _user = await _client.LoginAsync(Xamarin.Forms.Forms.Context, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory);
    }
    catch (Exception)
    {
        return false;
    }

    return true;
}

Здесь, где вещи разваливаются. Когда LoginWithAzureAD() выполняется, управление возобновляется в OnMicrosoftAccountTapped(); мы переходим к вызову Navigation.PushAsync(), и бум - приложение вылетает с очень небольшим количеством подробностей:

MobileServiceClient/Navigation crash

Все, что я могу думать, это то, что Azure MobileServiceClient делает что-то очень забавное с Xamarin.Forms.Forms.Context внутренне, потому что, если я удалю вызов await userService.LoginWithAzureAD(), вызов Navigation.PushAsync() будет работать без проблем. Что-то в MobileServiceClient либо сломано, либо что-то ломает в Xamarin Forms.

Кто-нибудь видит что-нибудь подобное?

4b9b3361

Ответ 1

Когда я это делаю, я использую следующее:

В MainActivity.cs:

// Initialize for Azure Mobile Apps
Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init();

// Initialize for Xamarin Forms
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

// Initialize for Login Provider
var lp = (DroidLoginProvider)DependencyService.Get<ILoginProvider>();
lp.Initialize(this);

Затем, в моем классе DroidLoginProvider, я делаю следующее:

Context _context;

public void Initialize(Context context)
{
    this._context = context;
}

public async Task LoginAsync(MobileServiceClient client)
{
    await client.LoginAsync(this._context, MobileServiceAuthenticationProvider.whatever);
}

Я вызываю LoginAsync из обертки Singleton в своем общем проекте. Важно, что это Singleton, потому что в проекте должен быть только один MobileServiceClient - аутентификация хранится в свойстве MobileServiceClient.CurrentUser и устанавливается только для текущего клиента.

Здесь вы можете увидеть рабочий проект с этой логикой: https://github.com/adrianhall/30-days-of-zumo-v2/tree/master/file-upload

Ответ 2

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

Здесь пример: