نقل البيانات إلى حزمة تطوير البرامج Swift لنظام التشغيل iOS
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يجب أن تكون عملية نقل البيانات من Places SDK for iOS إلى Places Swift SDK for iOS مباشرة ويمكن إجراؤها بشكل تدريجي. بما أنّ البُنى في Places Swift SDK لنظام التشغيل iOS غير متوافقة مع نظيراتها المستندة إلى Objective-C، ننصحك بنقل أجزاء منفصلة من الوظائف استنادًا إلى استخدامات واجهات برمجة التطبيقات في GMSPlacesClient.
إضافة حزمة Places Swift SDK لنظام التشغيل iOS إلى مشروعك
يجب اتّباع الخطوات التالية لاستخدام Places Swift SDK لأجهزة iOS:
على سبيل المثال، لنفترض أنّ تطبيقًا يستخدم Places SDK for iOS يتلقّى اقتراحات إكمال تلقائي استنادًا إلى إدخال نصي، ثم يسترد تفاصيل اقتراح المكان الأول. باستخدام حزمة تطوير البرامج Places SDK for iOS، قد يبدو الرمز الحالي على النحو التالي:
لتحديث الرمز والاستفادة من إمكانات حزمة SDK الجديدة، عليك استبدال GMSPlacesClient بـ PlacesClient. بالإضافة إلى ذلك، تم تغيير أسماء المَعلمات في الطريقة الجديدة، لذا عليك تعديل المَعلمة إلى from بدلاً من with. أخيرًا، تستخدم حزمة Places Swift SDK الفئة AutocompleteRequest التي تمت ترقيتها.
الرمز المعدَّل
// Initialize Places Swift Client.let_=PlacesClient.provideAPIKey(apiKey)letplacesSwiftClient=PlacesClient.shared
يمكنك البدء بتعديل مسار طلب الإكمال التلقائي. يستخدم الرمز القديم دالة ردّ لطلب اقتراحات الإكمال التلقائي، بينما يستخدم الرمز الجديد نمط switch/await. يمكن أن تضيف عمليات معاودة الاتصال تعقيدًا إلى بنية الرمز البرمجي والتعامل مع الأخطاء. تتيح حزمة تطوير البرامج (SDK) الجديدة الخاصة بـ Places API لنظام التشغيل Swift تنفيذ عمليات متزامنة، ما يسهّل العمليات غير المتزامنة.
// Initialize Places Swift Client.let_=PlacesClient.provideAPIKey(apiKey)letplacesSwiftClient=PlacesClient.shared// Fetch Autocomplete Request.letcenter=CLLocation(latitude:37.3913916,longitude:-122.0879074)letnorthEast=CLLocationCoordinate2DMake(37.388162,-122.088137)letsouthWest=CLLocationCoordinate2DMake(37.395804,-122.077023)letbias=RectangularCoordinateRegion(northEast:northEast,southWest:southWest)letfilter=AutocompleteFilter(types:[.restaurant],origin:center,coordinateRegionBias:bias)letautocompleteRequest=AutocompleteRequest(query:"Sicilian piz",filter:filter)letplaceID:StringswitchawaitplacesSwiftClient.fetchAutocompleteSuggestions(with:autocompleteRequest){case.success(letresults):switchresults.first{case.place(letplaceSuggestion):placeID=placeSuggestion.placeIDcase.none:fallthrough@unknowndefault:return}case.failure(letplacesError):print("Autocomplete error: \(placesError)")return}// Initialize Places Client.GMSPlacesClient.provideAPIKey(apiKey)letplacesClient=GMSPlacesClient.shared()// Fetch Place Request.letmyProperties=[GMSPlaceProperty.name,GMSPlaceProperty.website].map{$0.rawValue}letfetchPlaceRequest=GMSFetchPlaceRequest(placeID:placeID,placeProperties:myProperties,sessionToken:nil)placesClient.fetchPlace(with:fetchPlaceRequest){(place:GMSPlace?,error:Error?)inguardletplace,error==nilelse{return}print("Place found: \(String(describing:place.name)); \(String(describing:place.website))")}
تعديل أسماء الطرق والفئات
أخيرًا، أكمِل عملية نقل البيانات من خلال إعادة تصميم الرمز fetchPlace وإزالة كل من عملية تهيئة GMSPlacesClient وتعريف GMSPlaceProperty. في حزمة تطوير البرامج (SDK) الخاصة بخدمة "أماكن Google" لنظام التشغيل Swift، تم تعديل أسماء الطرق والفئات لإزالة البادئة "GMS"، ويجب تعديلها وفقًا لذلك، على سبيل المثال: تصبح قيمة GMSFetchPlaceRequest هي FetchPlaceRequest.
التعامل مع الأنواع
تستخدم طريقة fetchPlace الجديدة معالجة محسّنة للأنواع. في حين كان الرمز القديم يتطلّب تمرير القيم الأولية للسمة، لا يتطلّب الرمز الجديد من المطوّرين جلب القيم الأولية بشكل صريح هنا، ما يؤدي إلى تحسين الإيجاز وسهولة القراءة.
التزامن
بالإضافة إلى ذلك، تتيح الطريقة الجديدة تنفيذ عمليات متزامنة، ما يسمح باستبدال دالة الرجوع في placesClient.fetchPlace بنمط switch/await في placesSwiftClient.fetchPlace.
// Initialize Places Swift Client.let_=PlacesClient.provideAPIKey(apiKey)letplacesSwiftClient=PlacesClient.shared// Fetch Autocomplete Request.letcenter=CLLocation(latitude:37.3913916,longitude:-122.0879074)letnorthEast=CLLocationCoordinate2DMake(37.388162,-122.088137)letsouthWest=CLLocationCoordinate2DMake(37.395804,-122.077023)letbias=RectangularCoordinateRegion(northEast:northEast,southWest:southWest)letfilter=AutocompleteFilter(types:[.restaurant],origin:center,coordinateRegionBias:bias)letautocompleteRequest=AutocompleteRequest(query:"Sicilian piz",filter:filter)letplaceID:StringswitchawaitplacesSwiftClient.fetchAutocompleteSuggestions(with:autocompleteRequest){case.success(letresults):switchresults.first{case.place(letplaceSuggestion):placeID=placeSuggestion.placeIDcase.none:fallthrough@unknowndefault:return}case.failure(letplacesError):print("Autocomplete error: \(placesError)")return}// Fetch Place Request.letfetchPlaceRequest=FetchPlaceRequest(placeID:placeID,placeProperties:[.displayName,.websiteURL])switchawaitplacesSwiftClient.fetchPlace(with:fetchPlaceRequest){case.success(letplace):print("Place found: \(place.displayName): \(String(describing:place.description))")case.failure(letplacesError):print("Place not found: \(placeID); \(placesError)")}
تاريخ التعديل الأخير: 2025-09-05 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-09-05 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["Migrating from Places SDK for iOS to\nPlaces Swift SDK for iOS should be straightforward and can be done\nincrementally. Since structs in the Places Swift SDK for iOS are not\ncompatible with their Objective-C based counterparts, we recommend migrating\ndiscrete chunks of functionality based on uses of APIs in GMSPlacesClient.\n\nAdd the Places Swift SDK for iOS to your project\n\nThe following steps are required to use Places Swift SDK for iOS:\n\n1. Enable the [Places API\n (New)](/maps/documentation/places/ios-sdk/cloud-setup#enabling-apis).\n2. Add the [Places Swift SDK](/maps/documentation/places/ios-sdk/config#googleplacesswift)\n to your dependencies. You can choose to install `GooglePlaces`,\n `GooglePlacesSwift`, or both.\n\n | **Note:** The GitHub URL to access Google Places Swift has changed. If you are updating a version of GooglePlacesSwift that was accessed through the old URL, https://github.com/googlemaps/ios-places-swift-sdk, remove it from your Xcode's package dependencies section.\n3. Initialize the Places client with\n [`PlacesClient`](/maps/documentation/places/ios-sdk/config#googleplacesswift_2).\n\nStep-by-step migration example\n\nAs an example, suppose an app using the Places SDK for iOS\nreceives autocomplete suggestions based on a text input, then fetches the\ndetails of the first place suggestion. Using\nPlaces SDK for iOS, the existing code might look something\nlike the following: \n\n // Initialize Places Client.\n GMSPlacesClient.provideAPIKey(apiKey)\n let client = GMSPlacesClient.shared()\n\n // Fetch Autocomplete Request.\n let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)\n let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)\n let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)\n\n let filter = GMSAutocompleteFilter()\n filter.types = [kGMSPlaceTypeRestaurant]\n filter.origin = center\n filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest)\n\n let request = GMSAutocompleteRequest(query: \"Sicilian piz\")\n request.filter = filter\n\n client.fetchAutocompleteSuggestions(from: request) { (results, error) in\n guard let results, error == nil else {\n print(\"Autocomplete error: \\\\(String(describing: error))\")\n return\n }\n // Fetch Place Request.\n guard let placeID = results.first?.placeSuggestion?.placeID else { return }\n let myProperties = \\[GMSPlaceProperty.name, GMSPlaceProperty.website\\].map {$0.rawValue}\n let fetchPlaceRequest = GMSFetchPlaceRequest(placeID: placeID, placeProperties: myProperties, sessionToken: nil)\n client.fetchPlace(with: fetchPlaceRequest) { (place: GMSPlace?, error: Error?) in\n guard let place, error == nil else { return }\n print(\"Place found: \\\\(String(describing: place.name)); \\\\(String(describing: place.website))\")\n }\n }\n\nUpdate the Places Client initializer\n\nTo modernize the code and take advantage of the new SDK's capabilities, you'll\nneed to replace the GMSPlacesClient with the PlacesClient. Additionally, the\nparameter names are changed in the new method, so you'll need to update the\nparameter to `from` instead of `with`. Finally, the\nPlaces Swift SDK uses the upgraded\n[AutocompleteRequest](/maps/documentation/places/ios-sdk/reference/swift/Structs/AutocompleteRequest). \n\nUpdated code \n\n // Initialize Places Swift Client.\n let _ = PlacesClient.provideAPIKey(apiKey)\n let placesSwiftClient = PlacesClient.shared\n\nOriginal code \n\n // Initialize Places Client.\n GMSPlacesClient.provideAPIKey(apiKey)\n let client = GMSPlacesClient.shared()\n\nUpdate the autocomplete request\n\nYou could begin by updating the autocomplete request flow. The old code uses a\ncallback to request autocomplete suggestions, while the new code employs a\n`switch`/`await` pattern. Callbacks can add complexity to code structure and\nerror handling. The new Places Swift SDK supports concurrency,\nwhich simplifies asynchronous operations. \n\n // Initialize Places Swift Client.\n let _ = PlacesClient.provideAPIKey(apiKey)\n let placesSwiftClient = PlacesClient.shared\n\n // Fetch Autocomplete Request.\n let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)\n let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)\n let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)\n\n let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)\n let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)\n\n let autocompleteRequest = AutocompleteRequest(query: \"Sicilian piz\", filter: filter)\n let placeID: String\n switch await placesSwiftClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {\n case .success(let results):\n switch results.first {\n case .place(let placeSuggestion):\n placeID = placeSuggestion.placeID\n case .none:\n fallthrough\n @unknown default:\n return\n }\n case .failure(let placesError):\n print(\"Autocomplete error: \\\\(placesError)\")\n return\n }\n\n // Initialize Places Client.\n GMSPlacesClient.provideAPIKey(apiKey)\n let placesClient = GMSPlacesClient.shared()\n\n // Fetch Place Request.\n let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.website].map {$0.rawValue}\n\n let fetchPlaceRequest = GMSFetchPlaceRequest(placeID: placeID, placeProperties: myProperties, sessionToken: nil)\n\n placesClient.fetchPlace(with: fetchPlaceRequest) { (place: GMSPlace?, error: Error?) in\n guard let place, error == nil else { return }\n print(\"Place found: \\(String(describing: place.name)); \\(String(describing: place.website))\")\n }\n\nUpdate method and class names\n\nFinally, complete the migration by refactoring the `fetchPlace` code and\nremoving both the `GMSPlacesClient` initialization and `GMSPlaceProperty`\ndeclaration. In Places Swift SDK, the method and classnames\nhave been updated to remove the \"GMS\" prefix, and must be updated accordingly;\ne.g., `GMSFetchPlaceRequest` becomes `FetchPlaceRequest`.\n\nType-handling\n\nThe new `fetchPlace` method uses improved type handling. While the old code\nrequired passing the property's raw values, the new code doesn't require\ndevelopers to explicitly fetch raw values here, thereby improving concision and\nreadability.\n\nConcurrency\n\nAdditionally, the new method supports concurrency, allowing for replacing the\ncallback in `placesClient.fetchPlace` with a `switch`/`await` pattern in\n`placesSwiftClient.fetchPlace`. \n\n // Initialize Places Swift Client.\n let _ = PlacesClient.provideAPIKey(apiKey)\n let placesSwiftClient = PlacesClient.shared\n\n // Fetch Autocomplete Request.\n let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)\n let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)\n let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)\n\n let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)\n let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)\n\n let autocompleteRequest = AutocompleteRequest(query: \"Sicilian piz\", filter: filter)\n let placeID: String\n switch await placesSwiftClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {\n case .success(let results):\n switch results.first {\n case .place(let placeSuggestion):\n placeID = placeSuggestion.placeID\n case .none:\n fallthrough\n @unknown default:\n return\n }\n case .failure(let placesError):\n print(\"Autocomplete error: \\(placesError)\")\n return\n }\n\n // Fetch Place Request.\n let fetchPlaceRequest = FetchPlaceRequest(placeID: placeID, placeProperties: \\[.displayName, .websiteURL\\])\n switch await placesSwiftClient.fetchPlace(with: fetchPlaceRequest) {\n case .success(let place):\n print(\"Place found: \\\\(place.displayName): \\\\(String(describing: place.description))\")\n case .failure(let placesError):\n print(\"Place not found: \\\\(placeID); \\\\(placesError)\")\n }\n\nStay up-to-date\n\nVisit the [release notes page for Places Swift SDK for iOS](/maps/documentation/places/ios-sdk/places-swift-release-notes) to learn\nabout new features and changes."]]