gRPC para Swift (iOS/macOS): bibliotecas e exemplos
gRPC é um framework de alta performance para chamada de procedimentos remotos (RPC), desenvolvido pelo Google. Ele utiliza Protocol Buffers (protobuf) para serialização de dados e HTTP/2 para transporte. Para as plataformas Apple (iOS, macOS), existe o ecossistema oficial Swift gRPC, que permite criar aplicações tanto cliente quanto servidor com suporte completo aos recursos modernos do Swift, incluindo async/await.
Principais bibliotecas e ferramentas
Para trabalhar com gRPC em Swift, são utilizados os seguintes componentes:
- gRPC-Swift — pacote oficial do Google. Inclui runtime, gerador de código e suporte para interação cliente-servidor.
- Swift Protobuf — biblioteca para trabalhar com mensagens protobuf. Necessária para gerar estruturas Swift a partir de arquivos .proto.
- protoc — compilador Protocol Buffers. Para gerar código Swift, são necessários os plugins
protoc-gen-grpc-swifteprotoc-gen-swift. - Swift Package Manager (SPM) — principal forma de integrar dependências.
Instalação e configuração
Para começar, adicione as dependências no 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") ] ) ])Também é necessário instalar o protoc e os plugins via Homebrew:
brew install protobufbrew install grpc-swiftbrew install swift-protobufExemplo de arquivo .proto
Vamos criar um serviço simples de saudação. Arquivo hello.proto:
syntax = "proto3";
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Gere o código Swift com o comando:
protoc --swift_out=. --grpc-swift_out=. hello.protoComo resultado, serão criados os arquivos hello.pb.swift e hello.grpc.swift.
Parte do servidor em Swift
Vamos criar um servidor gRPC que processará as requisições SayHello:
import GRPCimport NIOimport NIOPosix
class GreeterProvider: GreeterProvider { func sayHello(request: HelloRequest, context: StatusOnlyCallContext) -> EventLoopFuture<HelloReply> { var reply = HelloReply() reply.message = "Olá, \\(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 em localhost:50051")try server.onClose.wait()Parte do cliente em Swift (com async/await)
Para iOS/macOS, o cliente pode ser implementado convenientemente usando async/await. Certifique-se de usar Swift 5.5+ e o deployment target mínimo 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() }\