2017-02-20 19 views
0

SwiftのCordova用のカスタムプラグインを作成しました。私はJavaScriptを使ってそれと通信することができるので、一般的には "働いている"と言います。私のクラスの1つで定義されたメソッドを呼び出そうとするまでは、すべて問題ありません。この時点で私はを取得していますlocationService.authorizeLocationServicesメソッドを呼び出すときにEXC_BAD_ACCESSエラーが発生しています。Cordovaの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() 
      } 
     } 
    } 
} 
関連する問題