我发现这是一个挑战,但经过大量实验后终于成功了。以下是一些应该有所帮助的信息:
一旦用户获得授权,每个 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。
希望这足以构成拼图。祝你好运。