0

アプリがバックグラウンドで動作しているときに、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 に直行すると、すべて正常に動作しますが、安全かどうかはわかりません。

ありがとう

4

1 に答える 1

0

デリゲートが呼び出されるのを待たずcompletionHandler(UIBackgroundFetchResultNewData);にすぐに呼び出しているため(バックグラウンド フェッチが完了したことを示します)。[self startOAuth2];

completionHandler(UIBackgroundFetchResultNewData);メソッドを呼び出す方法を見つける必要があります- (void)auth:(GTMOAuth2Authentication *)auth finishedRefreshWithFetcher:(GTMHTTPFetcher *)fetcher error:(NSError *)error

于 2015-08-21T08:55:09.603 に答える