我最近就在研究了一下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的方法可以做到的,其余的我也就不多说了。
现在我就只做到很少的一部分,很多功能还没有实现,下面就放出一下现在写好的程序的截图吧。