اختيار المكان الحالي وعرض التفاصيل على خريطة

يوضّح لك هذا البرنامج التعليمي كيفية إنشاء تطبيق iOS من أجل:

  • الحصول على الموقع الجغرافي الحالي للجهاز
  • احصل على قائمة بالأماكن التي يُحتمل أن يكون الجهاز فيها.
  • مطالبة المستخدم بأفضل مطابقة للمكان.
  • عرض علامة على الخريطة.

اتبع هذا البرنامج التعليمي لإنشاء تطبيق iOS باستخدام حزمة SDK للأماكن لنظام التشغيل iOS وحزمة SDK للخرائط لنظام التشغيل iOS وإطار عمل الموقع الجغرافي Apple Core.

جارٍ الحصول على الرمز

استنساخ أو نزِّل حزمة SDK لخرائط Google لنظام التشغيل iOS من GitHub.

إعداد مشروع التطوير

اتبع الخطوات التالية لتثبيت حزمة تطوير برامج الأماكن لنظام التشغيل iOS وحزمة SDK للخرائط لنظام التشغيل iOS:

  1. نزِّل الإصدار 14.0 أو إصدار أحدث من Xcode وثبِّته.
  2. إذا لم يكن لديك تطبيق CocoaPods، يمكنك تثبيته على نظام التشغيل macOS من خلال تنفيذ الأمر التالي من الوحدة الطرفية:
    sudo gem install cocoapods
  3. في الدليل الذي حفظت فيه نموذج المستودع (الحصول على الرمز)، انتقِل إلى الدليل tutorials/current-place-on-map.
  4. شغِّل الأمر pod install. يؤدي ذلك إلى تثبيت واجهات برمجة التطبيقات المحدّدة في Podfile، بالإضافة إلى أي تبعيات قد تكون متوفرة فيها.
  5. عليك تشغيل تطبيق "pod outdated" للمقارنة بين إصدار مجموعة الأدوات المثبَّت وأي تحديثات جديدة. في حال اكتشاف إصدار جديد، يُرجى تشغيل pod update لتحديث Podfile وتثبيت أحدث حزمة تطوير برامج (SDK). لمعرفة مزيد من التفاصيل، يُرجى الاطّلاع على دليل CocoaPods.
  6. افتح current-place-on-map.xcworkspace الخاص بالمشروع لفتحه باستخدام Xcode. يجب استخدام ملف .xcworkspace لفتح المشروع.

للحصول على تعليمات مفصَّلة، يمكنك الاطّلاع على مقالة البدء (خرائط Google) والبدء (الأماكن).

تفعيل واجهات برمجة التطبيقات اللازمة والحصول على مفتاح واجهة برمجة التطبيقات

لإكمال هذا البرنامج التعليمي، تحتاج إلى مفتاح Google API معتمد باستخدام حزمة تطوير البرامج (SDK) لـ "خرائط Google" لنظام التشغيل iOS وPlaces API.

  1. اتّبِع التعليمات الواردة في بدء استخدام "منصة خرائط Google" لإعداد حساب فوترة ومشروع تم تفعيل كلا المنتجين فيه.
  2. اتّبِع التعليمات الواردة في الحصول على مفتاح واجهة برمجة التطبيقات لإنشاء مفتاح واجهة برمجة التطبيقات لمشروع التطوير الذي أعددته سابقًا.

إضافة مفتاح واجهة برمجة التطبيقات إلى تطبيقك

أضِف مفتاح واجهة برمجة التطبيقات إلى AppDelegate.swift على النحو التالي:

  1. تجدر الإشارة إلى أنه تمت إضافة عبارة الاستيراد التالية إلى الملف:
    import GooglePlaces
    import GoogleMaps
  2. عدِّل السطر التالي في طريقة application(_:didFinishLaunchingWithOptions:)، مع استبدال YOUR_API_KEY بمفتاح واجهة برمجة التطبيقات الخاص بك:
    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
    GMSServices.provideAPIKey("YOUR_API_KEY")

