gRPC für Swift (iOS/macOS): Bibliotheken und Beispiele
\ngRPC ist ein von Google entwickeltes Hochleistungs-Framework für entfernte Prozeduraufrufe (RPC). Es verwendet Protocol Buffers (protobuf) zur Datenserialisierung und HTTP/2 als Transportprotokoll. Für Apple-Plattformen (iOS, macOS) gibt es das offizielle Ökosystem Swift gRPC, mit dem sowohl Client- als auch Serveranwendungen mit vollständiger Unterstützung moderner Swift-Funktionen, einschließlich async/await, erstellt werden können.
\n\nWichtige Bibliotheken und Werkzeuge
\nFür die Arbeit mit gRPC in Swift werden die folgenden Komponenten verwendet:
\n- \n
- gRPC-Swift — das offizielle Paket von Google. Es enthält Laufzeitumgebung, Codegenerator und Unterstützung für die Client-Server-Kommunikation. \n
- Swift Protobuf — eine Bibliothek für die Arbeit mit protobuf-Nachrichten. Notwendig zur Generierung von Swift-Strukturen aus .proto-Dateien. \n
- protoc — der Protocol Buffers-Compiler. Für die Generierung von Swift-Code werden die Plugins
protoc-gen-grpc-swiftundprotoc-gen-swiftbenötigt. \n - Swift Package Manager (SPM) — die primäre Methode zur Integration von Abhängigkeiten. \n
Installation und Einrichtung
\nFügen Sie zu Beginn die Abhängigkeiten in Package.swift hinzu:
// swift-tools-version:5.9\nimport PackageDescription\n\nlet package = Package(\n name: "GRPCExample",\n dependencies: [\n .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.21.0"),\n .package(url: "https://github.com/apple/swift-protobuf.git", from: "1.26.0")\n ],\n targets: [\n .executableTarget(\n name: "GRPCExample",\n dependencies: [\n .product(name: "GRPC", package: "grpc-swift"),\n .product(name: "SwiftProtobuf", package: "swift-protobuf")\n ]\n )\n ]\n)\n\nAußerdem müssen protoc und die Plugins über Homebrew installiert werden:
brew install protobuf\nbrew install grpc-swift\nbrew install swift-protobuf\n\nBeispiel einer .proto-Datei
\nErstellen wir einen einfachen Dienst zur Begrüßung. Datei hello.proto:
syntax = "proto3";\n\nservice Greeter {\n rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\nmessage HelloRequest {\n string name = 1;\n}\n\nmessage HelloReply {\n string message = 1;\n}\n\nGenerieren Sie den Swift-Code mit dem Befehl:
\nprotoc --swift_out=. --grpc-swift_out=. hello.proto\n\nAls Ergebnis erscheinen die Dateien hello.pb.swift und hello.grpc.swift.
Serverseite in Swift
\nErstellen wir einen gRPC-Server, der SayHello-Anfragen verarbeitet:
import GRPC\nimport NIO\nimport NIOPosix\n\nclass GreeterProvider: GreeterProvider {\n func sayHello(request: HelloRequest, context: StatusOnlyCallContext) -> EventLoopFuture<HelloReply> {\n var reply = HelloReply()\n reply.message = "Hallo, \\(request.name)!"\n return context.eventLoop.makeSucceededFuture(reply)\n }\n}\n\nlet group = MultiThreadedEventLoopGroup(numberOfThreads: 1)\ndefer { try! group.syncShutdownGracefully() }\n\nlet server = try Server.insecure(group: group)\n .withServiceProviders([GreeterProvider()])\n .bind(host: "localhost", port: 50051)\n .wait()\n\nprint("Server gestartet auf localhost:50051")\ntry server.onClose.wait()\n\nClientseite in Swift (mit async/await)
\nFür iOS/macOS lässt sich der Client bequem mit async/await implementieren. Stellen Sie sicher, dass Sie Swift 5.5+ und als Mindestziel iOS 13.0 / macOS 10.15 verwenden.
\nimport GRPC\nimport NIO\nimport NIOPosix\nimport SwiftProtobuf\n\nfunc greet(name: String) async throws -> String {\n let group = PlatformSupport.makeEventLoopGroup(loopCount: 1)\n defer { try? group.syncShutdownGracefully() }\n\