我在iOS应用中使用Dropbox和Google Drive集成。我可以从两个驱动器中获取文件并查看tableview中的列表。但是,当我在没有从这些驱动器注销的情况下删除iPhone上的应用程序时,它仍会显示在我安装新应用程序时登录。如何在删除应用程序或删除会话时注销用户? 对于Dropbox,我使用的是ObjectiveDropboxOfficial apiV2,对于Google Drive,我正在使用GoogleAPIClientForREST,GTMSessionFetcher等库。 我的代码:
[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)
如果这些服务是按照这种方式设计的,我假设他们会在密钥链中保存凭据,这些密钥链会保留数据并且您的应用程序在重新安装或无论如何转移钥匙链时都已登录。
如果这不是您想要的效果,我只能假设您需要手动退出这些服务。这意味着您需要跟踪这些登录和注销,然后当应用程序启动时,只需从您登录时未记录的所有服务中注销。
这是一个丑陋的事情,但它是一个解决方案:
登录服务时,保存用户默认值
中的值- (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;