OAuth2.0刷新令牌永远不会在后台获取中完成

时间:2015-04-20 21:34:55

标签: ios objective-c iphone oauth-2.0 background-fetch

我正在尝试在app处于后台时检查gmail上的电子邮件。

我必须处理OAuth2才能访问gmail,所以我先刷新令牌。然后在finishedRefreshWithFetcher中,如果没有错误,我正在使用Mailcore2检查电子邮件。

如果应用程序位于前台,或者在 - (void)applicationDidBecomeActive:(UIApplication *)应用程序{...}中,一切正常。

但是在后台获取它永远不会到 - (void)auth:finishedRefreshWithFetcher:error:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [self startOAuth2];
    completionHandler(UIBackgroundFetchResultNewData);
}
- (void) startOAuth2{
    static NSString *const kKeychainItemName = @"Google OAuth2 For MyApp";
    static NSString *const kClientID = @"***";
    static NSString *const kClientSecret = @"***";    
    GTMOAuth2Authentication * auth = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName clientID:kClientID clientSecret:kClientSecret];
    if ([auth refreshToken] != nil) {
        [auth beginTokenFetchWithDelegate:self didFinishSelector:@selector(auth:finishedRefreshWithFetcher:error:)];
    }
}
- (void)auth:(GTMOAuth2Authentication *)auth finishedRefreshWithFetcher:(GTMHTTPFetcher *)fetcher error:(NSError *)error {
     if (error != nil) {// Refresh failed
         return;
     }
     [self retrieveEmails];
}

我可以存储令牌,只需重新使用它就可以刷新,即只需跳过startAuth2直接进行回复电子邮件,一切正常,但不确定它是否安全。

由于

1 个答案:

答案 0 :(得分:0)

因为您在completionHandler(UIBackgroundFetchResultNewData);之后立即调用[self startOAuth2];(表示您的后台提取已完成),因此无需等待您的代表被调用。

您需要找到一种在completionHandler(UIBackgroundFetchResultNewData);方法中调用- (void)auth:(GTMOAuth2Authentication *)auth finishedRefreshWithFetcher:(GTMHTTPFetcher *)fetcher error:(NSError *)error的方法。