Trabalhando com S3 e armazenamentos em nuvem em Swift (iOS/macOS)
No desenvolvimento moderno para iOS e macOS, surge frequentemente a necessidade de integrar armazenamentos em nuvem compatíveis com o protocolo Amazon S3 (Simple Storage Service). Pode ser tanto o AWS S3 oficial quanto soluções self-hosted como MinIO ou DigitalOcean Spaces. Para Swift, existe uma ferramenta poderosa — a biblioteca AWSS3 do AWS SDK for Swift, que permite gerenciar facilmente objetos em buckets: fazer upload, download, excluir e obter metadados.
Neste artigo, vamos abordar como configurar o AWSS3 em um projeto, realizar operações básicas com arquivos e tratar possíveis erros. O material é adequado para aplicativos iOS e macOS escritos em Swift 5.7+.
Instalação e configuração do AWSS3
Para trabalhar com o AWSS3, é necessário adicionar a dependência via Swift Package Manager (SPM) ou CocoaPods. Vamos considerar o SPM — a forma mais moderna.
- Abra o Xcode, vá em
File → Add Packages... - Insira a URL do repositório:
https://github.com/awslabs/aws-sdk-swift.git - Selecione o pacote
AWSS3e especifique a versão (recomenda-se a última estável). - Adicione o pacote ao target desejado.
Após a instalação, importe o módulo no arquivo onde ocorrerá o trabalho com o armazenamento:
import AWSS3Configuração do cliente S3
Para conectar-se a um armazenamento compatível com S3, é necessário criar uma configuração com credenciais (Access Key, Secret Key) e endpoint. Para AWS S3, o endpoint pode ser omitido — o SDK determina automaticamente a região. Para MinIO ou outros serviços, o endpoint é obrigatório.
// Exemplo de configuração para MinIO (servidor local)let endpoint = "http://localhost:9000"let accessKey = "YOUR_ACCESS_KEY"let secretKey = "YOUR_SECRET_KEY"
let credentials = AWSCredentials(accessKey: accessKey, secretAccessKey: secretKey)let region = AWSRegion.useast1 // ou outra região
let configuration = AWSS3Configuration( region: region, endpoint: endpoint, credentialsProvider: .static(credentials), useFIPS: false, useDualStack: false)
let s3Client = try await AWSS3Client(configuration: configuration)Para AWS S3, a configuração é mais simples — basta especificar a região e obter as credenciais de uma IAM role ou variáveis de ambiente:
let configuration = AWSS3Configuration( region: .useast1, credentialsProvider: .default)let s3Client = try await AWSS3Client(configuration: configuration)Operações principais com objetos S3
1. Upload de arquivo
Para fazer upload de dados para um bucket, use o método putObject. Os dados podem ser Data, String ou um stream.
func uploadFile(bucket: String, key: String, data: Data) async throws { let putObjectInput = PutObjectInput( body: .data(data), bucket: bucket, key: key ) let response = try await s3Client.putObject(input: putObjectInput) print("Arquivo enviado. ETag: \\(response.eTag ?? "desconhecido")")}2. Download de arquivo
Para obter um objeto, use getObject:
func downloadFile(bucket: String, key: String) async throws -> Data { let getObjectInput = GetObjectInput( bucket: bucket, key: key ) let response = try await s3Client.getObject(input: getObjectInput) guard let body = response.body else { throw NSError(domain: "S3Error", code: -1, userInfo: [NSLocalizedDescriptionKey: "Corpo da resposta vazio"]) } let data = try await body.readData() return data}3. Listagem de objetos em um bucket
O método listObjectsV2 retorna uma lista de chaves (nomes de arquivos) no bucket:
Também na biblioteca
Serialização de objetos em Go (Golang): JSON, XML, Gob e Protocol Buffers
Trabalhando com CSV em Rust: biblioteca csv e exemplos práticos
Trabalhando com Markdown em Rust: bibliotecas e ferramentas
AutoMapper para C# (.NET): guia completo com exemplos
Trabalhando com XML em Rust: bibliotecas roxmltree, quick-xml e serde-xml-rs
Recommendations