NMANavigationManagerDelegate 在 HERE Map iOS SDK 中不起作用

Not works NMANavigationManagerDelegate in HERE Map iOS SDK

我正在使用 HERE iOS SDK 并且我正在实施逐向导航,但是未调用 NMANavigationManagerDelegate 的方法 didUpdateManeuvers 或任何其他方法。

当我尝试模拟移动和使用时:

let source = NMARoutePositionSource(route: route.route)
NMAPositioningManager.sharedInstance().dataSource = source 

一切正常,但是当我模拟通过 GPX 文件移动或实时测试时,委托方法未被调用...

我的代码:

class HereMapViewController: UIViewController {

    @IBOutlet private weak var mapView: NMAMapView!

    fileprivate var navigationManager = NMANavigationManager.sharedInstance()
    var route : NMAMapRoute?


    // MARK: - life cycle

    override func viewDidLoad() {
        super.viewDidLoad()

        setupUI()
    }

    deinit {
        navigationManager.stop()
    }


    // MARK: - private

    private func setupUI() {
        mapView.copyrightLogoPosition = .center
        mapView.zoomLevel = 10
        mapView.positionIndicator.isVisible = true
        mapView.gestureDelegate = self
        navigationManager.voicePackageMeasurementSystem = NMAMeasurementSystem.imperialUS
        navigationManager.backgroundNavigationEnabled = true
        navigationManager.isVoiceEnabled = true

        navigationManager.delegate = self
        setupRoute()
    }

    private func setupRoute() {
        guard let mapRoute = route, let routeStart = mapRoute.route.start else {
                return
        }

        let start = NMAGeoCoordinates(latitude: routeStart.navigablePosition.latitude,
                                      longitude: routeStart.navigablePosition.longitude)

        mapView.add(mapObject: mapRoute)
        mapView.set(boundingBox: mapRoute.route.boundingBox!, animation: NMAMapAnimation.none)

        startNavigation()
        mapView.set(geoCenter: start, animation: .none)
    }
    private func startNavigation() {
        guard let route = route else {
            return
        }

        navigationManager.map = mapView
        NMAPositioningManager.sharedInstance().dataSource = NMAHEREPositionSource()
        navigationManager.startTurnByTurnNavigation(route.route)
        navigationManager.mapTrackingEnabled = false
        navigationManager.mapTrackingAutoZoomEnabled = false
        navigationManager.mapTrackingOrientation = .dynamic
        navigationManager.isSpeedWarningEnabled = true

    }
}


//MARK: - NMANavigationManagerDelegate

extension HereMapViewController : NMANavigationManagerDelegate {
    // Signifies that there is new instruction information available
    func navigationManager(_ navigationManager: NMANavigationManager, didUpdateManeuvers currentManeuver: NMAManeuver?, _ nextManeuver: NMAManeuver?) {
        print("didUpdateManeuvers")
    }

    // Signifies that the system has found a GPS signal
    func navigationManagerDidFindPosition(_ navigationManager: NMANavigationManager) {
        print("New position has been found")
    }

    func navigationManager(_ navigationManager: NMANavigationManager, didFindAlternateRoute routeResult: NMARouteResult) {
        print("didFindAlternateRoute")
    }

    func navigationManager(_ navigationManager: NMANavigationManager, didUpdateRoute routeResult: NMARouteResult) {
        print("didUpdateRoute")
    }
}


//MARK: - NMAMapGestureDelegate

extension HereMapViewController : NMAMapGestureDelegate {

    func mapView(_ mapView: NMAMapView, didReceiveTwoFingerPan translation: CGPoint, at location: CGPoint) {
        navigationManager.mapTrackingAutoZoomEnabled = false
    }
}

我想跟踪,如果用户走错了路,什么时候应该改变机动或者什么时候需要创建新路线。我将不胜感激。

您需要确保正确设置 class 以接收委托行为。

查看此问题的答案,尤其是来自 MakeAppPie 的第二个答案。 Delegates in swift?

确保您已完成所有步骤。

你的代码片段对我有用。确保您没有收到任何控制台错误:

Access to this operation is denied.

This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain both “NSLocationAlwaysAndWhenInUseUsageDescription” and “NSLocationWhenInUseUsageDescription” keys with string values explaining to the user how the app uses this data

NMAHEREPositionSource requires NSMotionUsageDescription key to be set in Info.plist. You can check if NMADevicePositionSource 适合你。

要使用 GPX 文件模拟运动,请使用 NMALoggedPositionSource

强制定位广播,可以使用startPositioning