# 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bayun.gitbook.io/bayun-awss3-wrapper-ios-programming-guide/secure_amazon_s3_transfer_utility/secure_amazon_s3_transfer_utility-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
