Работа с S3 и облачными хранилищами в Swift (iOS/macOS): AWSS3 и Amplify

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с S3 и облачными хранилищами в Swift (iOS/macOS)

В современной разработке мобильных и десктопных приложений на Swift часто возникает необходимость хранить и передавать большие объёмы данных: изображения, видео, документы пользователей. Amazon S3 (Simple Storage Service) — одно из самых популярных облачных решений для этих задач. В этой статье мы разберём, как интегрировать S3 в приложения на Swift для iOS и macOS с помощью официального SDK от Amazon — AWSS3, а также рассмотрим более высокоуровневый подход через фреймворк Amplify.

Зачем нужен S3 в Swift-приложениях?

S3 предоставляет масштабируемое, безопасное и недорогое хранилище объектов. Использование S3 в Swift позволяет:

  • Выгрузить нагрузку по хранению файлов с устройства в облако.
  • Обеспечить доступ к данным с любого устройства пользователя.
  • Использовать встроенные механизмы шифрования и контроля доступа.
  • Интегрироваться с другими сервисами AWS (Lambda, Cognito, CloudFront).

Настройка окружения

Для начала работы потребуется:

  • Аккаунт AWS и созданный S3 бакет.
  • Xcode 14+ и проект на Swift (iOS 15+ / macOS 12+).
  • Установка зависимостей через Swift Package Manager (SPM).

Установка AWSS3 через SPM

Добавьте пакет в Package.swift или через интерфейс Xcode:

// File → Add Packages → поиск: https://github.com/aws-amplify/aws-sdk-ios-spm
// Выберите "AWSS3" в спите продуктов.

В коде импортируйте библиотеку:

import AWSS3

Базовый пример: загрузка файла в S3

Рассмотрим простейший сценарий — загрузка изображения из галереи пользователя. Для аутентификации используется Cognito Identity Pool, но в тестовом режиме можно передать ключи напрямую (не рекомендуется для продакшена).

Конфигурация сервиса

let credentialsProvider = AWSStaticCredentialsProvider(
    accessKey: "YOUR_ACCESS_KEY",
    secretKey: "YOUR_SECRET_KEY"
)
let configuration = AWSServiceConfiguration(
    region: .USEast1,
    credentialsProvider: credentialsProvider
)
AWSServiceManager.default().defaultServiceConfiguration = configuration

Загрузка файла (upload)

func uploadImageToS3(imageData: Data, bucketName: String, key: String) {
    let request = AWSS3TransferManagerUploadRequest()!
    request.bucket = bucketName
    request.key = key
    request.body = imageData
    request.contentLength = Int64(imageData.count)

    let transferManager = AWSS3TransferManager.default()
    transferManager?.upload(request).continueWith { task -> Any? in
        if let error = task.error {
            print("Ошибка загрузки: \(error.localizedDescription)")
        } else {
            print("Файл успешно загружен: \(bucketName)/\(key)")
        }
        return nil
    }
}

Скачивание файла (download)

func downloadFromS3(bucketName: String, key: String, localURL: URL) {
    let request = AWSS3TransferManagerDownloadRequest()!
    request.bucket = bucketName
    request.key = key
    request.downloadingFileURL = localURL

    let transferManager = AWSS3TransferManager.default()
    transferManager?.download(request).continueWith { task -> Any? in
        if let error = task.error {
            print("Ошибка скачивания: \(error.localizedDescription)")
        } else {
            print("Файл сохранён в \(localURL.path)")
        }
        return nil
    }
}

Использование Amplify Storage для S3

Amplify предоставляет более простой API, скрывая детали работы с S3. Он требует предварительной настройки через CLI или файл amplifyconfiguration.json.

Установка Amplify

// Добавьте пакет: https://github.com/aws-amplify/amplify-ios
// Импортируйте:
import Amplify
import AWSS3StoragePlugin

Инициализация и загрузка

func configureAmplify() {
    do {
        try Amplify.add(plugin: AWSS3StoragePlugin())
        try Amplify.configure()
        print("Amplify настроен")
    } catch {
        print("Ошибка конфигурации Amplify: \(error)")
    }
}

func uploadWithAmplify(data: Data, key: String) {
    Amplify.Storage.uploadData(key: key, data: data) { event in
        switch event {
        case .success(let result):
            print("Загрузка завершена: \(result)")
        case .failure(let error):
            print("Ошибка: \(error.errorDescription)")
        default:
            break
        }
    }
}

Работа

Рекомендаций