gRPC 用于 Swift (iOS/macOS):库、配置和代码示例

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

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

开始课程

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



gRPC 是一个由 Google 开发的现代高性能远程过程调用 (RPC) 框架。它使用 Protocol Buffers (protobuf) 进行数据序列化,并使用 HTTP/2 进行传输。在 Swift (iOS/macOS) 生态系统中,gRPC 通过基于异步框架 SwiftNIO 构建的 gRPC-Swift 库实现。这使得可以创建支持数据流、超时和身份验证的 Swift 客户端和服务器应用程序。



Swift 中用于 gRPC 的主要库

  • gRPC-Swift — 来自 Apple 和 Google 的官方库。提供用于创建 gRPC 服务器和客户端的 API。支持一元、服务器端、客户端和双向流。
  • SwiftNIO — 用于网络交互的低级异步框架,gRPC-Swift 基于此构建。
  • protoc-gen-swiftgrpc — protoc 编译器的插件,用于从 .proto 文件生成 Swift 代码。
  • SwiftProtobuf — 用于在 Swift 中处理 protobuf 消息(序列化/反序列化)的库。


通过 Swift Package Manager 安装

将依赖项添加到项目的 Package.swift 中:

// swift-tools-version:5.7import PackageDescription

let package = Package( name: "gRPCExample", platforms: [.macOS(.v12), .iOS(.v15)], 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.21.0") ], targets: [ .executableTarget( name: "gRPCExample", dependencies: [ .product(name: "GRPC", package: "grpc-swift"), .product(name: "SwiftProtobuf", package: "swift-protobuf") ] ) ])


创建 .proto 文件

定义服务和消息。示例文件 helloworld.proto:

syntax = "proto3";

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

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


生成 Swift 代码

安装 protoc 和插件:

brew install protobufbrew install swift-protobufbrew install grpc-swift

生成代码:

protoc helloworld.proto \    --proto_path=. \    --swift_out=. \    --grpc-swift_out=.

将创建文件 helloworld.pb.swift 和 helloworld.grpc.swift。



Swift 服务器示例 (macOS)

import GRPCimport NIOimport HelloWorld // 生成的模块

class GreeterProvider: Greeter_GreeterProvider { func sayHello(request: Greeter_HelloRequest, context: StatusOnlyCallContext) -> EventLoopFuture<Greeter_HelloReply> { var reply = Greeter_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 客户端示例 (iOS/macOS)

import GRPCimport NIOimport HelloWorld

let group = PlatformSupport.makeEventLoopGroup(loopCount: 1)defer { try! group.syncShutdownGracefully() }

let channel = try GRPCChannelPool.with( target: .host("localhost", port: 50051), transportSecurity: .plaintext, eventLoopGroup: group)defe

推荐