如何在应用中授权多个Dropbox帐户?

时间:2013-03-08 22:59:34

标签: ios cocoa-touch ios6 dropbox-api

我希望更新我的一个应用程序(这是一个Dropbox客户端)以支持多个帐户,但我似乎无法找到方法。

我已多次分析SDK,无论我看多少次,看起来使用官方SDK的帐户一次只能支持一个帐户。虽然我确信它可以支持更多,因为我知道许多应用程序允许您链接多个。

任何关于这样做的提示都将受到高度赞赏。我甚至找不到一种方法来获取令牌以便稍后单独存储它们。

1 个答案:

答案 0 :(得分:10)

我发现这是一项挑战,但经过大量实验后终于成功了。以下是一些有用的信息:

一旦用户获得授权,每个Dropbox(DB)帐户都有一个与之关联的用户ID(uid)。在您自己的应用程序的帐户模型中,您需要跟踪uid。最初,在用户链接其数据库帐户之前,此uid将为nil

当用户想要访问其数据库帐户时,您将获得该帐户的关联uid。如果uid不是nil,则按以下方式设置DBRestClient

_client = [[DBRestClient alloc] initWithSession:[DBSession sharedSession] userId:uid];

如果尚未设置uid,则需要显示登录屏幕。

[[DBSession sharedSession] linkFromController:someController];

当然,这会启动数据库应用程序以显示登录(如果未安装数据库应用程序,则显示Web界面)。无论哪种方式,当用户完成授权过程时,您的应用程序将由DB再次启动。

在您的app delegate的application:openURL:sourceApplication:annotation:方法中,您可以执行以下操作:

if ([[DBSession sharedSession] handleOpenURL:url]) {
    NSString *query = url.query;
    if ([[url absoluteString] rangeOfString:@"cancel"].location == NSNotFound) {
        NSDictionary *urlData = [DBSession parseURLParams:query];
        NSString *uid = [urlData objectForKey:@"uid"];
        if ([[[DBSession sharedSession] userIds] containsObject:uid]) {
            // At this point we know the login succeeded and we have the newly linked userid
            // make a call to process the uid
        }
    } else {
        // user cancelled the login
    }
}

在处理新链接的uid的代码中,您可以将uid存储在自己的帐户数据模型中。然后你就像我之前展示的那样使用uid来创建DBRestClient

如果你有一个uid,你可以通过简单的检查确定uid是否正确链接:

if ([[[DBSession sharedSession] userIds] containsObject:uid]) {
    // the uid is linked
}

要根据用户的uid取消关联,您可以这样做:

[[DBSession sharedSession] unlinkUserId:uid];

此时我还会从您自己的帐户模型中清除已保存的uid。

希望这足以构建拼图。祝你好运。