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
對於Windows Phone應用來講,首先須要在應用管理添加應用。URL貌似不填也不要緊。須要注意的是,在API設置裏必定,「移動或桌面客戶端應用」必定要選擇「是」,才能使用OAuth2.0驗證流程。根域、重定向URL根據須要填寫。我須要的只是獲取用戶身份,訪問One Drive文件,所以沒填。spa
基本上使用有兩種方式,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這個做用域,下次登錄就默認是登錄狀態了。
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
個人目的是,用戶能夠沒必要登錄便可瀏覽,但若是要發佈評論的話必須登錄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裏設置評論框和登錄區域的顯示方式,好比綁定到某個屬性上,若是登錄了則顯示評論框,沒登錄顯示登錄按鈕。