Примеры Swift Here API

Я включаю HERE SDK в свое приложение. Помимо одной простой настройки карты, все примеры на веб-сайте ЗДЕСЬ показаны в объекте-C, и я изо всех сил стараюсь перевести их на Swift, но он еще не работает на 100%. Я пытаюсь проложить маршрут между двумя координатами на карте в соответствии с их примером маршрутизации, показанным по адресу:

https://developer.here.com/mobile-sdks/documentation/ios/topics/routing.html

Интересно то, что если я просто вызываю карту, все работает, но если я добавляю часть маршрутизации, я получаю следующую ошибку: NMAKit FATAL: лицензионный ключ, идентификатор приложения или код приложения не установлены. ошибка при запуске, что странно, потому что учетные данные в порядке! Так что я думаю, что ошибка полностью связана с моим переводом на Swift.

Инструкции в объекте-C очень ясны:

1. Примите протокол NMARouteManagerDelegate и создайте NMARouteManager:

@interface ClassName : NSObject <NMARouteManagerDelegate>
{
  // Setup your class
}

(void)setup
{
Create a NMARouteManager.**

  NMARouteManager* routeManager = [NMARouteManager sharedRouteManager];

  // Setup delegate
  [routeManager setDelegate:self];
}

2. Создайте NSMutableArray и добавьте две остановки NMAGeoCoordinates:

NSMutableArray* stops = [[NSMutableArray alloc] initWithCapacity:4];
NMAGeoCoordinates* geoCoord1 = [[NMAGeoCoordinates alloc]
initWithLatitude:49.1966286 longitude:-123.0053635];
NMAGeoCoordinates* geoCoord2 = [[NMAGeoCoordinates alloc]
initWithLatitude:49.1947289 longitude:-123.1762924];
[stops addObject:geoCoord1];
[stops addObject:geoCoord2];

3. Создайте NMARoutingMode и установите для него значения NMATransportMode, NMARoutingType и NMARoutingOption:

NMARoutingMode* routingMode = [[NMARoutingMode alloc]
initWithRoutingType:NMARoutingTypeFastest
transportMode:NMATransportModeCar
routingOptions:0];

4. Рассчитайте маршрут:

[routeManager calculateRouteWithStops:stops routingMode:routingMode];

5. Чтобы получить результаты расчета маршрута, реализуйте метод протокола NMARouteManagerDelegate routeManager: didCalculateRoutes: withError: violatedOptions: в своем классе делегата.

Примечание. Маршруты возвращаются, даже если вы получаете ошибку NMARouteManagerErrorViolatesOptions. Вы должны обрабатывать эти результаты маршрута, которые нарушают параметры маршрутизации.

-(void) routeManager: (NMARouteManager*)routeManager
  didCalculateRoutes:(NSArray*)routes
  withError:(NMARouteManagerError)error
  violatedOptions:(NSArray*)violatedOptions
{
  // If the route was calculated successfully
  if (!error && routes && routes.count > 0)
  {
    NMARoute* route = [routes objectAtIndex:0];
    // Render the route on the map
    mapRoute = [NMAMapRoute mapRouteWithRoute:route];
    [mapView addMapObject:mapRoute];
  }
  else if (error)
  {
    // Display a message indicating route calculation failure
  }
}

И вот что я пытаюсь сделать в Swift:

import UIKit



//I changed  the NMARouteManagerDelegate to my original class here
//and couldnt allow NSObject in the class delegation because it conflicts with UIViewController
class TestViewController: UIViewController, NMARouteManagerDelegate {
var mapCircle:NMAMapCircle?




@IBOutlet weak var mapView: NMAMapView!


@IBAction func get_route_action(sender: AnyObject) {


doRouting()

}

let routeManager = NMARouteManager.sharedRouteManager()



 func doRouting() {

 let geoCoord1 = NMAGeoCoordinates(latitude:41.350949, longitude:-74.182097)
 let geoCoord2 = NMAGeoCoordinates(latitude:41.3437502, longitude:-74.1624284)
 let stops = [geoCoord1, geoCoord2]
 routeManager.calculateRouteWithStops(stops)
 }




