在Windows Phone 8中使用Live Connect并保持登陆状态

原文:在Windows Phone 8中使用Live Connect并保持登陆状态

Live Connect可以让各种客户端访问Live账号、获取好友列表、访问One Drive的文件等,官方地址在此:http://msdn.microsoft.com/zh-cn/live/ff519582

贴几个有用的地址,实在是太难找了:

Live SDK下载:http://msdn.microsoft.com/zh-CN/live/ff621310

应用管理地址:https://account.live.com/developers/applications/index

Github上的代码:https://github.com/liveservices/,https://github.com/liveservices/LiveSDK

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

作用域和权限说明,感觉这个是比较重要的:http://msdn.microsoft.com/zh-cn/library/live/hh243646.aspx

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

一、使用前的准备

对于Windows Phone应用来说,首先需要在应用管理添加应用。URL貌似不填也没关系。需要注意的是,在API设置里一定,“移动或桌面客户端应用”一定要选择“是”,才能使用OAuth2.0验证流程。根域、重定向URL根据需要填写。我需要的只是获取用户身份,访问One Drive文件,因此没填。

二、使用方式

基本上使用有两种方式,SDK里提供了现成的登陆控件,可以直接用,如果不用这个控件的话也可以自己写登陆过程。

使用控件的方式可参考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://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

四、实践

我的目的是,用户可以不必登陆即可浏览,但如果要发布评论的话必须登陆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里设置评论框和登陆区域的显示方式,比如绑定到某个属性上,如果登陆了则显示评论框,没登陆显示登陆按钮。

时间: 2024-10-28 14:43:44

在Windows Phone 8中使用Live Connect并保持登陆状态的相关文章

Alert Log中“Fatal NI connect error 12170”错误

Alert Log中"Fatal NI connect error 12170"错误 Fatal NI connect error 12170.     VERSION INFORMATION:         TNS for Linux: Version 11.2.0.4.0 - Production         Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production      

ubuntu 10.04加windows双系统中如何把Windows设为默认启动项

安装了WindowsXP和Ubuntu10.04双系统后(后装的Ubuntu),系统默认启动的操作系统是Ununtu 10.04,想更改为默认启动WindowsXP,参照以前版本的Ubuntu,只需要修改"/boot/grub/menu.lst "启动操作系统列表文件中的"default X"一行即可. 但是在Ubuntu 10.04中,并没有menu.lst文件.到Ubuntu wiki上查找相关帮助,也没有结果.猜测可能Ubuntu 10.04可能改变了启动操作

微软Windows XP SP2中的四大终极武器

window|微软     当然在这其中还是以"木马病毒"最令人头痛,而在XP SP2中自带的安全总管便可以帮您解决这一难题.由于大多数用户不知道自己的系统是否处于安全状态,这给病毒或黑客的入侵留下了可乘之机.Windows 安全中心能够监视系统安全组件是否正常工作,通过它可以在最短的时间内识别出Windows防火墙.自动更新.防病毒软是否已经正常工作. 对于状态正常的设置,安全中心将会用绿色显示出来:如果相应的选项状态异常(例如被关闭或禁用),则会标示为红色:状态未知则用黄色表示,这

在windows 2003 server中编写asp代码需要注意的地方

server|window 在windows 2003 server中编写asp代码,你可能会碰到下面的错误提示"不允许的父路径",涉及到的代码有: Server.MapPath(../)<!--#include file="../"--> 等.可能是出于安全考虑吧,微软屏蔽了脚本中对父路径的访问,但这可能会给我们的编程带来麻烦,尤其是原有asp的代码升级的时候.幸好,这个设置是可以关闭的,具体在下面这个地方IIS管理器中,在你的虚拟路径上点右键,属性,

Windows 2003 Server 中DOTNET程序访问COM组件

server|window|程序|访问 今天挺高兴,项目终于上线使用.只是上线之前遇到的问题折磨得人精疲力尽...不过总算解决了..在这把问题说出来,希望对有需要的朋友提供些帮助~~ 项目:DOTNET项目,C#开发,主要功能是通过COM组件访问远程接口. 运行环境:Windows 2003 Server + IIS6.0 + .Net 1.1 问题:COM组件及系统在WINDOWS2000操作系统下都能正常使用,但迁移到WIN2003下,在程序调用组件时进程卡住了,有时会返回服务器出现意外情况

如何在Windows 2000环境中Kill掉单个Oracle线程

oracle|window  如何在Windows 2000环境中Kill掉单个Oracle线程   来源:http://metalink.oracle.com 关键字:Oracle Thread Kill 描述:本文说明在Windows环境下, Orakill工具的使用 正文:        你遇到过下面类似的情况吗?一个用户进程长期占用资源而不释放,导致Oracle进程占用了系统的大量资源,Oralce系统的效率变得很低.如果简单的关闭重启Oracle 实例,势必影响所有的用户.有没有办法仅

Windows Server操作系统中的常用安全标识符

概要 安全标识符 (SID) 是可变长度的唯一值,用来标识 Windows Server 操作系统中的安全主体或安全组.常用 SID 是标识一般用户或一般组的一组 SID.它们的值在所有操作系统中都相同. 此信息可用于解决安全方面的问题,还可用于解决 ACL 编辑器中可能出现的潜在显示问题.在 ACL 编辑器中,可能显示 SID 而不是用户或组名. 常用 SID:? SID:S-1-0 名称:Null Authority 描述:标识符颁发机构. SID:S-1-0-0 名称:Nobody 描述:

如何将windows Server 2003中NTBackup恢复到Windws Server 2008/R2

我们在企业环境中经常会遇到系统升级或者数据恢复的问题,有时因为服务器系统版本更新或者更换新系统的服务器时,我们需要把Windows Server 2003中NTBackup中的文件备份恢复到Windows Server 2008或者Windows Server 2008 R2中,但在Windows Server 2008或者Windows Server 2008 R2中系统默认没有Ntbackup功能,取而代之是Windows Server backup功能了,在Windows Server b

Windows Server 2012中的Hyper-V PK VMware性能

近几年来,服务器虚拟化已经有了长足的演进,从刚萌芽的技术演变为成熟的 IT 功能.在演化过程中,各种规模的企业开始利用其强大的功能,满足日新月异的业务需求.组织通过将工作负载虚拟化,能够控制并降低成本,同时提升 IT 系统的扩展性.灵活性和涵盖范围.但随着演进的发展,我们也逐渐地领悟到只凭虚拟化本身,无法使组织构建或利用云服务,而云服务正在不断成长,在业务工作中扮演日益重要的角色.微软已经通过Hyper-V,在大幅改进虚拟化技术方面稳居领导地位.Hyper-V 最初在 Windows Serve