إنشاء تطبيقك وتشغيله

  1. وصِّل جهاز iOS بالكمبيوتر، أو اختَر محاكي من القائمة المنبثقة لنظام Xcode.
  2. وإذا كنت تستخدم جهازًا، احرص على تفعيل خدمات الموقع الجغرافي. إذا كنت تستخدم أحد المحاكيات، اختَر موقعًا جغرافيًا من قائمة الميزات.
  3. في Xcode، انقر على خيار القائمة Product/Run (أو على رمز زر التشغيل).
    • ينشئ Xcode التطبيق، ثم يشغِّله على الجهاز أو على المحاكي.
    • من المفترض أن تظهر لك خريطة تحتوي على عدد من العلامات التي تظهر حول موقعك الجغرافي الحالي.

تحرّي الخلل وإصلاحه:

  • إذا لم تظهر لك خريطة، تأكَّد من أنّك حصلت على مفتاح واجهة برمجة التطبيقات وأضفته إلى التطبيق، كما هو موضّح أعلاه. تحقَّق من وحدة تصحيح الأخطاء في Xcode بحثًا عن رسائل خطأ حول مفتاح واجهة برمجة التطبيقات.
  • إذا حظرت مفتاح واجهة برمجة التطبيقات من خلال معرّف حزمة iOS، يمكنك تعديل المفتاح لإضافة معرّف الحزمة للتطبيق: com.google.examples.current-place-on-map.
  • لن يتم عرض الخريطة بشكل صحيح إذا تم رفض طلب الأذونات لخدمات الموقع الجغرافي.
    • إذا كنت تستخدم جهازًا، انتقِل إلى الإعدادات/الإعدادات العامة/الخصوصية/خدمات الموقع الجغرافي وأعِد تفعيل خدمات الموقع الجغرافي.
    • إذا كنت تستخدم محاكيًا، انتقِل إلى المحاكي/إعادة ضبط المحتوى والإعدادات...
    في المرة التالية التي يتم فيها تشغيل التطبيق، تأكَّد من قبول إشعار خدمات الموقع الجغرافي.
  • تأكد من توفر اتصال WiFi أو اتصال جيد بنظام تحديد المواقع العالمي (GPS).
  • إذا تم تشغيل التطبيق ولكن لم يتم عرض أي خريطة، تأكَّد من أنّك عدّلت ملف Info.plist لمشروعك باستخدام الأذونات المناسبة لتحديد الموقع الجغرافي. لمزيد من المعلومات حول التعامل مع الأذونات، راجِع دليل طلب إذن تحديد الموقع الجغرافي في تطبيقك أدناه.
  • استخدِم أدوات تصحيح أخطاء Xcode لعرض السجلّات وتصحيح أخطاء التطبيق.

فهم الرمز

يشرح هذا الجزء من البرنامج التعليمي الأجزاء الأكثر أهمية في تطبيق الموقع الحالي على الخريطة، لمساعدتك في فهم كيفية إنشاء تطبيق مشابه.

يشتمل تطبيق المكان الحالي على الخريطة على وحدتي تحكم في العرض: إحداهما لعرض خريطة توضح المكان الذي اختاره المستخدم حاليًا، والأخرى لتزويد المستخدم بقائمة بالأماكن المحتملة للاختيار من بينها. تجدر الإشارة إلى أن كل وحدة تحكم في الملفات الشخصية تحتوي على المتغيرات نفسها لتتبع قائمة الأماكن المحتملة (likelyPlaces)، وكذلك للإشارة إلى اختيار المستخدم (selectedPlace). ويتم التنقل بين طرق العرض باستخدام الشرائح.

جارٍ طلب إذن تحديد الموقع الجغرافي

يجب أن يطلب تطبيقك من المستخدم الموافقة على استخدام خدمات الموقع الجغرافي. لتنفيذ ذلك، ضمِّن مفتاح NSLocationAlwaysUsageDescription في ملف Info.plist للتطبيق، واضبط قيمة كل مفتاح على سلسلة توضّح طريقة استخدام التطبيق لبيانات الموقع الجغرافي.

