Live Connect和Live SDK的一些简介

我最近就在研究了一下Live Connect的API,准备用SDK写一个和网盘有关的App,不过现在暂时还没完全定型。不过API的调用,我也大概看得七七八八,就先写一写吧。

这里有完整的文档http://msdn.microsoft.com/zh-cn/library/live/,我主要会写写文档里一些基本和比较重要的地方。

 

 

一、Live Connect的简单概念

Live Connect现在可以获取的信息有SkyDrive、Hotmail、Messenger和Live,其中我就主要用到SkyDrive这个部分。所以其余的API调用,我不怎么研究过。而Live Connect所用的也是OAuth 2.0的协议标准,REST的体系结构,返回JSON数据以及XMPP的实时通信标准。首先要创建一个自己的应用才可以调用API,具体的我就不多说,跟新浪差不多,不过记得要在API设置那里勾上mobile的选项。

Live Connect的权限分得很细,应用的权限大小在Live Connect中是称为作用域,而权限的大小是由应用去请求,经由用户确认授权所获得的。当然,在满足应用需要的前提下尽可能请求小的权限,这样可以尽量打消用户的疑虑,更有机会取得授权。这个也是Live提倡的理念之一。

作用域之间也有包含和被包含的关系,一旦你请求的作用域中,其中有一个为另一个的子集,那么子集的作用域就会因为冗余而取消。在请求授权的时候也不会显示出子集作用域的权限,只会显示出其超集的权限。这里是作用域的详细资料http://msdn.microsoft.com/zh-cn/library/live/hh243646.aspx

HTTP动词有这些:

  • GET — 返回资源的表示。
  • POST — 向集合添加新资源。
  • PUT — 在 URL 指出的位置处更新资源或创建新的资源(如果资源不存在)。
  • DELETE — 删除资源。
  • MOVE — 移动资源的位置。
  • COPY — 复制资源。

 

 

二、使用Live SDK

调用API的方法其实有两种,一种就是直接通过引用REST API获取JSON数据并自己进行处理,第二种就是根据自己的要开发的平台下载对应的SDK。第一种方法基本任何平台都可以使用,不过处理JSON数据这些枯燥的工作还必须要自己做。第二种方法,针对性比较强,SDK已经为开发者做好了大量的工作,可以缩短开发周期。在http://msdn.microsoft.com/zh-cn/library/live/hh826538.aspx可以找到对应的SDK下载,不过这里也分为引用API Framework和直接引用API源代码。以下我就以iOS的Framework为例子。

 

首先把Framework拖进去

然后每个头文件都加上#import "LiveSDK/LiveConnectClient.h",最后在需要调用SDK的Controller加入对应的协议,如LiveAuthDelegate, LiveDownloadOperationDelegate, LiveOperationDelegate, LiveUploadOperationDelegate。再添加协议包含的属性LiveConnectClient *liveClient,并实现一些方法- (void)authCompleted: session: userState:,- (void) liveOperationSucceeded: operation。那么基本工作就完成了。

 

 

三、API具体的调用

SDK已经把REST API的调用封装成了Objective-c的方法,而且大部分的操作基本都是通过LiveConnectClient *liveClient来调用。有点要注意就是,我通过调试发现SDK使用了多线程的技术,所以对于界面的更新,开发者需要作出其他的安排。

1 - (void)viewDidLoad
2 {
3     [super viewDidLoad];
4     
5     self.liveClient = [[LiveConnectClient alloc] initWithClientId:APP_CLIENT_ID 
6                                                          delegate:self 
7                                                         userState:@"initialize"];
8 }

