2

我正在寻找更新我的一个应用程序(它是一个 Dropbox 客户端)以支持多个帐户,但我似乎无法找到一种方法来做到这一点。

SDK我分析过很多次,看多少次,好像一个使用官方SDK的账号一次只能支持一个账号。尽管我确信它可以支持更多,因为我知道许多允许您链接多个应用程序的应用程序。

任何有关这样做的指示都将受到高度赞赏。我什至找不到获取令牌以稍后单独存储它们的方法。

4

1 回答 1

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];

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

在您的应用程序委托的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。

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

于 2013-03-09T00:06:08.310 回答