Xamarin.Auth реинициализирует приложение

Я только сталкиваюсь с этой проблемой на UWP

 private void Button_OnClicked(object sender, EventArgs e)
        {
            var clientId = Constants.GoogleUWPClientID;
            var clientSecret = Constants.GoogleUWPClientSecret;
            var redirectUrl = Constants.GoogleUWPRedirectUrl;

            var auth =  new OAuth2Authenticator(
                clientId: clientId,
                clientSecret: clientSecret,
                scope: Constants.GoogleScope,
                authorizeUrl: new Uri(Constants.GoogleAuthorizeUrl),
                accessTokenUrl: new Uri(Constants.GoogleAccessTokenUrl),
                redirectUrl: new Uri(redirectUrl),
                getUsernameAsync: null,
                isUsingNativeUI: true
            );

            // Login Events
            auth.Completed += AuthOnCompleted;
            auth.Error += AuthOnError;
            auth.IsLoadableRedirectUri = true;


            AuthenticationState.Authenticator = auth;

            var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
            presenter.Login(auth);
        }

Я сделал инициализацию Xamarin.Auth на UWP

Xamarin.Forms.Forms.Init(e);
global::Xamarin.Auth.Presenters.UWP.AuthenticationConfiguration.Init();

Это обработчик CompletedEvent

private async void AuthOnCompleted(object sender, AuthenticatorCompletedEventArgs authenticatorCompletedEventArgs)
        {
            //var auth = sender as Xamarin.Auth.OAuth2Authenticator;
            //auth.DoNotEscapeScope = true;

            // We presented the UI, so it's up to us to dimiss it on iOS.
            //DismissViewController(true, null);

            if (authenticatorCompletedEventArgs.IsAuthenticated)
            {
                var request = new OAuth2Request("GET", new Uri(Constants.GoogleUserInfoUrl), null, authenticatorCompletedEventArgs.Account);
                var response = await request.GetResponseAsync();

                if (response != null)
                {
                    var userJson = response.GetResponseText();
                    var user = JsonConvert.DeserializeObject<GoogleUser>(userJson);

                    //UserPicture = user.Picture;
                    //GivenName = user.GivenName;
                    //Email = user.Email;
                }
            }
            else
            {
                // The user cancelled
                //ErrorMessage = "Cancelled authentication !";
            }

        }

После успешного входа в систему AuthOnCompleted запускается с успехом, но как только он заканчивается (или сталкивается с ожидающим GetResponseAsync из одного из моих запросов к API Google), он полностью обновляет приложение.

Я предполагаю, что это происходит из-за того, что я не обработал URL-адрес перенаправления, как в Android и iOS?

В официальной документации ничего не говорится о UWP, поэтому я не уверен, что что-то пропустил

Как только я попал в ожидание

Статус приложения "перезапущен / обновлен"!

Я действительно невежественен, я что-то упустил?

РЕДАКТИРОВАТЬ 01 Я нашел исправление, но я боюсь, что это может иметь последствия. Я использовал NavigationCacheMode="Enabled" вместо значения по умолчанию "Отмена".

Это в основном сохранит кэшированную версию экземпляра, как только я покину его контекст и перейду к другому ContentPage/Page/Frame. Поскольку навигация в UWP происходит не так, как в Xamarin, вы должны указать frame.Navigate(typeof(targetPage),args) так что вам придется обрабатывать кеш для каждой страницы (наверное)

Что меня беспокоит, так это то, что MainPage и используя этот параметр из UWP и когда LoadApplication(new SharedProj.App()) этот параметр будет в некоторой степени наследоваться любым последующим ContentPages что может вызвать проблемы с производительностью приложения?

Собираюсь сделать несколько тестов, чтобы проверить мое предположение

<forms:WindowsPage
    x:Class="AnonymousCheckerApp.UWP.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:forms="using:Xamarin.Forms.Platform.UWP"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:AnonymousCheckerApp.UWP"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    NavigationCacheMode="Enabled"
    >

1 ответ

Решение

Я проверил ваш код и воспроизвел "проблему". Это нормальное поведение, что приложение будет обновляться после завершения аутентификации. Поскольку страница входа в систему заменяет текущую страницу содержимого, когда отображается страница входа.

public void Login(Authenticator authenticator)
{
    authenticator.Completed += AuthenticatorCompleted;

    System.Type page_type = authenticator.GetUI();

    Windows.UI.Xaml.Controls.Frame root_frame = null;
    root_frame = Windows.UI.Xaml.Window.Current.Content as Windows.UI.Xaml.Controls.Frame;
    root_frame.Navigate(page_type, authenticator);

    return;
}

И когда AuthOnCompleted портативная библиотека будет перезагружена.

public MainPage()
{
    this.InitializeComponent();

    LoadApplication(new XamarinAuthTest.App());
}

Таким образом, приложение будет "перезапущено / обновлено".

РЕДАКТИРОВАТЬ 01

Приложение не будет перезапущено после завершения аутентификации, если NavigationCacheMode="Enabled", Потому что метод конструктора MainPage не будет выполняться в режиме кэширования. Если ваше приложение может принять шаблон страницы кэшированного дизайна. Вам не нужно беспокоиться о производительности приложения.

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