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
не будет выполняться в режиме кэширования. Если ваше приложение может принять шаблон страницы кэшированного дизайна. Вам не нужно беспокоиться о производительности приложения.