アプリがバックグラウンドで動作しているときに、Gmail でメールをチェックしようとしています。
gmail にアクセスするには OAuth2 を処理する必要があるため、まずトークンを更新します。その後、finishedRefreshWithFetcher で、エラーがなければ Mailcore2 を使用してメールをチェックしています。
アプリがフォアグラウンドにある場合、または -(void) applicationDidBecomeActive: (UIApplication *) application {...} にある場合、すべて正常に動作します。
しかし、バックグラウンド フェッチでは -(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 をスキップして、retriveEmails に直行すると、すべて正常に動作しますが、安全かどうかはわかりません。
ありがとう