2

複数のアカウントをサポートするようにアプリの1つ(Dropboxクライアント)を更新しようとしていますが、それを行う方法が見つからないようです。

SDKを何度も分析しましたが、何度見ても、公式SDKを使用しているアカウントは一度に1つのアカウントしかサポートできないようです。複数のアプリをリンクできる多くのアプリを知っているので、もっとサポートできると確信しています。

これを行うためのポインタは高く評価されます。後でトークンを個別に保存するためにトークンをフェッチする方法すら見つかりません。

4

1 に答える 1

10

これは難しいと思いましたが、たくさんの実験を重ねた結果、ようやく機能するようになりました。役立つ情報を次に示します。

ユーザーが承認されると、各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を自分のアカウントモデルから削除します。

うまくいけば、それはパズルを構築するのに十分なピースです。幸運を。

于 2013-03-09T00:06:08.310 に答える