gRPC para Swift (iOS/macOS): bibliotecas y ejemplos
gRPC es un framework de alto rendimiento para llamadas a procedimientos remotos (RPC), desarrollado por Google. Utiliza Protocol Buffers (protobuf) para la serialización de datos y HTTP/2 para el transporte. Para las plataformas Apple (iOS, macOS), existe un ecosistema oficial Swift gRPC que permite crear aplicaciones tanto cliente como servidor con soporte completo de las capacidades modernas de Swift, incluyendo async/await.
Bibliotecas y herramientas principales
Para trabajar con gRPC en Swift se utilizan los siguientes componentes:
- gRPC-Swift — paquete oficial de Google. Incluye runtime, generador de código y soporte para interacción cliente-servidor.
- Swift Protobuf — biblioteca para trabajar con mensajes protobuf. Necesaria para generar estructuras Swift a partir de archivos .proto.
- protoc — compilador de Protocol Buffers. Para generar código Swift se requieren los plugins
protoc-gen-grpc-swiftyprotoc-gen-swift. - Swift Package Manager (SPM) — la forma principal de integrar dependencias.
Instalación y configuración
Para empezar, agregue las dependencias en Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "GRPCExample", dependencies: [ .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.21.0"), .package(url: "https://github.com/apple/swift-protobuf.git", from: "1.26.0") ], targets: [ .executableTarget( name: "GRPCExample", dependencies: [ .product(name: "GRPC", package: "grpc-swift"), .product(name: "SwiftProtobuf", package: "swift-protobuf") ] ) ])También es necesario instalar protoc y los plugins mediante Homebrew:
brew install protobufbrew install grpc-swiftbrew install swift-protobufEjemplo de archivo .proto
Creemos un servicio simple de saludo. Archivo hello.proto:
syntax = "proto3";
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Genere el código Swift con el comando:
protoc --swift_out=. --grpc-swift_out=. hello.protoComo resultado, aparecerán los archivos hello.pb.swift y hello.grpc.swift.
Parte del servidor en Swift
Creemos un servidor gRPC que procese las solicitudes SayHello:
import GRPCimport NIOimport NIOPosix
class GreeterProvider: GreeterProvider { func sayHello(request: HelloRequest, context: StatusOnlyCallContext) -> EventLoopFuture<HelloReply> { var reply = HelloReply() reply.message = "¡Hola, \\(request.name)!" return context.eventLoop.makeSucceededFuture(reply) }}
let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)defer { try! group.syncShutdownGracefully() }
let server = try Server.insecure(group: group) .withServiceProviders([GreeterProvider()]) .bind(host: "localhost", port: 50051) .wait()
print("Servidor iniciado en localhost:50051")try server.onClose.wait()Parte del cliente en Swift (con async/await)
Para iOS/macOS, el cliente se implementa convenientemente usando async/await. Asegúrese de usar Swift 5.5+ y un objetivo de implementación mínimo de iOS 13.0 / macOS 10.15.
import GRPCimport NIOimport NIOPosiximport SwiftProtobuf
func greet(name: String) async throws -> String { let group = PlatformSupport.makeEventLoopGroup(loopCount: 1) defer { try? group.syncShutdownGracefully() }\