إعداد مدير الموقع الجغرافي

استخدِم CLLocationManager للعثور على الموقع الجغرافي الحالي للجهاز وطلب إجراء تحديثات منتظمة عند انتقال الجهاز إلى موقع جديد. يوفر هذا البرنامج التعليمي الرمز الذي تحتاجه للحصول على موقع الجهاز. لمزيد من التفاصيل، راجِع دليل الحصول على الموقع الجغرافي للمستخدم في وثائق مطوّري برامج Apple.

  1. اذكر مدير الموقع والموقع الحالي وعرض الخريطة وعميل الأماكن ومستوى التكبير/التصغير الافتراضي على مستوى الفئة.
  2. Swift

    var locationManager: CLLocationManager!
    var currentLocation: CLLocation?
    var mapView: GMSMapView!
    var placesClient: GMSPlacesClient!
    var preciseLocationZoomLevel: Float = 15.0
    var approximateLocationZoomLevel: Float = 10.0
          

    Objective-C

    CLLocationManager *locationManager;
    CLLocation * _Nullable currentLocation;
    GMSMapView *mapView;
    GMSPlacesClient *placesClient;
    float preciseLocationZoomLevel;
    float approximateLocationZoomLevel;
          
  3. يجب إعداد مدير الموقع الجغرافي وGMSPlacesClient في viewDidLoad().
  4. Swift

    // Initialize the location manager.
    locationManager = CLLocationManager()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestWhenInUseAuthorization()
    locationManager.distanceFilter = 50
    locationManager.startUpdatingLocation()
    locationManager.delegate = self
    
    placesClient = GMSPlacesClient.shared()
          

    Objective-C

    // Initialize the location manager.
    locationManager = [[CLLocationManager alloc] init];
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager requestWhenInUseAuthorization];
    locationManager.distanceFilter = 50;
    [locationManager startUpdatingLocation];
    locationManager.delegate = self;
    
    placesClient = [GMSPlacesClient sharedClient];
          
  5. عليك تعريف المتغيّرات التي تتضمّن قائمة الأماكن المحتملة والمكان الذي اختاره المستخدم.
  6. Swift

    // An array to hold the list of likely places.
    var likelyPlaces: [GMSPlace] = []
    
    // The currently selected place.
    var selectedPlace: GMSPlace?
          

    Objective-C

    // An array to hold the list of likely places.
    NSMutableArray<GMSPlace *> *likelyPlaces;
    
    // The currently selected place.
    GMSPlace * _Nullable selectedPlace;
          
  7. أضِف المفوَّضين للتعامل مع الأحداث لمدير الموقع الجغرافي، باستخدام عبارة الإضافة.
  8. Swift

    // Delegates to handle events for the location manager.
    extension MapViewController: CLLocationManagerDelegate {
    
      // Handle incoming location events.
      func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location: CLLocation = locations.last!
        print("Location: \(location)")
    
        let zoomLevel = locationManager.accuracyAuthorization == .fullAccuracy ? preciseLocationZoomLevel : approximateLocationZoomLevel
        let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude,
                                              longitude: location.coordinate.longitude,
                                              zoom: zoomLevel)
    
        if mapView.isHidden {
          mapView.isHidden = false
          mapView.camera = camera
        } else {
          mapView.animate(to: camera)
        }
    
        listLikelyPlaces()
      }
    
      // Handle authorization for the location manager.
      func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        // Check accuracy authorization
        let accuracy = manager.accuracyAuthorization
        switch accuracy {
        case .fullAccuracy:
            print("Location accuracy is precise.")
        case .reducedAccuracy:
            print("Location accuracy is not precise.")
        @unknown default:
          fatalError()
        }
    
        // Handle authorization status
        switch status {
        case .restricted:
          print("Location access was restricted.")
        case .denied:
          print("User denied access to location.")
          // Display the map using the default location.
          mapView.isHidden = false
        case .notDetermined:
          print("Location status not determined.")
        case .authorizedAlways: fallthrough
        case .authorizedWhenInUse:
          print("Location status is OK.")
        @unknown default:
          fatalError()
        }
      }
    
      // Handle location manager errors.
      func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        locationManager.stopUpdatingLocation()
        print("Error: \(error)")
      }
    }
          

    Objective-C

    // Delegates to handle events for the location manager.
    #pragma mark - CLLocationManagerDelegate
    
    // Handle incoming location events.
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
    {
      CLLocation *location = locations.lastObject;
      NSLog(@"Location: %@", location);
    
      float zoomLevel = locationManager.accuracyAuthorization == CLAccuracyAuthorizationFullAccuracy ? preciseLocationZoomLevel : approximateLocationZoomLevel;
      GMSCameraPosition * camera = [GMSCameraPosition cameraWithLatitude:location.coordinate.latitude
                                                               longitude:location.coordinate.longitude
                                                                    zoom:zoomLevel];
    
      if (mapView.isHidden) {
        mapView.hidden = NO;
        mapView.camera = camera;
      } else {
        [mapView animateToCameraPosition:camera];
      }
    
      [self listLikelyPlaces];
    }
    
    // Handle authorization for the location manager.
    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
    {
      // Check accuracy authorization
      CLAccuracyAuthorization accuracy = manager.accuracyAuthorization;
      switch (accuracy) {
        case CLAccuracyAuthorizationFullAccuracy:
          NSLog(@"Location accuracy is precise.");
          break;
        case CLAccuracyAuthorizationReducedAccuracy:
          NSLog(@"Location accuracy is not precise.");
          break;
      }
    
      // Handle authorization status
      switch (status) {
        case kCLAuthorizationStatusRestricted:
          NSLog(@"Location access was restricted.");
          break;
        case kCLAuthorizationStatusDenied:
          NSLog(@"User denied access to location.");
          // Display the map using the default location.
          mapView.hidden = NO;
        case kCLAuthorizationStatusNotDetermined:
          NSLog(@"Location status not determined.");
        case kCLAuthorizationStatusAuthorizedAlways:
        case kCLAuthorizationStatusAuthorizedWhenInUse:
          NSLog(@"Location status is OK.");
      }
    }
    
    // Handle location manager errors.
    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
      [manager stopUpdatingLocation];
      NSLog(@"Error: %@", error.localizedDescription);
    }
          

