在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://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里设置评论框和登陆区域的显示方式,比如绑定到某个属性上,如果登陆了则显示评论框,没登陆显示登陆按钮。
在Windows Phone 8中使用Live Connect并保持登陆状态的更多相关文章
- ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session
Session 嘛,占一点儿服务器资源,但是总归比 ViewState 和 Cookie 安全点儿,所以还是要用的. Windows Azure 环境中的 Web 服务器经由负载均衡调度,根本无法保证 ...
- windows和linux中搭建python集成开发环境IDE——如何设置多个python环境
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- Windows 商店应用中使用 SharePoint REST API
前面一篇我们介绍了 Office 365 REST API 的官方工具的使用,本篇我们来看一下 SharePoint REST API 本身的描述.结构和使用方法,以及一些使用经验. 首先来看看Sha ...
- Windows 商店应用中使用 Office 365 API Tools
本篇我们介绍一个API 工具,用于在 Windows Store App 中使用 Office 365 API. 首先来说一下本文的背景: 使用 SharePoint 做过开发的同学们应该都知道,Sh ...
- 【转】深入Windows内核——C++中的消息机制
上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图 Win32 ...
- 将自己写的windows服务加入到windows集群中
最近发现windows集群能进行很多自定义,比如在集群中加入自己编写的服务. 能自定义的可不少,截个图: 本次演示中,只想用“通用服务”这个类型. 先列下步骤 编写一个记录时间的Windows服务,这 ...
- Windows 2012 R2中安装SharePoint 2013 sp1参考
之前介绍过在window 2012中安装SharePoint 2013,这次,借着SharePoint 2013 sp1补丁发布之际,介绍下在window 2012 r2中安装SharePoint 2 ...
- 在Windows Server 2012 中安装 .NET 3.5 Framework
问题 如今,仍然有许多程序和应用需要依靠.NET 3.5 framework 来运行.在Windows Server 2012中,微软提供了.NET 3.5 和.NET 4.5的安装选项以为你的应用程 ...
随机推荐
- 我YY的一个移动应用运营模式
尽管自己也还是刚刚毕业不久的前端新人,但网上也不乏一些案例告诉我们有志不在年高,很多优秀的同龄人已经有了不错的成就,所以在切页面写onclick之余也在进行一些思考,前端程序员的出路到底在哪里? 一. ...
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...
- RSS与公众号
这次怀念下曾经火热的RSS.RSS是我很喜欢的一种看信息学习的方式,但是这项技术随着谷歌reader产品的停止已经陨落了.之后再无给力的客户端,无法让人愉悦的使用.我也曾尝试用鲜果,有道等国内产品,由 ...
- EF架构~充血模型设置不被持久化的属性
回到目录 在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型,而在DDD领域驱动设计中,比较提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,注意这里说的是操作属性的方 ...
- Mysql 事件(定时任务)
mysql 创建任务(事件) 1.检查数据库事件是否开启,如果 event_scheduler 等于 NO表示开启 SELECT @@event_scheduler; SHOW VARIABLES L ...
- ToString()的各种用法(大全)
常用例子: string str = ""; str = .ToString("N"); //生成 12,3456.00 str = .ToString(&qu ...
- Asp.Net回车键触发Button的OnClick事件解决方案
在aspx页面有textbox文本框,还有三个button按钮.启用textbox的TextChanged事件和button的click事件. 问题: 现在在textbox文本框输入完数据按“回车”后 ...
- 邻接表无向图(二)之 C++详解
本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...
- ios见习之-UISearchbar+tableview实现自动搜索自带提示
当做搜索时常常希望能在输入的时候出现搜索关键字,如下效果
- VS2013正则表达式应用示例
VS2013正则表达式语法 在查找替换对话框中查看 VS2013语法可在查找替换对话框中查看,具体过程如下: 通过编辑->查找和替换->在文件中替换或者相应快捷键(Ctrl+Shift+H ...