gRPC for Swift (iOS/macOS): 库、配置和示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

gRPC for Swift (iOS/macOS):库和示例

gRPC 是一个由 Google 开发的高性能远程过程调用 (RPC) 框架。它使用 Protocol Buffers (protobuf) 进行数据序列化,并使用 HTTP/2 进行传输。对于 Apple 平台(iOS、macOS),存在一个官方的 Swift gRPC 生态系统,它允许创建客户端和服务器应用程序,并完全支持 Swift 的现代特性,包括 async/await。



主要库和工具

在 Swift 中使用 gRPC 需要以下组件:

  • gRPC-Swift — Google 的官方包。包括运行时、代码生成器以及对客户端-服务器交互的支持。
  • Swift Protobuf — 用于处理 protobuf 消息的库。需要从 .proto 文件生成 Swift 结构。
  • protoc — Protocol Buffers 编译器。要生成 Swift 代码,需要 protoc-gen-grpc-swift 和 protoc-gen-swift 插件。
  • Swift Package Manager (SPM) — 集成依赖项的主要方式。


安装和配置

首先,将依赖项添加到 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") ] ) ])


还需要通过 Homebrew 安装 protoc 和插件:

brew install protobufbrew install grpc-swiftbrew install swift-protobuf


.proto 文件示例

创建一个简单的问候服务。文件 hello.proto:

syntax = "proto3";

service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


使用以下命令生成 Swift 代码:

protoc --swift_out=. --grpc-swift_out=. hello.proto


结果将生成 hello.pb.swift 和 hello.grpc.swift 文件。



Swift 服务器端

创建一个处理 SayHello 请求的 gRPC 服务器:

import GRPCimport NIOimport NIOPosix

class GreeterProvider: GreeterProvider { func sayHello(request: HelloRequest, context: StatusOnlyCallContext) -> EventLoopFuture<HelloReply> { var reply = HelloReply() reply.message = "你好,\\(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("服务器已启动在 localhost:50051")try server.onClose.wait()


Swift 客户端(使用 async/await)

对于 iOS/macOS 客户端,使用 async/await 实现很方便。请确保使用 Swift 5.5+ 以及最低部署目标 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() }\

推荐