Now in order to use Bayun’s SecureAWSS3TransferUtility
instead of the standard AWS S3 AWSS3TransferUtility
, these code snippets above change to using “Secure” version, as below:
Add the following import statement in Objective-C:
#import "SecureAWSS3TransferUtility.h"
As you can see from the code snippets below, in general it should be possible to simply query-replace the following type-names appropriately to their secure versions, and in most situations that should be sufficient.
AWSS3TransferUtility --> SecureAWSS3TransferUtility
5.2.1 Configuring the Application Delegate
The Secure Transfer Utility for iOS uses the background transfer feature in iOS to continue data transfers even when your app isn’t running.
Call the following class method in your - application:handleEventsForBackgroundURLSession:completionHandler:
application delegate so that iOS can tell the Transfer Utility when the transfer finishes while the app is not suspended.
Objective-C Swift
Copy - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
completionHandler:(void (^)())completionHandler {
/* Store the completion handler.*/
[SecureAWSS3TransferUtility interceptApplication:application handleEventsForBackgroundURLSession:identifier completionHandler:completionHandler];
}
Copy func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
SecureAWSS3TransferUtility.interceptApplication(application, handleEventsForBackgroundURLSession:identifier , completionHandler:completionHandler)
}
5.2.2 Uploading a file using SecureAWSS3TransferUtility
To upload a file call uploadFile:bucket:key:contentType:expression:completionHander:
on SecureAWSS3TransferUtility
:
Objective-C Swift
Copy NSURL *fileURL = // The file to upload.
AWSS3TransferUtilityUploadExpression *expression = [AWSS3TransferUtilityUploadExpression new];
expression.progressBlock = ^(AWSS3TransferUtilityTask *task, NSProgress *progress) {
dispatch_async(dispatch_get_main_queue(), ^{
// Do something e.g. Update a progress bar.
});
};
AWSS3TransferUtilityDownloadCompletionHandlerBlock completionHandler = ^(AWSS3TransferUtilityDownloadTask *task, NSURL *location, NSData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
// Do something e.g. Alert a user for transfer completion.
// On failed downloads, `error` contains the error object.
});
};
SecureAWSS3TransferUtility *transferUtility = [SecureAWSS3TransferUtility defaultS3TransferUtility];
[[transferUtility uploadFile:fileURL
bucket:@"YourBucketName"
key:@"YourObjectKeyName"
contentType:@"text/plain"
expression:expression
completionHander:completionHander]continueWithBlock:^id(AWSTask *task) {
if (task.error) {
NSLog(@"Error: %@", task.error);
}
if (task.exception) {
NSLog(@"Exception: %@", task.exception);
}
if (task.result) {
AWSS3TransferUtilityUploadTask *uploadTask = task.result;
// Do something with uploadTask.
}
return nil;
}];
Copy let expression = AWSS3TransferUtilityUploadExpression()
expression.progressBlock = {(task, progress) in
dispatch_async(dispatch_get_main_queue(), {
// Do something e.g. Update a progress bar.
})
}
let completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock = { (task, location, data, error) -> Void in
dispatch_async(dispatch_get_main_queue(), {
if ((error) != nil) {
NSLog("Failed with error")
NSLog("Error: %@",error!);
} else {
if((data) != nil) {
NSLog("download Successful")
}
}
})
}
let transferUtility = SecureAWSS3TransferUtility.defaultS3TransferUtility()
transferUtility!.uploadFile(fileURL,
bucket: "YourBucketName",
key: "YourObjectKeyName",
contentType: "text/plain",
expression: expression,
completionHander: completionHandler).continueWithBlock { (task) -> AnyObject! in
if let error = task.error {
NSLog("Error: %@",error.localizedDescription);
}
if let exception = task.exception {
NSLog("Exception: %@",exception.description);
}
if let result = task.result {
NSLog("Upload Starting!")
// Do something with uploadTask.
}
return nil;
}
5.2.3 Downloading to a File using SecureAWSS3TransferUtility
Here are code snippets you can use for downloading to a file.
Objective-C Swift
Copy NSURL *fileURL = // The file URL of the download destination.
AWSS3TransferUtilityDownloadExpression *expression = [AWSS3TransferUtilityDownloadExpression new];
expression.progressBlock = ^(AWSS3TransferUtilityTask *task, NSProgress *progress) {
dispatch_async(dispatch_get_main_queue(), ^{
// Do something e.g. Update a progress bar.
});
};
AWSS3TransferUtilityDownloadCompletionHandlerBlock completionHandler = ^(AWSS3TransferUtilityDownloadTask *task, NSURL *location, NSData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
// Do something e.g. Alert a user for transfer completion.
// On failed downloads, `error` contains the error object.
});
};
SecureAWSS3TransferUtility *transferUtility = [SecureAWSS3TransferUtility defaultS3TransferUtility];
[[transferUtility downloadToURL:fileURL
bucket:S3BucketName
key:S3DownloadKeyName
expression:expression
completionHander:completionHandler] continueWithBlock:^id(AWSTask *task) {
if (task.error) {
NSLog(@"Error: %@", task.error);
}
if (task.exception) {
NSLog(@"Exception: %@", task.exception);
}
if (task.result) {
AWSS3TransferUtilityDownloadTask *downloadTask = task.result;
// Do something with downloadTask.
}
return nil;
}];
Copy let transferUtility = SecureAWSS3TransferUtility.defaultS3TransferUtility()
let expression = AWSS3TransferUtilityDownloadExpression()
expression.progressBlock = {(task, progress) in
dispatch_async(dispatch_get_main_queue(), {
// Do something e.g. Update a progress bar.
})
}
let completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock = { (task, location, data, error) -> Void in
dispatch_async(dispatch_get_main_queue(), {
if ((error) != nil) {
NSLog("Failed with error")
NSLog("Error: %@",error!);
} else {
if((data) != nil) {
NSLog("download Successful")
}
}
})
}
transferUtility!.downloadToURL(fileURL,
bucket: "bayun-company13",
key: "file.pdf",
expression: expression,
completionHander: completionHandler).continueWithBlock { (task) -> AnyObject? in
if let error = task.error {
NSLog("Error: %@",error.localizedDescription);
}
if let exception = task.exception {
NSLog("Exception: %@",exception.description);
}
if let result = task.result {
NSLog("Download Starting!")
// Do something with uploadTask.
}
return nil;
}