【问题标题】:Using the new CLVisit in CoreLocation在 CoreLocation 中使用新的 CVisit
【发布时间】:2014-08-12 20:55:22
【问题描述】:

我没有找到任何关于 CVisit 的内容,所以我正在尝试自己探索这项技术。

有谁知道为什么它不起作用? 所有 .plist 键都已设置并可以正常工作。

class ViewController: UIViewController,CLLocationManagerDelegate {

var manager:CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    manager = CLLocationManager()
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestAlwaysAuthorization()
    manager.startMonitoringVisits()


}


func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {

}
func locationManager(manager: CLLocationManager!,
    didVisit visit: CLVisit!)
{
    println("visit: \(visit.coordinate.latitude),\(visit.coordinate.longitude)")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

【问题讨论】:

    标签: swift core-location ios8


    【解决方案1】:

    您的代码看起来正确。我还发现 CLVisit 并没有按照我理解的方式工作。调试起来很棘手,因为您实际上必须离开工作区才能对其进行测试。 :)

    CLVisit 用于确定“访问”的启发式方法未记录在案,但根据 WWDC 视频,您必须等待一段时间才能确定您正在访问,而不仅仅是路过。我获得委托回调的成功非常有限。一旦到达日期访问在一个位置大约两分钟后触发,另一个大约十分钟后触发,但大多数情况下不会触发任何访问。

    如果您外出,NSLog 无法捕获 CLVisits,因此我设置了一个简单的核心数据实体并记录所有访问:

        Visits *thisVisit = [NSEntityDescription insertNewObjectForEntityForName:@"Visits" inManagedObjectContext:[self managedObjectContext]];
        thisVisit.arrivalDate = visit.arrivalDate;
        thisVisit.departureDate = visit.departureDate;
        thisVisit.latitude = [NSNumber numberWithDouble:visit.coordinate.latitude];
        thisVisit.longitude = [NSNumber numberWithDouble:visit.coordinate.longitude];
        [self saveContext];
    

    即使我的设备已经在我的家中呆了好几个小时,当我离开或返回时,我也不会始终收到到达或离开事件。

    编辑:这是一个完整的示例。安装并使用几天,你就会发现这个新 API 的问题。我希望它在以后的测试版中能更好地工作。 对我来说这仍然很不一致 - 有时连续两次到达,有时连续两次离开,访问火灾前的长时间延误......

    https://github.com/steveschauer/TestCLVisit

    【讨论】:

    • 所以 ClVisit 有很多问题,我们应该等待第三个测试版...我在两个地方呆了 1 个多小时,没有任何标记(我使用 NSUserdefaults 来存储访问。
    • 我正在使用 beta 2 并且可以可靠地收到通知。在我(有限的)经验中,出发通知会更及时,因此通常只有在离开特定位置时才会收到访问通知。
    【解决方案2】:

    我假设您在应用程序处于后台时尝试获取这些委托调用;但是,您在不会被实例化的视图控制器中实例化 CLLocationManager (afaik)。

    这对我有用(我在 iPad mini 2nd gen 上使用 iOS 8,beta 2):设置 NSLocationAlwaysUsageDescription 键,在 Capabilities 中启用“位置更新”背景模式,并在 @987654323 中包含以下内容@:

    let locationManager = CLLocationManager()
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
        locationManager.startMonitoringVisits()
    
        return true
    }
    
    func locationManager(manager: CLLocationManager!, didVisit visit: CLVisit!) {
        println("Visit: \(visit)")
        // I find that sending this to a UILocalNotification is handy for debugging
    }
    

    更新:我已将一个示例应用程序推送到https://github.com/mloughran/CLVisit-POC

    【讨论】:

    • 在设备上为我工作。我不知道如何在模拟器 tbh 中进行测试。
    • 好的,无法让 CLLocationManager 在 Beta 2 设备上为我工作。尝试了所有建议。认为自己很幸运;-)
    • 我添加了一个演示应用程序 - 看看它是否适合您?
    • 如果苹果能给我们一种模拟 CLVisits 的方法,这样我们就可以在不用开车绕城而行的情况下进行测试,那就太好了。有人对模拟这些访问有什么想法吗?
    • 我在考虑使用 GPX 文件.. 但不知道硬件将如何选择访问。一次访问需要多少特定时间才能成为 CVisit? @mloughran 请对此有所了解。当您测试 github 项目时,您在特定位置停留了多长时间?当应用程序被杀死时这也有效吗??
    【解决方案3】:

    我开始认为这个 API 有一个服务器组件。我的测试应用程序确实在 AppDelegate 中设置,并且在没有代码更改的情况下,它在过去几天内开始间歇性地触发访问。但它漏掉了一些,似乎又创造了一些。

    这是我的应用记录的最后两次访问。这些点基本相同(相距约 30 英尺)。我认为先到是准确的,但出发不是。第二次访问的到来绝对没有发生。我的测试设备在那段时间没有离开家。

    纬度:xx.11852879438132 经度:-xxx.7792256808099 到达日期:2014-06-25 12:19 PM 出发日期:2014-06-25 4:44 PM

    纬度:xx.1185726857039 经度:-xxx.7793685278068 到达日期:2014-06-26 5:59 AM 出发日期:遥远的未来

    早些时候我把它拿出来,大约有很多次,只是偶尔会被火烧。

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 2014-08-17
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多