2017-02-20 20 views
0

我在Swift中为Cordova创建了一个自定义插件。一般来说它是“工作”的,因为我可以通过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() 
      } 
     } 
    } 
}