• 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的方法可以做到的,其余的我也就不多说了。

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

  • 相关阅读:
    Knockoutjs 实践入门 (2) 绑定事件
    HTTP If-Modified-Since引发的浏览器缓存汇总
    net.sf.json和 com.fasterxml.jackson中对象转json的区别
    JPA EntityManager详解
    Spring JPA中OneToOne和OneToMany用法
    Spring Data JPA中CrudRepository与JpaRepository的不同
    Git提交撤销
    Tomcat启动报StackOverflowError
    Git分支合并冲突解决(续)
    Git分支合并冲突解决
  • 原文地址:https://www.cnblogs.com/ipinka/p/2614803.html
Copyright © 2020-2023  润新知