5

そのため、Windows Phone8アプリケーションをLiveAPIに接続することに成功しました。また、hotmailアカウントからデータを読み取ることにも成功しました。

必要なクライアントIDとライブアクセストークンにアクセスできます。

しかし、アプリケーションを終了して再起動すると、セッションとクライアントオブジェクトへのすべての参照が失われ、プロセスを新たに開始する必要があります。

ユーザーがアプリケーションを起動するたびに必要なアクセス許可を提供することに再度同意する必要があるWebマスクでユーザーを困らせたくありません。しかし、この手順なしでセッションオブジェクトへの参照を取得する方法も見つかりませんでした。

ログインマスクは、アプリケーションのインストール後に初めて表示され、その後は上記の画面のみが表示されます。しかし、それでもユーザーが毎回これを受け入れるのは非常に面倒です。

クラスに標準のコンストラクターがないため、セッションオブジェクトをシリアル化しようとしましたが、これは不可能です。

ライブアクセストークンを使用して新しいセッションを作成することは可能かもしれませんが、その方法が見つかりませんでした。

何か案は?私が間違っているのは、ユーザーにプロンプ​​トを表示せずに再度ログインする方法があることを知っています。私はすべてのアイデアに感謝しています。

私が使用するいくつかのコード:

    /// <summary>
    /// This method is responsible for authenticating an user asyncronesly to Windows Live.
    /// </summary>
    public void InitAuth()
    {
        this.authClient.LoginCompleted +=
            new EventHandler<LoginCompletedEventArgs>(this.AuthClientLoginCompleted);

        this.authClient.LoginAsync(someScopes);
    }

    /// <summary>
    /// This method is called when the Login process has been completed (successfully or with error).
    /// </summary>
    private void AuthClientLoginCompleted(object sender, LoginCompletedEventArgs e)
    {
        if (e.Status == LiveConnectSessionStatus.Connected)
        {
            LiveConnector.ConnectSession = e.Session; // where do I save this session for reuse?
            this.connectClient = new LiveConnectClient(LiveConnector.ConnectSession);

            // can I use this access token to create a new session later?
            LiveConnector.LiveAccessToken = LiveConnector.ConnectSession.AccessToken;

            Debug.WriteLine("Logged in.");
        }
        else if (e.Error != null)
        {
            Debug.WriteLine("Error signing in: " + e.Error.ToString());
        }
    }

LiveAuthClient.InitializeAsync-メソッドを使用して、アプリケーションの再起動後にバックグラウンドでログインしようとしましたが、セッションオブジェクトが空のままになります。

// this is called after application is restarted
private void ReLogin()
{
    LiveAuthClient client = new LiveAuthClient(LiveConnector.ClientID);
            client.InitializeCompleted += OnInitializeCompleted;
            client.InitializeAsync(someScopes);
}


private void OnInitializeCompleted(object sender, LoginCompletedEventArgs e)
    {
        Debug.WriteLine("***************** Inititalisation completed **********");
        Debug.WriteLine(e.Status); // is undefined
        Debug.WriteLine(e.Session); // is empty
    }

アプリケーションを再起動した後、新しいセッションにアクセスする方法を誰かが知っていますか?

4

2 に答える 2

9

私が犯した間違いを丸2日探した後、私はついに自分が間違っていることを発見しました。これを機能させるには、wl.offline_accessスコープを使用する必要があります。

ここで別のユーザーを引用しましょう:

「アプリがlive:SignInButtonコントロールよりもwl.offline_accessスコープを使用している場合は、それを保存して自動的にロードします。SessionChangedイベントを使用してセッションオブジェクトをキャプチャするだけです。これにより、ユーザーは1回だけサインインする必要があります。」(TombStoning中にLiveConnectSessionを保存する方法をWP7で参照してください?

今、すべてが再び楽しいです。これが問題だったなんて信じられない。テスト済みで動作しています。良い!

于 2012-11-04T17:39:21.460 に答える
2

これをWindowsLive+ Azureモバイルサービスアプリで機能させるのに苦労していたので、機能するようになったので、完全に機能するコードサンプルをここに投稿すると思いました。

重要な部分は、wl.offline_accessスコープとInitializeAsyncの呼び出しです。

注:このサンプルは、WindowsAzureモバイルサービスにも接続します。MobileServiceを使用していない場合は、MobileServiceに関連するものを削除してください。

    private static LiveConnectSession _session;
    private static readonly string[] scopes = new[] {"wl.signin", "wl.offline_access", "wl.basic"};

    private async System.Threading.Tasks.Task Authenticate()
    {
        try
        {
            var liveIdClient = new LiveAuthClient("YOUR_CLIENT_ID");
            var initResult = await liveIdClient.InitializeAsync(scopes);

            _session = initResult.Session;


            if (null != _session)
            {
                await MobileService.LoginWithMicrosoftAccountAsync(_session.AuthenticationToken);
            }

            if (null == _session)
            {
                LiveLoginResult result = await liveIdClient.LoginAsync(scopes);

                if (result.Status == LiveConnectSessionStatus.Connected)
                {
                    _session = result.Session;
                    await MobileService.LoginWithMicrosoftAccountAsync(result.Session.AuthenticationToken);

                }
                else
                {
                    _session = null;
                    MessageBox.Show("Unable to authenticate with Windows Live.", "Login failed :(", MessageBoxButton.OK);
                }
            }
        }
        finally
        {
        }
    }
于 2013-07-11T19:21:03.867 に答える