Trabajo con S3 y almacenamiento en la nube en Swift (iOS/macOS)
En el desarrollo moderno para iOS y macOS, a menudo surge la necesidad de integrar almacenamiento en la nube compatible con el protocolo Amazon S3 (Simple Storage Service). Puede ser tanto el AWS S3 oficial como soluciones self-hosted como MinIO o DigitalOcean Spaces. Para Swift existe una potente herramienta: la librería AWSS3 del AWS SDK for Swift, que permite gestionar fácilmente objetos en buckets: cargar, descargar, eliminar y obtener metadatos.
En este artículo, analizaremos cómo configurar AWSS3 en un proyecto, realizar operaciones básicas con archivos y manejar posibles errores. El material es adecuado para aplicaciones iOS y macOS escritas en Swift 5.7+.
Instalación y configuración de AWSS3
Para trabajar con AWSS3, es necesario agregar la dependencia mediante Swift Package Manager (SPM) o CocoaPods. Consideremos SPM, la forma más moderna.
- Abra Xcode, vaya a
File → Add Packages... - Ingrese la URL del repositorio:
https://github.com/awslabs/aws-sdk-swift.git - Seleccione el paquete
AWSS3e indique la versión (se recomienda la última estable). - Agregue el paquete al target deseado.
Después de la instalación, importe el módulo en el archivo donde se trabajará con el almacenamiento:
import AWSS3Configuración del cliente S3
Para conectarse a un almacenamiento compatible con S3, es necesario crear una configuración con las credenciales (Access Key, Secret Key) y un endpoint. Para AWS S3, el endpoint no es necesario especificarlo — el SDK determinará automáticamente la región. Para MinIO u otros servicios, el endpoint es obligatorio.
// Ejemplo de configuración 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 // u otra región
let configuration = AWSS3Configuration( region: region, endpoint: endpoint, credentialsProvider: .static(credentials), useFIPS: false, useDualStack: false)
let s3Client = try await AWSS3Client(configuration: configuration)Para AWS S3, la configuración es más simple — basta con indicar la región y obtener las credenciales desde un rol IAM o variables de entorno:
let configuration = AWSS3Configuration( region: .useast1, credentialsProvider: .default)let s3Client = try await AWSS3Client(configuration: configuration)Operaciones básicas con objetos S3
1. Carga de archivo (Upload)
Para cargar datos en un bucket, use el método putObject. Los datos pueden ser Data, String o un flujo.
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("Archivo cargado. ETag: \\(response.eTag ?? "desconocido")")}2. Descarga de archivo (Download)
Para obtener un 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: "Cuerpo de respuesta vacío"]) } let data = try await body.readData() return data}3. Obtención de la lista de objetos en el bucket
El método listObjectsV2 devuelve una lista de claves (nombres de archivos) en el bucket:
También en la biblioteca
Migraciones de bases de datos en C++: revisión de herramientas y bibliotecas
Limitación de Tasa en TypeScript: bibliotecas, herramientas y ejemplos de implementación
Inertia.js para PHP: guía completa con ejemplos prácticos
Elasticsearch .NET para C#: guía completa con ejemplos prácticos
Cliente Redis (Jedis) para Java: guía completa con ejemplos
Recommendations