إضافة خريطة

يمكنك إنشاء خريطة وإضافتها إلى العرض في viewDidLoad() في وحدة التحكّم في العرض الرئيسي. تظل الخريطة مخفية إلى أن يتم تلقّي تعديل للموقع الجغرافي (تتم معالجة تعديلات الموقع الجغرافي في الإضافة CLLocationManagerDelegate).

Swift

// A default location to use when location permission is not granted.
let defaultLocation = CLLocation(latitude: -33.869405, longitude: 151.199)

// Create a map.
let zoomLevel = locationManager.accuracyAuthorization == .fullAccuracy ? preciseLocationZoomLevel : approximateLocationZoomLevel
let camera = GMSCameraPosition.camera(withLatitude: defaultLocation.coordinate.latitude,
                                      longitude: defaultLocation.coordinate.longitude,
                                      zoom: zoomLevel)
mapView = GMSMapView.map(withFrame: view.bounds, camera: camera)
mapView.settings.myLocationButton = true
mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
mapView.isMyLocationEnabled = true

// Add the map to the view, hide it until we've got a location update.
view.addSubview(mapView)
mapView.isHidden = true
      

Objective-C

// A default location to use when location permission is not granted.
CLLocationCoordinate2D defaultLocation = CLLocationCoordinate2DMake(-33.869405, 151.199);

// Create a map.
float zoomLevel = locationManager.accuracyAuthorization == CLAccuracyAuthorizationFullAccuracy ? preciseLocationZoomLevel : approximateLocationZoomLevel;
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:defaultLocation.latitude
                                                        longitude:defaultLocation.longitude
                                                             zoom:zoomLevel];