 func routeManager(routeManager: NMARouteManager!, didCalculateRoutes routes: [AnyObject]!, withError error: NMARouteManagerError, violatedOptions: [AnyObject]!) {
 print(routes)
 print(error)
 print(violatedOptions)
 guard error == NMARouteManagerError.None else {
 print("Route calculation error: \(error)")
 return
 }
 guard let routes = routes, route = routes[0] as? NMARoute else {
 print("Route calculation error: no routes")
 return
 }

 let mapRoute = NMAMapRoute(route: route)
 // Render the route on the map
 mapView.addMapObject(mapRoute)
 }




override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    //mapView.useHighResolutionMap = true
    var coordinates: NMAGeoCoordinates
    coordinates = NMAGeoCoordinates(latitude: 41.350949, longitude: -74.182097)
    mapView.zoomLevel = 13.2
    mapView.setGeoCenter(coordinates, withAnimation: NMAMapAnimation.Linear)
    mapView.copyrightLogoPosition = NMALayoutPosition.BottomCenter
    addMapCircle()
}

func addMapCircle() {
    if mapCircle == nil {
        let coordinates: NMAGeoCoordinates =
            NMAGeoCoordinates(latitude: 41.350949, longitude: -74.182097)
        mapCircle = NMAMapCircle(geoCoordinates: coordinates, radius: 50)
        mapView.addMapObject(mapCircle)
    }
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}

person Chaim Friedman    schedule 02.06.2016    source источник
comment
А на какой строке ошибка?   -  person matt    schedule 02.06.2016
comment
Никаких ошибок в Xcode! У компилятора нет проблем с моим кодом. Я получаю сообщение об ошибке из HERE API, что я не аутентифицирую должным образом, что сбило с толку как меня, так и людей HERE. Я предполагаю, что что-то не отправляется должным образом вместе с моей версией Swift по сравнению с инструкциями Objective-C.   -  person Chaim Friedman    schedule 02.06.2016
comment
Но в какой строке вашего кода снова появляется ошибка ЗДЕСЬ?   -  person matt    schedule 02.06.2016
comment
Приносим извинения за задержку в следующей строке: let routeManager = NMARouteManager.sharedRouteManager (), а ошибка: NMAKit FATAL: лицензионный ключ, идентификатор приложения или код приложения не установлены. (lldb)   -  person Chaim Friedman    schedule 02.06.2016
comment
Поместите точку останова в эту строку, а также поместите точку останова в строки, где, по вашему мнению, установлены лицензионный ключ, идентификатор приложения и код приложения, и посмотрите, что на самом деле выполняется первым. Я не вижу, чтобы вы устанавливали какой-либо лицензионный ключ и т. Д., И ваш let routeManager происходит в тот момент, когда создается ваш TestViewController, что заставляет меня думать, что вы действительно вызываете let routeManager преждевременно.   -  person matt    schedule 02.06.2016
comment
Я поставил точку останова на этой строке, и эта ошибка исчезла. Учетные данные предоставляются прямо в верхней части App.Delegate.swift следующим образом: func application (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) - ›Bool {NMAApplicationContext.setAppId (: etc.   -  person Chaim Friedman    schedule 02.06.2016


Ответы (1)


Я попробовал ваш код, и в основном у меня работал нормально.

Но я дополнительно добавил учетные данные в AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        NMAApplicationContext.setAppId(YourAppID, appCode: YourToken, licenseKey: YourKey);
        return true;
    }

Это очень важно, так как если он отсутствует, он выдает именно ту ошибку, которую вы получили.

person Marco    schedule 03.06.2016
comment
Ничего себе, это так странно, потому что мои учетные данные установлены именно так в AppDelegate.swift. Вы уверены, что попробовали мой код ТОЧНО, как я разместил его выше? Пожалуйста, ответьте еще раз. Потому что, если это так, значит, мои учетные данные работают с обычным сопоставлением, но не одобрены для маршрутизации. Я займусь этим с людьми ЗДЕСЬ прямо сейчас. - person Chaim Friedman; 03.06.2016
comment
Марко, еще раз, пожалуйста, ответь мне. Вы пробовали мой точный код Swift или хотите сказать, что он работает в Objective C? - person Chaim Friedman; 03.06.2016
comment
Я взял этот быстрый пример tcs.ext.here.com/sdk_examples/SwiftExample.zip и добавил свой код расчета маршрута и делегата. - person Marco; 04.06.2016
comment
Убедитесь, что вы установили код, токен И лицензионный ключ. В некоторых старых примерах иногда отсутствует лицензионный ключ. - person Marco; 04.06.2016
comment
Теперь все работает. Было несколько вещей. В основном вы не можете вызвать функцию doRouting () сразу с самого начала класса, поскольку в то время у нее еще нет карты. С аутентификацией все в порядке. Теперь у меня есть для этого полный рабочий код Swift. Если кто-нибудь хочет взглянуть, пожалуйста, свяжитесь со мной. - person Chaim Friedman; 06.06.2016