You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift实现附近加油站查询及导航功能问题求助

Fix: Nearby Gas Station Annotations Not Showing Up in MapKit

Let’s break down the issues in your code and fix them one by one to get those gas station annotations showing up:

1. Missing Map View Delegate Connection

Your mapView(_:didAdd:) method (which triggers the populateNearByPlaces() function) never runs because you haven’t set the map view’s delegate to self. Add this line in your viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    maps.delegate = self // This line is critical to map view delegate methods firing
    checkLocationServices()
}

2. Unsafe Forced Cast in Location Manager Setup

You’re using an unnecessary (and risky) forced cast when assigning the location manager delegate. Since your class already conforms to CLLocationManagerDelegate via the extension, simplify this:

func setupLocationManager(){
    locationManager.delegate = self // Remove `as! CLLocationManagerDelegate`
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
}

3. Nested Authorization Status Method

Your locationManager(_:didChangeAuthorization:) is nested inside locationManager(_:didUpdateLocations:), which means it will never be called by the system. Move it to the top level of the extension:

extension MapsController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else {return}
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion.init(center: center, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
        maps.setRegion(region, animated: true)
    }

    // Move this method outside didUpdateLocations to make it accessible
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        checkLocationAuthorization()
    }
}

4. Verify Info.plist Location Permissions

Without the required permission description in your Info.plist, the system won’t show the location authorization prompt, so your app can’t access the user’s location. Add this key-value pair:

  • Key: NSLocationWhenInUseUsageDescription
  • Value: A clear message like "We need your location to find nearby gas stations."

5. Adjust Search Radius (Optional)

Your current search radius is only 1000 meters. If there are no gas stations within that range, no annotations will appear. Try increasing the radius:

let regionInMeters: Double = 5000 // Expand to 5km to cover more area

Quick Checks

  • Make sure your PlaceAnnotation class correctly conforms to MKAnnotation (it needs the coordinate property, plus your custom title and mapItem).
  • Add print statements in checkLocationAuthorization() to confirm which authorization status your app is getting (e.g., if the user denied access, you’ll want to show an alert prompting them to enable it).

After applying these fixes, your app should successfully fetch nearby gas stations and add their annotations to the map.

内容的提问来源于stack exchange,提问作者Marouen Abdi

火山引擎 最新活动