我正在构建Windows 8应用程序,并且我正在尝试在应用程序启动时从Google数据API获取令牌。我构建了一个函数来执行此操作,它具有以下代码:
string authCodeUrl = UrlHelpers.BaseUrlFactory(UrlType.OAuth) +
"?client_id=" + _clientId +
"&redirect_uri=" + _redirectUri +
"&response_type=code" +
"&scope=" + _scope;
Uri startUri = new Uri(authCodeUrl);
Uri endUri = new Uri("https://accounts.google.com/o/oauth2/approval?");
WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.UseTitle, startUri, endUri);
我在调用OnLaunched()
之前调用App.xaml.cs Window.Current.Activate()
中的函数。我这样做的原因是因为我已经需要MainViewModel
中的令牌。
奇怪的是:当我以正常方式(通过Visual Studio)启动我的应用程序时,它会停留在启动画面上(启动画面会持续很长时间),但是当我在此行上放置一个断点时:
WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.UseTitle, startUri, endUri);
并逐步完成它,我突然得到一个登录窗口,允许我登录并获取令牌,这意味着启动画面消失了,我可以使用我的应用程序。
当我从App.xaml.cs中删除调用并且只是从我的ViewModel请求令牌时,我遇到了同样的问题:它仍然停留在SplashScreen上。当我从App.xaml.cs请求令牌但在Window.Current.Activate()
调用后移动请求时,我也遇到此问题。但在这些情况下,登录后闪屏会消失,但屏幕会保持黑屏。我没看到我的应用程序。
P.s。,这就是我从App.xaml.cs请求令牌的方式(OnLaunched
被标记为async
):
IOAuth2Service oAuth2Service = new OAuth2Service();
await oAuth2Service.GetToken();
OAuth2Service只是一个方法GetToken()
的对象。这种方法正如我上面所描述的那样。
当我使用断点逐步浏览应用程序时,有没有人知道它为什么会起作用,但是当我在没有单步执行它的情况下启动它时却没有?
我已经解决了这个问题,并创建了一个仅包含此代码的Github项目。你可以在这里找到它:https://github.com/Avalaxy/OAuth2WinRT/tree/master/App1。有一个app.xaml.cs调用OAuth2.GetToken()。
答案 0 :(得分:3)
根据documentation -
如果应用程序或其启动画面保留在屏幕上,则没有时间限制,但最终应用程序需要调用“激活”才能继续。
不可否认,有点模糊且需要解释,但在GetToken
请求之前将呼叫移至激活状态会使您超越看似潜在的竞争条件。