我正在尝试在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直接进行回复电子邮件,一切正常,但不确定它是否安全。
由于
答案 0 :(得分:0)
因为您在completionHandler(UIBackgroundFetchResultNewData);
之后立即调用[self startOAuth2];
(表示您的后台提取已完成),因此无需等待您的代表被调用。
您需要找到一种在completionHandler(UIBackgroundFetchResultNewData);
方法中调用- (void)auth:(GTMOAuth2Authentication *)auth finishedRefreshWithFetcher:(GTMHTTPFetcher *)fetcher error:(NSError *)error
的方法。