Mapbox iOS 导航 SDK

SPM compatible

Mapbox Navigation SDK

Mapbox 导航为您提供将逐向导航功能添加到 iOS 应用程序所需的所有工具。

使用我们即插即用的逐向导航 NavigationViewController 在几分钟内启动并运行,或者使用我们的核心组件(用于路线规划和导航)构建完全自定义的逐向导航应用程序。

功能特性

文档

系统要求

Mapbox 导航 SDK 和 Core Navigation 与在 Xcode 15.0 及更高版本中使用 Swift 5.9 编写的应用程序兼容。Mapbox 导航和 Mapbox Core Navigation 框架可在 iOS 14.0 及更高版本上运行。

Mapbox 导航 SDK 也可用于 Android

安装

私有令牌配置

要在应用程序中使用 Swift Package Manager 安装 SDK

  1. 转到您的 Mapbox 账户仪表板 并创建一个具有 DOWNLOADS:READ 作用域的访问令牌。请注意:这与您的生产 Mapbox API 令牌不同。请务必妥善保管,不要将其插入任何 Info.plist 文件中。 如果您的主目录中尚不存在名为 .netrc 的文件,请创建一个,然后将以下行添加到文件末尾
    machine api.mapbox.com
      login mapbox
      password PRIVATE_MAPBOX_API_TOKEN
    
    其中 PRIVATE_MAPBOX_API_TOKEN 是您的 Mapbox API 令牌,具有 DOWNLOADS:READ 作用域。

使用 Swift Package Manager

  1. 在 Xcode 中,前往“File”‣“Swift Packages”‣“Add Package Dependency”。

  2. 输入 https://github.com/mapbox/mapbox-navigation-ios.git 作为软件包仓库,然后点击“Next”。

  3. 将“Rules”设置为“Version”、“Up to Next Major”,然后输入 3.1.0 作为最低版本要求。点击“Next”。

要在另一个软件包(而不是应用程序)中安装 MapboxNavigation 框架,请运行 swift package init 以创建 Package.swift,然后添加以下依赖项

// Latest stable release
.package(url: "https://github.com/mapbox/mapbox-navigation-ios.git", from: "3.1.0")

项目配置

  1. Mapbox API 和矢量瓦片需要 Mapbox 账户和 API 访问令牌。在项目编辑器中,选择应用程序目标,然后转到“Info”标签页。在“Custom iOS Target Properties”部分下,将 MBXAccessToken 设置为您的访问令牌。您可以从 Mapbox 账户页面 获取访问令牌。

  2. 为了使 SDK 能够在用户沿着路线移动时跟踪用户的位置,请将 NSLocationWhenInUseUsageDescription 设置为

    在地图上显示您的位置并帮助改进地图。

  3. 用户期望 SDK 即使在其他应用程序可见或设备锁定时也能继续跟踪用户的位置并提供语音指令。转到“Signing & Capabilities”标签页。在“Background Modes”部分下,启用“Audio, AirPlay, and Picture in Picture”和“Location updates”。(或者,将 audiolocation 值添加到“Info”标签页中的 UIBackgroundModes 数组。)

现在导入相关模块并呈现新的 NavigationViewController。如果您的应用程序的 UI 在 Interface Builder 中布局,您也可以从 storyboard 推送到导航视图控制器。

示例

此仓库包含一个测试应用程序,用于演示各种导航 SDK 功能。配置私有公共令牌以运行此应用程序。

import MapboxDirections
import MapboxNavigationCore
import MapboxNavigationUIKit
import UIKit
import CoreLocation
// Define the Mapbox Navigation entry point.
let mapboxNavigationProvider = MapboxNavigationProvider(coreConfig: .init())
lazy var mapboxNavigation = mapboxNavigationProvider.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 options = NavigationRouteOptions(waypoints: [origin, destination])

// Request a route using RoutingProvider
let request = mapboxNavigation.routingProvider().calculateRoutes(options: options)   
Task {
    switch await request.result {
    case .failure(let error):
        print(error.localizedDescription)
    case .success(let navigationRoutes):
        // Pass the generated navigation routes to the the NavigationViewController
        let navigationOptions = NavigationOptions(mapboxNavigation: mapboxNavigation,
                                                  voiceController: mapboxNavigationProvider.routeVoiceController,
                                                  eventsManager: mapboxNavigationProvider.eventsManager())
        let navigationViewController = NavigationViewController(navigationRoutes: navigationRoutes,
                                                                navigationOptions: navigationOptions)
        navigationViewController.modalPresentationStyle = .fullScreen

        present(navigationViewController, animated: true, completion: nil)
    }
}

有关更多详细信息,请查阅 API 参考文档

自定义

样式

您可以自定义外观,使其与应用程序的其余部分融为一体。

class CustomStandardDayStyle: StandardDayStyle {
    required init() {
        super.init()
        mapStyleURL = URL(string: "mapbox://styles/mapbox/satellite-streets-v9")!
        styleType = .night
    }

    override func apply() {
        super.apply()
        BottomBannerView.appearance(for: UITraitCollection(userInterfaceIdiom: .phone)).backgroundColor = .orange
        BottomBannerView.appearance(for: UITraitCollection(userInterfaceIdiom: .pad)).backgroundColor = .orange
    }
}

然后使用您的样式初始化 NavigationViewController

let navigationOptions = NavigationOptions(
            mapboxNavigation: navigationProvider.mapboxNavigation,
            voiceController: navigationProvider.routeVoiceController,
            eventsManager: navigationProvider.eventsManager(),
            styles: [CustomStandardDayStyle()]
        )
NavigationViewController(navigationRoutes: navigationRoutes, navigationOptions: navigationOptions)

许可证

Mapbox iOS 导航 SDK 根据 Mapbox 服务条款发布。有关详细信息,请参阅 LICENSE.md