Mapbox Navigation SDK for iOS
Mapbox Navigation 为您提供了所有将逐点导航添加到 iOS 应用程序所需的工具。
只需几分钟就能使用我们的内置逐点导航 NavigationViewController
启动运行,或者使用我们的路由和导航核心组件构建一个完全定制的逐点导航应用程序。
特性
- 专为 iPhone、iPad 和 CarPlay 设计的完整逐点导航 UI,可轻松嵌入您的应用程序
- 白天和夜间驾驶的专业地图样式
- 由 开放数据 和用户反馈驱动的全球驾驶、骑行和步行路线
- 基于 55 个国家的实时条件进行避开交通和主动重新路由
- 由 Amazon Polly 驱动的自然发音转向指令(无需配置)
- 支持超过 20 种语言
文档
需求
Mapbox导航SDK和核心导航与Swift 5在Xcode 11.4.1及以上版本中编写的应用程序兼容。Mapbox导航和Mapbox核心导航框架可在iOS 10.0及以上版本上运行。
Mapbox导航SDK也适用于Android。
安装
使用CocoaPods
要使用CocoaPods安装Mapbox导航,请访问CocoaPods官网
-
登录您的Mapbox账户仪表板,创建一个具有
DOWNLOADS:READ
作用域的访问令牌。请注意:这与您的生产Mapbox API令牌不同。请务必将其保密,并且不要将其插入任何Info.plist文件中。如果您的家目录中尚不存在名为.netrc
的文件,请创建一个,然后在文件末尾添加以下行machine api.mapbox.com login mapbox password PRIVATE_MAPBOX_API_TOKEN
其中PRIVATE_MAPBOX_API_TOKEN是您的具有
DOWNLOADS:READ
作用域的Mapbox API令牌。 -
创建一个包含以下规范Podfile的文件
# Latest stable release pod 'MapboxNavigation', '~> 1.1' # Latest prerelease pod 'MapboxCoreNavigation', :git => 'https://github.com/mapbox/mapbox-navigation-ios.git', :tag => 'v1.1.0' pod 'MapboxNavigation', :git => 'https://github.com/mapbox/mapbox-navigation-ios.git', :tag => 'v1.1.0'
-
运行
pod repo update && pod install
并打开生成的Xcode工作空间。
使用Carthage
或者,要使用Carthage v0.35或更高版本安装Mapbox导航
-
登录您的Mapbox账户仪表板,创建一个具有
DOWNLOADS:READ
作用域的访问令牌。请注意:这与您的生产Mapbox API令牌不同。请务必将其保密,并且不要将其插入任何Info.plist文件中。如果您的家目录中尚不存在名为.netrc
的文件,请创建一个,然后在文件末尾添加以下行machine api.mapbox.com login mapbox password PRIVATE_MAPBOX_API_TOKEN
其中PRIVATE_MAPBOX_API_TOKEN是您的具有
DOWNLOADS:READ
作用域的Mapbox API令牌。 -
(可选)清除Carthage缓存
rm -rf ~/Library/Caches/carthage/ ~/Library/Caches/org.carthage.CarthageKit/binaries/{MapboxAccounts,MapboxCommon-ios,MapboxNavigationNative,mapbox-ios-sdk-dynamic}
-
创建一个包含以下依耐性的Cartfile
# Latest stable release github "mapbox/mapbox-navigation-ios" ~> 1.1 # Latest prerelease github "mapbox/mapbox-navigation-ios" "v1.1.0"
-
运行
./Carthage/Checkouts/mapbox-navigation-ios/scripts/wcarthage.sh bootstrap --platform iOS --cache-builds --use-netrc
。(wcarthage.sh是carthage
的临时替代品,以解决Xcode 12中的链接器错误。) -
遵循Carthage的iOS集成说明。您的应用程序目标应包含以下构建阶段:嵌入框架
MapboxNavigation.framework
、MapboxCoreNavigation.framework
、MapboxNavigationNative.framework
、MapboxCommon.framework
和MapboxAccounts.framework
。
配置
-
Mapbox API和矢量瓦片需要Mapbox账户和API访问令牌。在项目编辑器中,选择应用程序目标,然后转到“信息”选项卡。在“自定义iOS目标属性”部分,将
MGLMapboxAccessToken
设置为您的访问令牌。您可以从Mapbox账户页面获取访问令牌。 -
为了让SDK跟踪用户在路线上的位置,将
NSLocationWhenInUseUsageDescription
设置为在地图上显示您的位置并帮助改进地图。
-
用户期望SDK即使在不同的应用程序可见或设备锁定的情况下也能继续跟踪用户的位置并提供语音指令。转到“签名与能力”选项卡。在“后台模式”部分,启用“音频、AirPlay和画中画”和“位置更新”。(或者,在“信息”选项卡中的
UIBackgroundModes
数组中添加audio
和location
值。)
现在导入相关模块并呈现一个新的NavigationViewController
。如果您的应用程序UI是在Interface Builder中设置的,您也可以从Storyboard中跳转到导航视图控制器。
import MapboxDirections
import MapboxCoreNavigation
import MapboxNavigation
// Define two waypoints to travel between
let origin = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.9131752, longitude: -77.0324047), name: "Mapbox")
let destination = Waypoint(coordinate: CLLocationCoordinate2D(latitude: 38.8977, longitude: -77.0365), name: "White House")
// Set options
let routeOptions = NavigationRouteOptions(waypoints: [origin, destination])
// Request a route using MapboxDirections
Directions.shared.calculate(routeOptions) { [weak self] (session, result) in
switch result {
case .failure(let error):
print(error.localizedDescription)
case .success(let response):
guard let route = response.routes?.first, let strongSelf = self else {
return
}
// Pass the generated route to the the NavigationViewController
let viewController = NavigationViewController(for: route, routeIndex: 0, routeOptions: routeOptions)
viewController.modalPresentationStyle = .fullScreen
strongSelf.present(viewController, animated: true, completion: nil)
}
}
有关更多信息,请参考API参考。
示例
API参考包括了完成常见任务的示例代码。您可以将这些示例作为navigation-ios-examples项目的部分运行。
此存储库还包含一个测试平台,用于测试导航SDK的各种功能。
- 克隆存储库或下载.zip文件
- 运行
carthage update --platform ios --use-netrc
以仅构建iOS依赖项。 - 打开
MapboxNavigation.xcodeproj
。 - 注册或登录到您的Mapbox账户,并获取Mapbox访问令牌。
- 在“Example”目标中打开Info.plist,并将您的Mapbox访问令牌粘贴到
MGLMapboxAccessToken
中。(或者,如果您计划将此项目用作GitHub上公共项目的依据,请将访问令牌放在主目录中名为.mapbox
或mapbox
的纯文本文件中,而不是将其添加到Info.plist中。) - 构建并运行
Example
目标。
定制
样式
您可以自定义外观以与其他应用程序融合。查看 DayStyle.swift
了解所有可自定义元素。
class CustomStyle: DayStyle {
required init() {
super.init()
mapStyleURL = URL(string: "mapbox://styles/mapbox/satellite-streets-v9")!
styleType = .nightStyle
}
override func apply() {
super.apply()
BottomBannerView.appearance().backgroundColor = .orange
}
}
然后用您的样式或样式初始化 NavigationViewController
let navigationOptions = NavigationOptions(styles: [CustomStyle()])
NavigationViewController(for: route, routeOptions: routeOptions, navigationOptions: navigationOptions)
从头开始
如果您需要完全自定义的应用,例如仅语音体验或非传统用户界面,请参阅 核心导航安装指南。
贡献
我们欢迎反馈和代码贡献!请查阅 CONTRIBUTING.md 获取详细信息。
许可
Mapbox iOS 导航 SDK 以 ISC 许可证发布。有关详细信息,请参阅 LICENSE.md。
Mapbox Navigation SDK for iOS 依赖于 Mapbox Maps SDK for iOS 和 MapboxNavigationNative 的私有二进制分发。这些二进制可以使用 Mapbox 账户并符合 Mapbox 服务条款 使用。如果您不想使用这些二进制文件,请确保在 Cartfile 中交换这些依赖项,或在您的 Podfile 中覆盖它们。