做iOS开发时,地图功能几乎是出行、外卖、社交类App的标配。用Swift开发地图集成,其实没那么复杂,关键是要搞清楚流程和细节。
选择合适的地图框架
iOS原生支持的是MapKit,配合Swift使用非常顺手。如果你不需要国内高德或百度那样的详细数据,MapKit完全够用。它能显示地图、添加标注、绘制路线,而且和系统深度集成,省电又流畅。
先在项目中导入框架:
import MapKit
然后在Storyboard里拖一个MKMapView,或者用代码创建:
let mapView = MKMapView(frame: view.bounds)
view.addSubview(mapView)
定位当前用户位置
很多场景下,比如叫车或者找附近餐馆,第一步就是知道用户在哪。这需要开启定位权限,在Info.plist里加上NSLocationWhenInUseUsageDescription,写清楚为什么需要位置。
接着在代码中请求授权:
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
}
用户允许后,就能拿到经纬度,把地图中心移到这里。
添加标记和弹窗
比如你开发一个咖啡店推荐App,每家店都应该有个图标钉在地图上。这就需要用到MKPointAnnotation。
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2D(latitude: 39.9042, longitude: 116.4074)
annotation.title = "老城区咖啡馆"
annotation.subtitle = "手冲豆子很香"
mapView.addAnnotation(annotation)
点击图标会弹出小气泡,展示标题和副标题,用户一点就能跳转详情页。
绘制路线指引
从当前位置导航到目标地,是刚需功能。可以用MKDirections请求路径数据。
let request = MKDirections.Request()
request.source = MKMapItem.forCurrentLocation()
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: annotation.coordinate))
request.transportType = .automobile
let directions = MKDirections(request: request)
directions.calculate { response, error in
guard let route = response?.routes.first else { return }
mapView.addOverlay(route.polyline)
}
再实现MKMapViewDelegate里的mapView(_:rendererFor:)方法,就能画出蓝色导航线。
处理常见坑点
调试时发现地图不显示?先检查Bundle Identifier有没有开通Maps capability。模拟器定位失败?可以提前在Xcode里设置模拟位置,比如选“Apple”当测试点。
另外,真机测试一定要连网,离线状态下地图瓦片加载不出来,别以为是代码写错了。
如果后续想换高德或百度,虽然要重写部分逻辑,但思路是一样的:初始化地图、获取位置、加标记、画路线。先掌握原生方案,再迁移到第三方会轻松很多。