2017-02-20 30 views
0

Я создал пользовательский плагин для Кордовы в Свифт. Вообще говоря, это «работает», так как я могу общаться с ним через JavaScript. Все нормально, пока я не попытаюсь вызвать метод, определенный в одном из моих классов. В данный момент я получаю сообщение EXC_BAD_ACCESS ошибка при вызове метода locationService.authorizeLocationServices.Swift плагин в Кордове, вызывающий EXC_BAD_ACCESS

import Foundation 
import CoreLocation 

@objc(DBT) class DBT : CDVPlugin { 
    var locationService: LocationService = LocationService() 

    func authorizeLocationServices(_ command: CDVInvokedUrlCommand) { 
     let delegate = commandDelegate! 

     locationService.authorizeLocationServices(success: { 
      delegate.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "All OK"), callbackId:command.callbackId) 
     }, fail: { 
      delegate.send(CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: "Not good, not good..."), callbackId:command.callbackId) 
     }) 
    } 
} 

class LocationService : NSObject, CLLocationManagerDelegate { 
    var locationManager = CLLocationManager() 
    var authorizationSuccessCallback: (() ->())? 
    var authorizationFailureCallback: (() ->())? 

    override init() { 
     super.init() 

     locationManager.delegate = self 
    } 

    func authorizeLocationServices(success successCallback: @escaping() ->(), fail failureCallback: @escaping() ->()) { 
     authorizationSuccessCallback = successCallback 
     authorizationFailureCallback = failureCallback 

     if CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways { 
      locationManager.requestAlwaysAuthorization() 
     } else { 
      successCallback() 
     } 
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
     if status == CLAuthorizationStatus.authorizedAlways { 
      if let callback = authorizationSuccessCallback { 
       callback() 
      } 
     } else { 
      if let callback = authorizationFailureCallback { 
       callback() 
      } 
     } 
    } 
} 

Я отлажена код, и выглядит это вызвано, например locationService, но я не знаю, почему.

ответ

0

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

import Foundation 
import CoreLocation 

@objc(DBT) class DBT : CDVPlugin { 
    var locationService: LocationService? 

    func authorizeLocationServices(_ command: CDVInvokedUrlCommand) { 
     locationService = LocationService() 

     if let service = locationService { 
      service.authorizeLocationServices(success: { 
       self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "All OK"), callbackId:command.callbackId) 
      }, fail: { 
       self.commandDelegate!.send(CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: "Not good, not good..."), callbackId:command.callbackId) 
      }) 
     } 
    } 
} 

class LocationService : NSObject, CLLocationManagerDelegate { 
    var locationManager = CLLocationManager() 
    var authorizationSuccessCallback: (() ->())? 
    var authorizationFailureCallback: (() ->())? 

    override init() { 
     super.init() 

     locationManager.delegate = self 
    } 

    func authorizeLocationServices(success successCallback: @escaping() ->(), fail failureCallback: @escaping() ->()) { 
     authorizationSuccessCallback = successCallback 
     authorizationFailureCallback = failureCallback 

     if CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways { 
      locationManager.requestAlwaysAuthorization() 
     } else { 
      successCallback() 
     } 
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
     if status == CLAuthorizationStatus.authorizedAlways { 
      if let callback = authorizationSuccessCallback { 
       callback() 
      } 
     } else { 
      if let callback = authorizationFailureCallback { 
       callback() 
      } 
     } 
    } 
}