これは難しいと思いましたが、たくさんの実験を重ねた結果、ようやく機能するようになりました。役立つ情報を次に示します。
ユーザーが承認されると、各Dropbox(DB)アカウントにはユーザーID(uid)が関連付けられます。アカウントの独自のアプリのモデルでは、uidを追跡する必要があります。最初に、ユーザーがDBアカウントをリンクする前に、このuidはになりますnil
。
ユーザーが自分のDBアカウントにアクセスしたい場合は、アカウントに関連付けられた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を自分のアカウントモデルから削除します。
うまくいけば、それはパズルを構築するのに十分なピースです。幸運を。