3

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()ます。ただし、これらの場合、ログイン後にスプラッシュスクリーンは消えますが、画面は黒いままです。アプリが表示されません。

Ps、これは App.xaml.cs からトークンを要求する方法です (OnLaunchedは としてマークされていますasync):

IOAuth2Service oAuth2Service = new OAuth2Service();
await oAuth2Service.GetToken();

OAuth2Service は、メソッドを持つ単なるオブジェクトですGetToken()。このメソッドは、上で説明したことを行うだけです。

ブレークポイントを使用してアプリをステップ実行すると機能するのに、ステップ実行せずに起動しただけでは機能しない理由を誰かが知っていますか?

問題を切り分けて、このコードだけを含む Github プロジェクトを作成しました。ここで見つけることができます: https://github.com/Avalaxy/OAuth2WinRT/tree/master/App1。OAuth2.GetToken() を呼び出す app.xaml.cs があります。

4

1 に答える 1

3

ドキュメントごとに-

アプリまたはそのスプラッシュ スクリーンが画面に表示されたままになっている場合、時間制限はありませんが、最終的にアプリは Activate を呼び出して進行する必要があります。

確かに少しあいまいで解釈の対象となりますが、GetTokenリクエストの前に呼び出しをアクティブ化するように移動すると、潜在的な競合状態のように見えるものを乗り越えることができます.

于 2013-03-30T06:54:48.843 に答える