Background
This post assumes you have setup Cognito identity pool as explained in the previous post -
If not, then please refer the previous post and set that up. Before starting with using this you should have -
- Identity pool ID
- AWS region where pool and S3 bucket reside
- S3 bucket name
We will use above in configuration and implementation that follows.
How to upload files to S3 from iOS app written in Objective C using AWS Cognito identity pool
- First, go to your pod file and update following dependencies -
# Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'TestApp' do # Uncomment the next line if you're using Swift or would like to use dynamic frameworks # use_frameworks! # Pods for TestApp pod 'AWSMobileClient', '~> 2.6.18' # For AWSMobileClient pod 'AWSS3', '~> 2.6.18' # For file transfers pod 'AWSCognito', '~> 2.6.18' # For data sync end
- Next run "Run pod install --repo-update" from the command line
- Once you have the dependencies installed we can now write Objective C code to upload a file to S3.
// // FileUploader.m // TestApp // // Created by Aniket on 22/05/18. // #import <Foundation/Foundation.h> #import "FileUploader.h" #import <AWSS3/AWSS3.h> #import <AWSCore/AWSCore.h> @implementation FileUploader static AWSS3TransferManager *transferManager; + (void) initialize { if (self == [FileUploader class]) { AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-east-1:f847843f-0162-43c2-b73f-efdc7c69cce2"]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider]; [AWSS3TransferManager registerS3TransferManagerWithConfiguration:[[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider] forKey:s3TransferManagerKey]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; transferManager = [AWSS3TransferManager S3TransferManagerForKey:s3TransferManagerKey]; } } + (void)uploadFile { NSURL *uploadingFileURL = [NSURL fileURLWithPath: @"PATH_TO_FILE"; AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new]; uploadRequest.bucket = s3Bucket; int timestamp = [[NSDate date] timeIntervalSince1970]; uploadRequest.key = [NSString stringWithFormat:@"%@-%d%@",@"testfile",timestamp,@".txt"]; uploadRequest.body = uploadingFileURL; [[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor] withBlock:^id(AWSTask *task) { if (task.error) { if ([task.error.domain isEqualToString:AWSS3TransferManagerErrorDomain]) { switch (task.error.code) { case AWSS3TransferManagerErrorCancelled: case AWSS3TransferManagerErrorPaused: break; default: NSLog(@"Error uploading file to S3: %@", task.error); break; } } else { // Unknown error. NSLog(@"Error uploading file to S3: %@", task.error); } } if (task.result) { AWSS3TransferManagerUploadOutput *uploadOutput = task.result; // The file uploaded successfully. NSLog(@"uploading file to S3 was successful: %@", uploadOutput); } return nil; }]; } @end
In above code replace the identity pool id and region as per your configuration settings. This is Objective C code, if you want to see Swift or Android - Java please refer https://docs.aws.amazon.com/aws-mobile/latest/developerguide/how-to-integrate-an-existing-bucket.html