The app is not getting successful API call after hours of inactivity.
Steps to reproduce the behavior:
- Creation of Amazon Cognito ID.
- API calls.
- Put the app in the background.
- Refresh code after 8 hours. (initializeAmazonCongnitoProviderWithCompletionBlock mentioned below is called first when the app comes to foreground only after 8 hours) Missing auth token will appear as suggested in the screenshot. Which AWS service(s) are affected?
- (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; }]; }