从非视图快速请求地理定位

Posted

技术标签:

【中文标题】从非视图快速请求地理定位【英文标题】:Swift request geolocation from non-view 【发布时间】:2017-03-26 20:54:32 【问题描述】:

我正在尝试在任意类中获取地理位置数据。我对 Swift 很陌生,所以我不知道为什么这不起作用?

有什么建议吗?

import Foundation
import UIKit
import CoreLocation

class GeolocationPlugin:NSObject, CLLocationManagerDelegate 
  var locationManager: CLLocationManager!
  var lat: Double = 0
  var long: Double = 0

  func getLocation() 
    print("Getting location")

    // For use in foreground
    self.locationManager = CLLocationManager()
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
//    locationManager.startMonitoringSignificantLocationChanges()


    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError) 
      print("Error while updating location " + error.localizedDescription)
    

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [CLLocation]) 
      let locValue:CLLocationCoordinate2D = manager.location!.coordinate
      print("locations = \(locValue.latitude) \(locValue.longitude)")
    


    self.locationManager.requestLocation()

    print("gets here")
  

我目前看到Getting location,然后出现错误:

2017-03-26 15:42:32.634 IonicRunner[42304:5668243] *** Assertion failure in -[CLLocationManager requestLocation], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework_Sim/CoreLocation-2100.0.34/Framework/CoreLocation/CLLocationManager.m:865
2017-03-26 15:42:32.638 IonicRunner[42304:5668243] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Delegate must respond to locationManager:didUpdateLocations:'

【问题讨论】:

【参考方案1】:

最终的解决方案是将方法移出getLocation(),以正确激活模拟器中的位置,并移动该类的启动位置,因此不会在getLocation() 立即发布完成。

import Foundation
import UIKit
import CoreLocation

class GeolocationPlugin:NSObject, CLLocationManagerDelegate 
  var locationManager = CLLocationManager()
  var lat: Double = 0
  var long: Double = 0
  var cb: ((Double, Double) -> Void)? = nil

  func getLocation(callback: @escaping (Double, Double) -> Void) 
    print("Getting location")

    // For use in foreground
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

    self.locationManager.requestLocation()
    self.cb = callback
  

  func locationManager(_ manager: CLLocationManager, didFailWithError error: NSError) 
    print("Error while updating location " + error.localizedDescription)
  

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    //print("locations = \(locValue.latitude) \(locValue.longitude)")

    if( self.cb != nil) 
      self.cb!(locValue.latitude, locValue.longitude)
    
  

【讨论】:

以上是关于从非视图快速请求地理定位的主要内容,如果未能解决你的问题,请参考以下文章

浏览器允许/禁止地理定位请求按钮

未经许可的地理定位[重复]

请求权限地理定位插件cordova

重试地理定位请求而不刷新浏览器

(反应原生)如何使用地理定位将地图视图集中在用户身上

请求具有最低精度要求的地理定位