4 * AsyncRouteManager usage example for Swift
5 * Demonstrates working with async route planning, session management, and navigation
7class AsyncRouteManagerExample: NSObject {
8 private var sdk: NCNavigineSdk?
9 private var locationManager: NCLocationManager?
10 private var navigationManager: NCNavigationManager?
11 private var asyncRouteManager: NCAsyncRouteManager?
12 private var currentSession: NCRouteSession?
17 setupAsyncRouteListener()
21 * Initialize SDK and get managers
23 private func initializeSdk() {
25 // [swift_NavigineSdk_getInstance]
27 sdk = NCNavigineSdk.getInstance()
28 // [swift_NavigineSdk_getInstance]
30 // [swift_NavigineSdk_setUserHash]
32 sdk?.setUserHash("USER-HASH-HERE")
33 // [swift_NavigineSdk_setUserHash]
35 // [swift_NavigineSdk_setServer]
36 // Set server URL (optional)
37 sdk?.setServer("https://custom.navigine.com")
38 // [swift_NavigineSdk_setServer]
40 // [swift_NavigineSdk_getLocationManager]
41 // Get LocationManager for working with locations
42 locationManager = sdk?.getLocationManager()
43 // [swift_NavigineSdk_getLocationManager]
45 // [swift_NavigineSdk_getNavigationManager]
46 // Get NavigationManager for working with navigation
47 navigationManager = sdk?.getNavigationManager(locationManager)
48 // [swift_NavigineSdk_getNavigationManager]
50 // [swift_NavigineSdk_getAsyncRouteManager]
51 // Get AsyncRouteManager for working with async routes
52 asyncRouteManager = sdk?.getAsyncRouteManager(locationManager, navigationManager: navigationManager)
53 // [swift_NavigineSdk_getAsyncRouteManager]
55 if let locationManager = locationManager,
56 let navigationManager = navigationManager,
57 let asyncRouteManager = asyncRouteManager {
58 print("LocationManager, NavigationManager and AsyncRouteManager successfully initialized")
61 print("Error initializing SDK: \(error)")
66 * Setup async route listener
68 private func setupAsyncRouteListener() {
69 // AsyncRouteListener is implemented via protocol extension
70 // No additional setup needed for Swift
74 * Demonstrate AsyncRouteManager methods
76 func demonstrateAsyncRouteManagerMethods() {
77 guard let manager = asyncRouteManager else {
78 print("AsyncRouteManager not initialized")
82 // Create test destination point
83 let destinationPoint = NCPoint(x: 100.0, y: 100.0)
84 let destinationLocationPoint = NCLocationPoint(point: destinationPoint, locationId: 12345, sublocationId: 1)
86 // Create route options
87 let routeOptions = NCRouteOptions(smoothRadius: 2.0, maxProjectionDistance: 5.0, maxAdvance: 2.0)
89 // [swift_AsyncRouteManager_createRouteSession]
90 // Create route session with default graph tag
91 let session = manager.createRouteSession(destinationLocationPoint, routeOptions: routeOptions)
92 print("Created route session with default graph tag")
93 // [swift_AsyncRouteManager_createRouteSession]
95 // [swift_AsyncRouteManager_createRouteSessionWithTag]
96 // Create route session with specific graph tag
97 let sessionWithTag = manager.createRouteSession(withTag: destinationLocationPoint, routeOptions: routeOptions, tag: "main")
98 print("Created route session with 'main' graph tag")
99 // [swift_AsyncRouteManager_createRouteSessionWithTag]
101 // Store session for later use
102 currentSession = session
104 // Add listener to session
105 // [swift_RouteSession_addRouteListener]
106 // Add route listener to session
107 session?.addRouteListener(self)
108 // [swift_RouteSession_addRouteListener]
112 * Demonstrate RoutePath usage
114 func demonstrateRoutePathUsage(_ routePath: NCRoutePath) {
115 guard let routePath = routePath else {
116 print("RoutePath is null")
120 // [swift_RoutePath_getLength]
122 let length = routePath.getLength()
123 print("Route length: \(length) meters")
124 // [swift_RoutePath_getLength]
126 // [swift_RoutePath_getWeight]
127 // Get total route weight
128 let weight = routePath.getWeight()
129 print("Route weight: \(weight)")
130 // [swift_RoutePath_getWeight]
132 // [swift_RoutePath_getNodes]
134 let nodes = routePath.getNodes()
135 print("Number of route nodes: \(nodes.count)")
136 for node in nodes.prefix(3) {
137 demonstrateRouteNodeUsage(node)
139 // [swift_RoutePath_getNodes]
141 // [swift_RoutePath_head]
142 // Get route head (first 10 meters)
143 if let head = routePath.head(10.0) {
144 print("Route head length: \(head.getLength()) meters")
146 // [swift_RoutePath_head]
148 // [swift_RoutePath_tail]
149 // Get route tail (remaining after 10 meters)
150 if let tail = routePath.tail(10.0) {
151 print("Route tail length: \(tail.getLength()) meters")
153 // [swift_RoutePath_tail]
156 func demonstrateRouteNodeUsage(_ node: NCRouteNode) {
157 // [swift_RouteNode_getPoint]
158 let point = node.getPoint()
159 demonstrateLocationPointUsage(point)
160 // [swift_RouteNode_getPoint]
162 // [swift_RouteNode_getWeight]
163 let weight = node.getWeight()
164 print("Node weight: \(weight)")
165 // [swift_RouteNode_getWeight]
167 // [swift_RouteNode_getDistance]
168 let distance = node.getDistance()
169 print("Node distance: \(distance) meters")
170 // [swift_RouteNode_getDistance]
172 // [swift_RouteNode_getEvents]
173 let events = node.getEvents()
174 for event in events {
175 demonstrateRouteEventUsage(event)
177 // [swift_RouteNode_getEvents]
181 * Demonstrate RouteEvent usage
183 func demonstrateRouteEventUsage(_ event: NCRouteEvent) {
184 guard let event = event else {
185 print("RouteEvent is null")
189 // [swift_RouteEvent_getType]
191 let type = event.getType()
192 print("Event type: \(type)")
193 // [swift_RouteEvent_getType]
195 // [swift_RouteEvent_getTurnEvent]
196 if let turnEvent = event.getTurnEvent() {
197 demonstrateTurnEventUsage(turnEvent)
199 // [swift_RouteEvent_getTurnEvent]
201 // [swift_RouteEvent_getTransitionEntryEvent]
202 if let entryEvent = event.getTransitionEntryEvent() {
203 demonstrateTransitionEntryEventUsage(entryEvent)
205 // [swift_RouteEvent_getTransitionEntryEvent]
207 // [swift_RouteEvent_getTransitionExitEvent]
208 if let exitEvent = event.getTransitionExitEvent() {
209 demonstrateTransitionExitEventUsage(exitEvent)
211 // [swift_RouteEvent_getTransitionExitEvent]
213 // [swift_RouteEvent_getTargetReachedEvent]
214 if let targetEvent = event.getTargetReachedEvent() {
215 demonstrateTargetReachedEventUsage(targetEvent)
217 // [swift_RouteEvent_getTargetReachedEvent]
221 * Demonstrate RouteEventType enum values
223 func demonstrateRouteEventTypes() {
224 // [swift_RouteEventType_values]
225 // Get all route event type values
226 let types: [NCRouteEventType] = [.turnEvent, .transitionEntryEvent, .transitionExitEvent, .targetReachedEvent]
227 print("Available route event types:")
231 // [swift_RouteEventType_values]
234 func demonstrateTurnTypes() {
235 // [swift_TurnType_values]
236 let types: [NCTurnType] = [.leftSlight, .leftNormal, .leftSharp, .rightSlight, .rightNormal, .rightSharp, .complete]
240 // [swift_TurnType_values]
243 func demonstrateTurnEventUsage(_ event: NCTurnEvent) {
244 // [swift_TurnEvent_getType]
245 let type = event.getType()
246 print("Turn type: \(type)")
247 // [swift_TurnEvent_getType]
249 // [swift_TurnEvent_getAngle]
250 let angle = event.getAngle()
251 print("Turn angle: \(angle)")
252 // [swift_TurnEvent_getAngle]
255 func demonstrateTransitionEntryEventUsage(_ event: NCTransitionEntryEvent) {
256 // [swift_TransitionEntryEvent_getFrom]
257 let from = event.getFrom()
258 print("Transition entry from: \(from)")
259 // [swift_TransitionEntryEvent_getFrom]
261 // [swift_TransitionEntryEvent_getTo]
262 let to = event.getTo()
263 print("Transition entry to: \(to)")
264 // [swift_TransitionEntryEvent_getTo]
267 func demonstrateTransitionExitEventUsage(_ event: NCTransitionExitEvent) {
268 // [swift_TransitionExitEvent_getFrom]
269 let from = event.getFrom()
270 print("Transition exit from: \(from)")
271 // [swift_TransitionExitEvent_getFrom]
273 // [swift_TransitionExitEvent_getTo]
274 let to = event.getTo()
275 print("Transition exit to: \(to)")
276 // [swift_TransitionExitEvent_getTo]
279 func demonstrateTargetReachedEventUsage(_ event: NCTargetReachedEvent) {
280 // [swift_TargetReachedEvent_getIndex]
281 let index = event.getIndex()
282 print("Reached target index: \(index)")
283 // [swift_TargetReachedEvent_getIndex]
285 // [swift_TargetReachedEvent_getPoint]
286 let point = event.getPoint()
287 demonstrateLocationPointUsage(point)
288 // [swift_TargetReachedEvent_getPoint]
292 * Demonstrate LocationPoint usage
294 func demonstrateLocationPointUsage(_ locationPoint: NCLocationPoint) {
295 guard let locationPoint = locationPoint else {
296 print("LocationPoint is null")
300 // [swift_LocationPoint_getPoint]
301 // Get point coordinates
302 let point = locationPoint.getPoint()
303 print("Location point: (\(point.getX()), \(point.getY()))")
304 // [swift_LocationPoint_getPoint]
306 // [swift_LocationPoint_getLocationId]
308 let locationId = locationPoint.getLocationId()
309 print("Location ID: \(locationId)")
310 // [swift_LocationPoint_getLocationId]
312 // [swift_LocationPoint_getSublocationId]
313 // Get sublocation ID
314 let sublocationId = locationPoint.getSublocationId()
315 print("Sublocation ID: \(sublocationId)")
316 // [swift_LocationPoint_getSublocationId]
318 // [swift_LocationPoint_constructor]
319 // Create new location point
320 let newPoint = NCPoint(x: 25.0, y: 35.0)
321 let newLocationPoint = NCLocationPoint(point: newPoint, locationId: 12345, sublocationId: 2)
322 print("Created new location point: \(newLocationPoint.getPoint().getX()), \(newLocationPoint.getPoint().getY())")
323 // [swift_LocationPoint_constructor]
327 * Demonstrate Point usage
329 func demonstratePointUsage(_ point: NCPoint) {
330 guard let point = point else {
331 print("Point is null")
335 // [swift_Point_getX]
338 print("Point X: \(x)")
339 // [swift_Point_getX]
341 // [swift_Point_getY]
344 print("Point Y: \(y)")
345 // [swift_Point_getY]
347 // [swift_Point_constructor]
349 let newPoint = NCPoint(x: 15.0, y: 25.0)
350 print("Created new point: (\(newPoint.getX()), \(newPoint.getY()))")
351 // [swift_Point_constructor]
355 * Demonstrate RouteOptions usage
357 func demonstrateRouteOptions() {
358 print("=== Route Options ===")
360 // [swift_RouteOptions_constructor]
361 // Create route options with custom parameters
362 let routeOptions = NCRouteOptions(smoothRadius: 3.0, maxProjectionDistance: 7.0, maxAdvance: 2.5)
363 print("Created route options with smoothRadius: \(routeOptions.getSmoothRadius()), maxProjectionDistance: \(routeOptions.getMaxProjectionDistance()), maxAdvance: \(routeOptions.getMaxAdvance())")
364 // [swift_RouteOptions_constructor]
366 // Demonstrate different route options configurations
368 NCRouteOptions(smoothRadius: 0.0, maxProjectionDistance: 5.0, maxAdvance: 2.0), // No smoothing
369 NCRouteOptions(smoothRadius: 2.0, maxProjectionDistance: 10.0, maxAdvance: 1.0), // High smoothing, high projection distance
370 NCRouteOptions(smoothRadius: 1.0, maxProjectionDistance: 3.0, maxAdvance: 3.0), // Low smoothing, low projection distance
373 for (index, options) in optionsList.enumerated() {
374 print("Options \(index + 1): smoothRadius=\(options.getSmoothRadius()), maxProjectionDistance=\(options.getMaxProjectionDistance()), maxAdvance=\(options.getMaxAdvance())")
379 * Demonstrate advanced async routing features
381 func demonstrateAdvancedAsyncRoutingFeatures() {
382 print("=== Advanced Async Routing Features ===")
384 guard let manager = asyncRouteManager else {
388 // Create multiple destination points
390 NCLocationPoint(point: NCPoint(x: 50.0, y: 50.0), locationId: 12345, sublocationId: 1),
391 NCLocationPoint(point: NCPoint(x: 100.0, y: 100.0), locationId: 12345, sublocationId: 1),
392 NCLocationPoint(point: NCPoint(x: 150.0, y: 150.0), locationId: 12345, sublocationId: 1)
395 // Create different route options for each destination
397 NCRouteOptions(smoothRadius: 2.0, maxProjectionDistance: 5.0, maxAdvance: 2.0),
398 NCRouteOptions(smoothRadius: 3.0, maxProjectionDistance: 7.0, maxAdvance: 1.5),
399 NCRouteOptions(smoothRadius: 1.0, maxProjectionDistance: 3.0, maxAdvance: 2.5),
402 // Create sessions for each destination
403 var sessions: [NCRouteSession] = []
404 for (index, destination) in destinations.enumerated() {
405 let session = manager.createRouteSession(destination, routeOptions: optionsList[index])
406 sessions.append(session!)
407 print("Created session \(index + 1) for destination: \(destination.getPoint().getX()), \(destination.getPoint().getY())")
409 session?.addRouteListener(self)
411 Thread.sleep(forTimeInterval: 1.0)
414 // Wait for route updates
415 Thread.sleep(forTimeInterval: 3.0)
417 // Cancel all sessions
418 for (index, session) in sessions.enumerated() {
419 // [swift_AsyncRouteManager_cancelRouteSession]
420 // Cancel route session
421 manager.cancelRouteSession(session)
422 print("Cancelled session \(index + 1)")
423 // [swift_AsyncRouteManager_cancelRouteSession]
425 Thread.sleep(forTimeInterval: 1.0)
430 * Demonstrate RouteStatus enum usage
432 func demonstrateRouteStatusUsage() {
433 print("=== RouteStatus Enum Usage ===")
435 // [swift_RouteStatus_values]
436 // Demonstrate all RouteStatus values
437 print("Available RouteStatus values:")
438 let allStatuses: [NCRouteStatus] = [.missingGraph, .missingPosition, .missingRoute, .missingProjection, .newRoute]
439 for status in allStatuses {
440 print(" - \(status): \(status.rawValue)")
443 // Demonstrate status checking
444 let testStatus: NCRouteStatus = .newRoute
447 print("Router is ready for navigation")
449 print("Router is missing the route graph")
450 case .missingPosition:
451 print("Router is missing the current position")
452 case .missingProjection:
453 print("Current position is off the route graph")
455 print("Router unable to find the route to the destination point")
457 // [swift_RouteStatus_values]
461 * Demonstrate route session management
463 func demonstrateRouteSessionManagement() {
464 print("=== Route Session Management ===")
466 guard let manager = asyncRouteManager else {
470 // Create test destination
471 let destinationPoint = NCPoint(x: 75.0, y: 75.0)
472 let destinationLocationPoint = NCLocationPoint(point: destinationPoint, locationId: 12345, sublocationId: 1)
473 let routeOptions = NCRouteOptions(smoothRadius: 2.0, maxProjectionDistance: 5.0, maxAdvance: 2.0)
475 // Create session with default tag
476 let defaultSession = manager.createRouteSession(destinationLocationPoint, routeOptions: routeOptions)
477 print("Created session with default tag")
479 // Create session with specific tag
480 let taggedSession = manager.createRouteSession(withTag: destinationLocationPoint, routeOptions: routeOptions, tag: "elevator")
481 print("Created session with 'elevator' tag")
483 // Add listeners to both sessions
484 defaultSession?.addRouteListener(self)
485 taggedSession?.addRouteListener(self)
487 // Simulate some time passing
488 DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
490 // [swift_RouteSession_removeRouteListener1]
491 // Remove route listener from session
492 defaultSession?.removeRouteListener(self)
493 taggedSession?.removeRouteListener(self)
494 print("Removed listeners from sessions")
495 // [swift_RouteSession_removeRouteListener1]
498 manager.cancelRouteSession(defaultSession)
499 manager.cancelRouteSession(taggedSession)
500 print("Cancelled both sessions")
508 if let session = currentSession {
509 // [swift_RouteSession_removeRouteListener]
510 // Remove route listener
511 session.removeRouteListener(self)
512 // [swift_RouteSession_removeRouteListener]
515 if let manager = asyncRouteManager, let session = currentSession {
516 // [swift_AsyncRouteManager_cancelRouteSession_1]
517 // Cancel route session
518 manager.cancelRouteSession(session)
519 // [swift_AsyncRouteManager_cancelRouteSession_1]
524 * Main demonstration method
527 print("=== AsyncRouteManager Example ===")
529 demonstrateAsyncRouteManagerMethods()
530 demonstrateRouteEventTypes()
531 demonstrateTurnTypes()
532 demonstrateRouteOptions()
533 demonstrateRouteStatusUsage()
534 demonstrateRouteSessionManagement()
535 demonstrateAdvancedAsyncRoutingFeatures()
537 // Wait a bit for route updates
538 Thread.sleep(forTimeInterval: 3.0)
541 print("=== Example completed ===")
545// MARK: - NCAsyncRouteListener
547extension AsyncRouteManagerExample: NCAsyncRouteListener {
548 // [swift_AsyncRouteListener_onRouteChanged]
549 func onRouteChanged(_ status: NCRouteStatus, currentPath: NCRoutePath) {
550 print("Route changed with status: \(status)")
551 if status == .newRoute && currentPath != nil {
552 demonstrateRoutePathUsage(currentPath)
554 print("Route not ready, status: \(status)")
557 // [swift_AsyncRouteListener_onRouteChanged]
559 // [swift_AsyncRouteListener_onRouteAdvanced]
560 func onRouteAdvanced(_ distance: Float, point: NCLocationPoint) {
561 print("Route advanced: \(distance) meters")
562 demonstrateLocationPointUsage(point)
564 // [swift_AsyncRouteListener_onRouteAdvanced]
568 * Function to run the example
571 let example = AsyncRouteManagerExample()