Xamarin.Auth 正在重新初始化应用程序
Xamarin.Auth is re-initializing the app
我只在 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);
}
我确实在 UWP
上初始化了 Xamarin.Auth
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 便会成功开始,但一旦它结束(或遇到来自我对 Google 的 API 的请求之一的 await GetResponseAsync),它就会完全刷新应用程序。
我猜这是因为我没有像在 Android 和 iOS 中那样处理重定向-url?
在官方文档中没有提到 UWP 所以我不确定我是否遗漏了什么
我一点击等待
应用程序的状态变为 "restarted/refreshed"!?
我真是一头雾水,是不是漏了什么?
编辑 01
我已经找到了解决方法,但我担心它可能会产生后果。
我确实使用 NavigationCacheMode="Enabled"
而不是默认值 'Cancel'.
一旦我离开它的上下文并转到另一个 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"
>
我已经测试了您的代码并重现了 "issue"。应用程序将在身份验证完成后刷新是正常行为。因为 login page 在显示登录页面时取代了当前内容页面。
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());
}
所以应用程序将是 "restarted/refreshed"。
编辑 01
如果NavigationCacheMode="Enabled"
,应用程序将不会在授权完成后重新启动。因为MainPage
的构造方法不会以缓存方式执行。如果您的应用程序可以接受页面缓存设计模式。您无需担心应用性能。
我只在 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);
}
我确实在 UWP
上初始化了 Xamarin.AuthXamarin.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 便会成功开始,但一旦它结束(或遇到来自我对 Google 的 API 的请求之一的 await GetResponseAsync),它就会完全刷新应用程序。
我猜这是因为我没有像在 Android 和 iOS 中那样处理重定向-url?
在官方文档中没有提到 UWP 所以我不确定我是否遗漏了什么
我一点击等待
应用程序的状态变为 "restarted/refreshed"!?
我真是一头雾水,是不是漏了什么?
编辑 01
我已经找到了解决方法,但我担心它可能会产生后果。
我确实使用 NavigationCacheMode="Enabled"
而不是默认值 'Cancel'.
一旦我离开它的上下文并转到另一个 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"
>
我已经测试了您的代码并重现了 "issue"。应用程序将在身份验证完成后刷新是正常行为。因为 login page 在显示登录页面时取代了当前内容页面。
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());
}
所以应用程序将是 "restarted/refreshed"。
编辑 01
如果NavigationCacheMode="Enabled"
,应用程序将不会在授权完成后重新启动。因为MainPage
的构造方法不会以缓存方式执行。如果您的应用程序可以接受页面缓存设计模式。您无需担心应用性能。