> For the complete documentation index, see [llms.txt](https://bayun.gitbook.io/bayun-awss3-wrapper-ios-programming-guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bayun.gitbook.io/bayun-awss3-wrapper-ios-programming-guide/secure_amazon_s3_transfer_utility/secure_amazon_s3_transfer_utility-1.md).

# 5.2 Transferring Data using Bayun's SecureAWSS3TransferUtility

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.

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
  completionHandler:(void (^)())completionHandler {
    /* Store the completion handler.*/
    [SecureAWSS3TransferUtility interceptApplication:application handleEventsForBackgroundURLSession:identifier completionHandler:completionHandler];
}

```

{% endtab %}

{% tab title="Swift" %}

```swift
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
       SecureAWSS3TransferUtility.interceptApplication(application, handleEventsForBackgroundURLSession:identifier , completionHandler:completionHandler)
    }    
```

{% endtab %}
{% endtabs %}

## 5.2.2 Uploading a file using SecureAWSS3TransferUtility

To upload a file call `uploadFile:bucket:key:contentType:expression:completionHander:` on `SecureAWSS3TransferUtility`:

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
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;
}];
```

{% endtab %}

{% tab title="Swift" %}

```swift
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;
}
```

{% endtab %}
{% endtabs %}

### 5.2.3 Downloading to a File using SecureAWSS3TransferUtility

Here are code snippets you can use for downloading to a file.

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
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;
}];
```

{% endtab %}

{% tab title="Swift" %}

```swift
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;
}
```

{% endtab %}
{% endtabs %}
