该应用程序在数小时不活动后未获得成功的 API 调用。
重现行为的步骤:
- 创建 Amazon Cognito ID。
- API 调用。
- 将应用程序置于后台。
- 8小时后刷新代码。(下面提到的initializeAmazonCongnitoProviderWithCompletionBlock 会在应用程序在8 小时后才进入前台时首先调用) Missing auth token 将如屏幕截图所示出现。哪些 AWS 服务受到影响?
- (void)initializeAmazonCognitoProviderWithCompletionBlock:(void (^)(void))completion { [[UIApplication sharedApplication].keyWindow setUserInteractionEnabled:FALSE]; NSString* AWSCognitoPoolID = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"AWSCognitoID"]; AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AMAZON_COGNITO_REGION identityPoolId:AWSCognitoPoolID]; [credentialsProvider clearCredentials]; AWSServiceConfiguration *configuration =[[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; [self getCognitoID:credentialsProvider CompletionBlock:^{ [self expirationHandler:credentialsProvider CompletionBlock:^{ dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication sharedApplication].keyWindow setUserInteractionEnabled:TRUE]; }); completion(); }]; }]; } - (void)expirationHandler:(AWSCognitoCredentialsProvider *)creds CompletionBlock: (void (^)(void))completion { [[creds credentials] continueWithBlock:^id(AWSTask *task) { if (task.error) { [self initializeAmazonCognitoProviderWithCompletionBlock:^{}]; } else { AWSCredentials *cred = (AWSCredentials*) task.result; NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init]; [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; /* https://aws.amazon.com/premiumsupport/knowledge-center/security-token-expired/ https://forums.aws.amazon.com/thread.jspa?threadID=166398 We should fire timer before 5 minutes of expiration. NSString *expF = [dateFormat stringFromDate:cred.expiration]; */ [NSTimer scheduledTimerWithTimeInterval:cred.expiration.timeIntervalSinceNow - 300 target:self selector:@selector(initializeAmazonCognitoProviderWithCompletionBlock:) userInfo:nil repeats:NO]; completion(); } return nil; }]; } - (void)getCognitoID:(AWSCognitoCredentialsProvider *)creds CompletionBlock: (void (^)(void))completion { [[creds getIdentityId] continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); [self initializeAmazonCognitoProviderWithCompletionBlock:^{}]; } else { NSString *cognitoId = task.result; NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; if (![[standardDefaults valueForKey:@"UserCognitoID"] isEqualToString:cognitoId]) { [standardDefaults setObject:@"" forKey:BainPreferenceToken]; [standardDefaults setInteger:0 forKey:@"registrationPostComplete"]; } [standardDefaults setObject:cognitoId forKey:@"UserCognitoID"]; [standardDefaults synchronize]; completion(); } return nil; }]; }