gRPC لـ Swift (iOS/macOS): المكتبات والأمثلة
\ngRPC هو إطار عمل عالي الأداء للاستدعاء عن بُعد للإجراءات (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. لمنصات Apple (iOS، macOS)، توجد بيئة رسمية Swift gRPC تتيح إنشاء تطبيقات عميل وخادم مع دعم كامل للإمكانيات الحديثة لـ Swift، بما في ذلك async/await.
\n\nالمكتبات والأدوات الرئيسية
\nللعمل مع gRPC في Swift، تُستخدم المكونات التالية:
\n- \n
- gRPC-Swift — الحزمة الرسمية من Google. تتضمن وقت التشغيل، ومولد الكود، ودعم التفاعل بين العميل والخادم. \n
- Swift Protobuf — مكتبة للعمل مع رسائل protobuf. ضرورية لتوليد هياكل Swift من ملفات .proto. \n
- protoc — مترجم Protocol Buffers. لتوليد كود Swift، يلزم المكون الإضافي
protoc-gen-grpc-swiftوprotoc-gen-swift. \n - Swift Package Manager (SPM) — الطريقة الأساسية لدمج التبعيات. \n
التثبيت والإعداد
\nللبدء، أضف التبعيات في Package.swift:
// 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\nكما يجب تثبيت protoc والمكونات الإضافية عبر Homebrew:
brew install protobuf\nbrew install grpc-swift\nbrew install swift-protobuf\n\nمثال لملف .proto
\nلننشئ خدمة بسيطة للترحيب. الملف 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\nقم بتوليد كود Swift باستخدام الأمر:
\nprotoc --swift_out=. --grpc-swift_out=. hello.proto\n\nستظهر الملفات hello.pb.swift و hello.grpc.swift كنتيجة.
جزء الخادم بلغة Swift
\nلننشئ خادم gRPC يعالج طلبات SayHello:
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 = "مرحباً، \\(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("الخادم يعمل على localhost:50051")\ntry server.onClose.wait()\n\nجزء العميل بلغة Swift (مع async/await)
\nبالنسبة لعميل iOS/macOS، من المناسب تنفيذه باستخدام async/await. تأكد من استخدام Swift 5.5+ والهدف الأدنى للنشر iOS 13.0 / macOS 10.15.
\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\