gRPC لـ Swift (iOS/macOS): المكتبات والأمثلة
gRPC هو إطار عمل حديث عالي الأداء للاستدعاء عن بُعد للإجراءات (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. في نظام Swift البيئي (iOS/macOS)، يتم تنفيذ gRPC من خلال مكتبة gRPC-Swift المبنية فوق إطار العمل غير المتزامن SwiftNIO. يتيح ذلك إنشاء تطبيقات عميل وخادم بلغة Swift مع دعم نقل البيانات المتدفقة، المهلات الزمنية والمصادقة.
المكتبات الرئيسية لـ gRPC في Swift
- gRPC-Swift — المكتبة الرسمية من Apple و Google. توفر واجهة برمجة تطبيقات (API) لإنشاء خوادم وعملاء gRPC. تدعم التدفقات الأحادية، من الخادم، من العميل والثنائية الاتجاه.
- SwiftNIO — إطار عمل غير متزامن منخفض المستوى للاتصالات الشبكية، والذي يعتمد عليه gRPC-Swift.
- protoc-gen-swiftgrpc — إضافة لمترجم protoc، تقوم بتوليد كود Swift من ملفات .proto.
- SwiftProtobuf — مكتبة للعمل مع رسائل protobuf في Swift (التسلسل/إلغاء التسلسل).
التثبيت عبر 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