APP_CLIENT_ID是应用的ID,这里我用宏定义了。userState其实可以随便填写,因为它仅仅是一个类似identifer的东西,具体的作用都是由自己去定义。这样就先初始化了liveClient。

 

 1 - (void)authCompleted:(LiveConnectSessionStatus) status 
 2               session:(LiveConnectSession *) session 
 3             userState:(id) userState
 4 {
 5     if ([userState isEqual:@"initialize"])
 6     {
 7         [self.liveClient login:self 
 8                         scopes:[NSArray arrayWithObjects:@"wl.signin", @"wl.offline_access", @"wl.basic", @"wl.contacts_skydrive", @"wl.skydrive_update", nil] 
 9                       delegate:self 
10                      userState:@"signin"];
11     } else if ([userState isEqualToString:@"signin"]) {
12         [self.liveClient getWithPath:@"me/skydrive/my_documents/files?sort_by=name" 
13                             delegate:self
14                            userState:@"get root folder files"];
15     }
16 }

userState的作用就在这里体现出来了,由于initWithClientId:delegate:userState:需要有LiveAuthDelegate,当这个方法执行成功后就会调用authCompleted:session:userState:。这时就要通过userState来判断究竟下一步应该执行什么操作。我这里就用login:scopes:delegate:userState:请求用户授权,至于token什么的不用担心,SDK会自动处理的,下次打开程序就是自动登陆了。如果要用SDK做多用户管理,暂时是无解的,因为Live Connect并不想开发者过多地接触到用户的账号和密码的资料,所以就做出了这种处理。

 

当授权成功以后,就可以调用getWithPath:delegate:userState:来获取SkyDrive里面的信息。这个方法执行成功后也会调用liveOperationSucceeded:方法,老规矩也是利用userState来判断下一步的操作。说到这里就要讲一下,返回的数据到底在哪里了。其实返回的数据是NSDictionary类型的operation.result,已经不用我们重新解释一次JSON数据了。数据的样子大概是这样。

{
   "data": [
      {
         "id": "folder.8c8ce076ca27823f.8C8CE076CA27823F!142", 
         "from": {
            "name": "Roberto Tamburello", 
            "id": "8c8ce076ca27823f"
         }, 
         "name": "My Sample Folder in Album 1", 
         "description": "",
         "parent_id": "folder.de57f4126ed7e411", 
         "upload_location": "https://apis.live.net/v5.0/folder.de57f4126ed7e411.DE57F4126ED7E411!126/files/", 
         "is_embeddable": true, 
         "count": 3, 
         "link": "https://cid-8c8ce076ca27823f.skydrive.live.com/redir.aspx?page\u003dself\u0026resid\u003d8C8CE076CA27823F!142\u0026parid\u003d8C8CE076CA27823F!126\u0026type\u003d5", 
         "type": "folder", 
         "shared_with": {
             "access": "Just me"
         },
         "created_time": "2011-04-22T00:36:30+0000", 
         "updated_time": "2011-04-22T19:18:12+0000"
      }, {
         ...
      }
   ]
}

这是文件夹的数据,由于Live Connect那里也划分了很多的对象,具体可查看http://msdn.microsoft.com/zh-cn/library/live/hh243648.aspx。最后显示到界面上的数据就再自己处理一下。不过,File对象有一个比较有趣的结构“source”,里面保存了一个临时的网址,允许拥有网址的人不需要任何权限就可以读取该文件。但是,这个网址是会过期的,官方也提醒开发者不应该储存该网址,那么这个结构到底有什么用呢?其实,iOS有一个UIWebView是很强悍的控件,可以看视频,看PDF,事实上SkyDrive也支持在线浏览。“source”就是为了可以浏览SkyDrive文件中的内容而存在的,支持格式有MS Office三剑客(你懂的)的基本文件doc,docx等,mp4,pdf,jpg,png,其他的大家可以试试,这里有http://msdn.microsoft.com/zh-cn/library/live/hh826545.aspx#fileformats。时间是ISO8601格式,需要自己进行一下转换,用NSDate的方法可以做到的,其余的我也就不多说了。

 

现在我就只做到很少的一部分,很多功能还没有实现,下面就放出一下现在写好的程序的截图吧。

posted @ 2012-07-30 12:18  Pinka  阅读(1218)  评论(4编辑  收藏  举报