mapView = [GMSMapView mapWithFrame:self.view.bounds camera:camera];
mapView.settings.myLocationButton = YES;
mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
mapView.myLocationEnabled = YES;

// Add the map to the view, hide it until we've got a location update.
[self.view addSubview:mapView];
mapView.hidden = YES;
      

مطالبة المستخدم باختيار مكانه الحالي

استخدِم حزمة تطوير برامج الأماكن لنظام التشغيل iOS للحصول على احتمالية الأماكن الخمسة الأولى استنادًا إلى الموقع الجغرافي الحالي للمستخدم، وقدِّم القائمة في UITableView. عندما يختار المستخدم مكانًا، أضف علامة إلى الخريطة.

  1. احصل على قائمة بالأماكن المحتمَلة لتعبئة UITableView، والتي يمكن للمستخدم من خلالها اختيار المكان الذي يقع فيه حاليًا.
  2. Swift

    // Populate the array with the list of likely places.
    func listLikelyPlaces() {
      // Clean up from previous sessions.
      likelyPlaces.removeAll()
    
      let placeFields: GMSPlaceField = [.name, .coordinate]
      placesClient.findPlaceLikelihoodsFromCurrentLocation(withPlaceFields: placeFields) { (placeLikelihoods, error) in
        guard error == nil else {
          // TODO: Handle the error.
          print("Current Place error: \(error!.localizedDescription)")
          return
        }
    
        guard let placeLikelihoods = placeLikelihoods else {
          print("No places found.")
          return
        }
    
        // Get likely places and add to the list.
        for likelihood in placeLikelihoods {
          let place = likelihood.place
          self.likelyPlaces.append(place)
        }
      }
    }
          

    Objective-C

    // Populate the array with the list of likely places.
    - (void) listLikelyPlaces
    {
      // Clean up from previous sessions.
      likelyPlaces = [NSMutableArray array];
    
      GMSPlaceField placeFields = GMSPlaceFieldName | GMSPlaceFieldCoordinate;
      [placesClient findPlaceLikelihoodsFromCurrentLocationWithPlaceFields:placeFields callback:^(NSArray<GMSPlaceLikelihood *> * _Nullable likelihoods, NSError * _Nullable error) {
        if (error != nil) {
          // TODO: Handle the error.
          NSLog(@"Current Place error: %@", error.localizedDescription);
          return;
        }
    
        if (likelihoods == nil) {
          NSLog(@"No places found.");
          return;
        }
    
        for (GMSPlaceLikelihood *likelihood in likelihoods) {
          GMSPlace *place = likelihood.place;
          [likelyPlaces addObject:place];
        }
      }];
    }
          
  3. افتح ملفًا شخصيًا جديدًا لتقديم الأماكن المحتملة للمستخدم. عندما ينقر المستخدم على "الحصول على مكان"، ننتقل إلى طريقة عرض جديدة، ونعرض للمستخدم قائمة بالأماكن المحتملة للاختيار من بينها. يتم تعديل الدالة prepare PlacesViewController لتعرض قائمة بالأماكن المحتمَلة حاليًا، وتسمّى تلقائيًا عند إجراء مقطع صوتي.
  4. Swift

    // Prepare the segue.
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if segue.identifier == "segueToSelect" {
        if let nextViewController = segue.destination as? PlacesViewController {
          nextViewController.likelyPlaces = likelyPlaces
        }
      }
    }
          

    Objective-C

    // Prepare the segue.
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
      if ([segue.identifier isEqualToString:@"segueToSelect"]) {
        if ([segue.destinationViewController isKindOfClass:[PlacesViewController class]]) {
          PlacesViewController *placesViewController = (PlacesViewController *)segue.destinationViewController;
          placesViewController.likelyPlaces = likelyPlaces;
        }
      }
    }
          
  5. في PlacesViewController، املأ الجدول باستخدام قائمة الأماكن الأكثر احتمالية، باستخدام إضافة التفويض UITableViewDataSource.
  6. Swift

    // Populate the table with the list of most likely places.
    extension PlacesViewController: UITableViewDataSource {
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return likelyPlaces.count
      }
    
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
        let collectionItem = likelyPlaces[indexPath.row]
    
        cell.textLabel?.text = collectionItem.name
    
        return cell
      }
    }
          

    Objective-C

    #pragma mark - UITableViewDataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
      return self.likelyPlaces.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
      return [tableView dequeueReusableCellWithIdentifier:cellReuseIdentifier forIndexPath:indexPath];
    }
    @end
          
  7. يمكنك معالجة اختيار المستخدم باستخدام إضافة التفويض "UITableViewDelegate".
  8. Swift

    class PlacesViewController: UIViewController {
    
      // ...
    
      // Pass the selected place to the new view controller.
      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "unwindToMain" {
          if let nextViewController = segue.destination as? MapViewController {
            nextViewController.selectedPlace = selectedPlace
          }
        }
      }
    }
    
    // Respond when a user selects a place.
    extension PlacesViewController: UITableViewDelegate {
      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedPlace = likelyPlaces[indexPath.row]
        performSegue(withIdentifier: "unwindToMain", sender: self)
      }
    
      // Adjust cell height to only show the first five items in the table
      // (scrolling is disabled in IB).
      func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return self.tableView.frame.size.height/5
      }
    
      // Make table rows display at proper height if there are less than 5 items.
      func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        if (section == tableView.numberOfSections - 1) {
          return 1
        }
        return 0
      }
    }
          

    Objective-C

    @interface PlacesViewController () <UITableViewDataSource, UITableViewDelegate>
    // ...
    
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    
    }
    
    #pragma mark - UITableViewDelegate
    
    // Respond when a user selects a place.
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
      self.selectedPlace = [self.likelyPlaces objectAtIndex:indexPath.row];
      [self performSegueWithIdentifier:@"unwindToMain" sender:self];
    }
    
    // Adjust cell height to only show the first five items in the table
    // (scrolling is disabled in IB).
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
      return self.tableView.frame.size.height/5;
    }
    
    // Make table rows display at proper height if there are less than 5 items.
    -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
    {
      if (section == tableView.numberOfSections - 1) {
        return 1;
      }
      return 0;
    }
          

