在Windows Phone 8中使用Live Connect並保持登錄狀態

Live Connect可讓各類客戶端訪問Live帳號、獲取好友列表、訪問One Drive的文件等,官方地址在此:http://msdn.microsoft.com/zh-cn/live/ff519582git

貼幾個有用的地址,實在是太難找了:github

Live SDK下載:http://msdn.microsoft.com/zh-CN/live/ff621310windows

應用管理地址:https://account.live.com/developers/applications/indexapi

Github上的代碼:https://github.com/liveservices/,https://github.com/liveservices/LiveSDKsession

MSDN代碼示例:http://code.msdn.microsoft.com/SkyDrive-Photo-API-sample-f06778aeapp

做用域和權限說明,感受這個是比較重要的:http://msdn.microsoft.com/zh-cn/library/live/hh243646.aspxasync

在Windows Phone中使用的代碼示例:http://msdn.microsoft.com/zh-cn/library/live/hh826550.aspxthis

1、使用前的準備

對於Windows Phone應用來講,首先須要在應用管理添加應用。URL貌似不填也不要緊。須要注意的是,在API設置裏必定,「移動或桌面客戶端應用」必定要選擇「是」,才能使用OAuth2.0驗證流程。根域、重定向URL根據須要填寫。我須要的只是獲取用戶身份,訪問One Drive文件,所以沒填。spa

2、使用方式

基本上使用有兩種方式,SDK裏提供了現成的登錄控件,能夠直接用,若是不用這個控件的話也能夠本身寫登錄過程。rest

使用控件的方式可參考http://msdn.microsoft.com/zh-cn/library/live/hh826550.aspx的代碼示例,拖一個SignInButton進來,設置好SessionChanged事件就能夠了,不須要管Click事件,點擊的時候控件本身會調用相應的處理程序。

若是本身寫的話,能夠採用這裏的方式:http://lancelarsen.com/persisting-skydrive-login-on-windows-phone-8-via-livesdk/ 主要代碼以下:

private static readonly string[] _scopes =
          new[] { 
          "wl.signin", 
         "wl.basic" };
   
      private LiveConnectClient _connection;
      private LiveLoginResult _login;
   
      public LiveLogin()
      {
          this.Loaded += this.OnLoaded;
      }
   
      private async void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
      {
          //----------------------------------------------------------------------
          // Login to skydrive
          //----------------------------------------------------------------------
          await SkydriveLogin();
      }
   
      private async Task SkydriveLogin()
      {
          try
          {
              //----------------------------------------------------------------------
              // Initialize our auth client with the client Id for our specific application
              //----------------------------------------------------------------------
              LiveAuthClient authClient = new LiveAuthClient("**your client id here**");
   
              //----------------------------------------------------------------------
              // Using InitializeAsync we can check to see if we already have an connected session
              //----------------------------------------------------------------------
              _login = await authClient.InitializeAsync(_scopes);
   
              //----------------------------------------------------------------------
              // If not connected, bring up the login screen on the device
              //----------------------------------------------------------------------
              if (_login.Status != LiveConnectSessionStatus.Connected)
              {
                  _login = await authClient.LoginAsync(_scopes);
              }
   
              //----------------------------------------------------------------------
              // Initialize our connection client with our login result
              //----------------------------------------------------------------------
              _connection = new LiveConnectClient(_login.Session);
          }
          catch (Exception ex)
          {
              //TODO: Add connection specific exception handling
          }
      }

注意一下做用域與權限,通常來講wl.signin wl.basic這兩個是必須的,我在第一次用的時候發現即便用戶登陸了,下次打開應用還須要再次點擊受權一次,很麻煩,後來發現必需要加上wl.offline_access這個做用域,下次登錄就默認是登錄狀態了。

3、參考文章

http://social.msdn.microsoft.com/Forums/live/en-US/6df1f31d-a22c-469c-b9f4-5c79e0882701/persisting-session-on-windows-phone?forum=messengerconnect

http://igrali.com/2012/12/11/live-connect-sdk-for-windows-phone-8authenticating-and-basic-info/

http://stackoverflow.com/questions/10946629/wp7-how-to-store-liveconnectsession-during-tombstoning

http://stackoverflow.com/questions/13212120/windows-phone-live-sdk-api-get-new-session-object-after-restarting-the-app

4、實踐

個人目的是,用戶能夠沒必要登錄便可瀏覽,但若是要發佈評論的話必須登錄Live帳號,用戶登陸一次後,下次打開應用應該就能夠直接獲取用戶信息而沒必要再次登錄了。

首先在App.xaml.cs裏添加一個靜態變量,用來保存當前Live鏈接,也能夠直接保存獲取到的用戶信息

/// <summary>
        /// live client
        /// </summary>
        public static LiveConnectClient CurrentLiveConnectClient { get; set; }

在程序運行時先看看當前的鏈接狀態,若是已經登錄過了,則設置當前的Live鏈接,不然就什麼也不用作了,等須要用戶登陸操做的時候再提示:

try
                {
                    string[] _scopes = new string[] { "wl.signin", "wl.basic", "wl.offline_access", "wl.skydrive", "wl.skydrive_update" };
                    LiveAuthClient authClient = new LiveAuthClient("your client id");
                    LiveLoginResult _login = await authClient.InitializeAsync(_scopes);
                    #region 若是要強制用戶爲登錄狀態則使用如下代碼
                    //if (_login.Status != LiveConnectSessionStatus.Connected)
                    //{
                    //    _login = await authClient.LoginAsync(_scopes);
                    //}
                    //App.CurrentLiveConnectClient = new LiveConnectClient(_login.Session);
                    #endregion
                    if(_login.Status == LiveConnectSessionStatus.Connected)
                    {
                        //若是爲登錄狀態 則設置LiveConnectClient供之後調用 不然就等到須要用戶登陸的時候再提示登錄
                        App.CurrentLiveConnectClient = new LiveConnectClient(_login.Session);
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }

而後在須要用戶登陸操做的地方,放上一個登錄按鈕,設置SessionChanged事件

        private async void btnSignin_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e)
        {
            if (e.Status == LiveConnectSessionStatus.Connected)
            {
                if (App.CurrentLiveConnectClient == null)
                {
                    App.CurrentLiveConnectClient = new LiveConnectClient(e.Session);
                }
                LiveOperationResult operationResult = await App.CurrentLiveConnectClient.GetAsync("me");
                try
                {
                    dynamic meResult = operationResult.Result;
                    if (meResult.first_name != null &&
                        meResult.last_name != null)
                    {
                        infoTextBlock.Text = "Hello " +
                            meResult.first_name + " " +
                            meResult.last_name + "!";
                    }
                    else
                    {
                        infoTextBlock.Text = "Hello, signed-in user!";
                    }
                }
                catch (LiveConnectException exception)
                {
                    this.infoTextBlock.Text = "Error calling API: " +
                        exception.Message;
                }
            }
            else
            {
                infoTextBlock.Text = "Not signed in.";
            }
        }

我這裏保存的是LiveConnectClient,貌似直接保存用戶信息更方便一些,隨便了。等寫完這個文章再改。

還能夠在VM裏設置評論框和登錄區域的顯示方式,好比綁定到某個屬性上,若是登錄了則顯示評論框,沒登錄顯示登錄按鈕。

相關文章
相關標籤/搜索