2017-10-24 10 views
0

私はDropboxとGoogleドライブの統合をiOSアプリに使用しています。私は両方のドライブからファイルをフェッチし、テーブルビューでリストを表示することができます。しかし、これらのドライブからログアウトせずに私のiPhone上のアプリケーションを削除すると、新しいアプリをインストールするとログインしたままになります。アプリを削除したりセッションを削除したときにユーザーをログアウトするにはどうすればよいですか? Dropboxの場合ObjectiveDropboxOfficial apiV2を使用しています.Googleドライブの場合は、GoogleAPIClientForREST、GTMSessionFetcherなどのライブラリを使用しています。 マイコード:アプリを削除すると、ユーザーはDropboxとGoogleドライブからログアウトしない

[DBClientsManager setupWithAppKey:@"my-key"]; 

[DBClientsManager authorizeFromController:[UIApplication sharedApplication] 
controller:self openURL:^(NSURL *url) { 
     [[UIApplication sharedApplication] openURL:url]; 
}]; 

// AppDelegate

if ([DBClientsManager handleRedirectURL:url]) 
{ 
    if (DBClientsManager.authorizedClient || DBClientsManager.authorizedTeamClient) { 
     //   NSLog(@"App linked successfully!"); 
     // At this point you can start making API calls 

     NSNotification *notification = [NSNotification notificationWithName:@"DropboxLoggedIn" object:nil]; 
     [[NSNotificationCenter defaultCenter] postNotification:notification]; 

    } 

    return YES; 
} 
+0

。あなたは、アプリでログアウトを与え、ログアウト方法を使用することができます。 –

+0

[参照用クロスリンク:https://github.com/dropbox/dropbox-sdk-obj-c/issues/188] – Greg

答えて

0

これらのサービスは、データを永続化し、彼らがキーチェーンに資格情報を保存、私が想定し、このように設計されており、再インストールやキーチェーンがあるときにアプリケーションがすでにログインしている場合とにかく転送されます。

これがあなたの望む効果でない場合、これらのサービスから手動でログアウトする必要があると仮定することができます。これは、あなたがこれらのログインとログアウトを追跡する必要があることを意味し、その後、あなたがログインしたとして追跡されていないすべてのサービスからログアウトするだけです。

行うには醜いものですが、解決策です:

サービスは、あなたがクリアする必要がログアウトしたとき

- (void)serviceDidLogin:(ServiceType)type { 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:[self keyForServiceType: type]]; 
} 

そして、ユーザデフォルトの値を保存でログインしていますそれアプリが起動したとき

- (void)serviceDidLogout:(ServiceType)type { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:[self keyForServiceType: type]]; 
} 

は、その後、あなたがにログインされているのない記録を持っていないサービスのすべてからログアウトする必要があります。

どんなにあなたがこれを行う方法
- (void)logOutFromAllUnusedService { 
    for(int i=0; i<ServiceTypeCount; i++) { 
     ServiceType type = i; 

     if([[NSUserDefaults standardUserDefaults] boolForKey:[self keyForServiceType: type]] == NO) { 
      [self logoutFromService:type]; 
     } 
    } 
} 

が、私の状況はServiceTypeがそうのような列挙型である前提としています。私はこのための解決策があるとそうは思わない

typedef enum { 
    // Never assign values to enums 
    ServiceTypeDropbox, 
    ServiceTypeGoogleDrive, 

    ServiceTypeCount, // Always last of the valid 

    // Move deprecated services here 
    ServiceTypeDeprecated1 // TODO: remove at some point 
} ServiceType; 
+0

Dropboxで提供されている方法でログアウトすると、それでもログイン画面に移動しません。それは、許可を求める画面が表示されます。「アプリはあなたのDropbox内のファイルへのアクセスを希望します。メソッドは if([DBClientsManager authorizedClient]){ [DBClientsManager unlinkAndResetClients]; [self.navigationController popViewControllerAnimated:YES]; } – Mudassir

+0

@ Jr.Developerこれは間違ったメソッドを呼び出すか、DBClientsManagerに欠陥があるようです。どちらの場合も、「Dropboxユーザーを切り替える方法」や本当にログアウトする方法などの別の問題があります。私はこれが奇妙な結果だと思うが、この問題が「アプリケーションを削除するとき」に特有でない限り、私はあなたに新しい質問をして、これをリンクすることを提案する。他の人たちも同じ問題に直面し、適切な解決策を講じているに違いないと確信しています。 –

関連する問題