我希望更新我的一个应用程序(这是一个Dropbox客户端)以支持多个帐户,但我似乎无法找到方法。
我已多次分析SDK,无论我看多少次,看起来使用官方SDK的帐户一次只能支持一个帐户。虽然我确信它可以支持更多,因为我知道许多应用程序允许您链接多个。
任何关于这样做的提示都将受到高度赞赏。我甚至找不到一种方法来获取令牌以便稍后单独存储它们。
答案 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。
希望这足以构建拼图。祝你好运。