إضافة علامة إلى الخريطة

عندما يقوم المستخدم باختيار، استخدم مقطعًا للاسترخاء للعودة إلى العرض السابق، وإضافة العلامة إلى الخريطة. يتم استدعاء unwindToMain تلقائيًا عند الرجوع إلى وحدة التحكّم في العرض الرئيسي.

Swift

// Update the map once the user has made their selection.
@IBAction func unwindToMain(segue: UIStoryboardSegue) {
  // Clear the map.
  mapView.clear()

  // Add a marker to the map.
  if let place = selectedPlace {
    let marker = GMSMarker(position: place.coordinate)
    marker.title = selectedPlace?.name
    marker.snippet = selectedPlace?.formattedAddress
    marker.map = mapView
  }

  listLikelyPlaces()
}
      

Objective-C

// Update the map once the user has made their selection.
- (void) unwindToMain:(UIStoryboardSegue *)segue
{
  // Clear the map.
  [mapView clear];

  // Add a marker to the map.
  if (selectedPlace != nil) {
    GMSMarker *marker = [GMSMarker markerWithPosition:selectedPlace.coordinate];
    marker.title = selectedPlace.name;
    marker.snippet = selectedPlace.formattedAddress;
    marker.map = mapView;
  }

  [self listLikelyPlaces];
}
      

تهانينا! لقد أنشأت تطبيق iOS يتيح للمستخدم اختيار مكانه الحالي، ويعرض النتيجة على خريطة Google. وخلال القيام بذلك، تعلمت كيفية استخدام حزمة SDK للأماكن في نظام التشغيل iOS، وحزمة SDK للخرائط لنظام التشغيل iOS، وإطار عمل الموقع الأساسي Apple.