在CoreLocation中使用新的CLVisit

时间:2014-06-22 20:21:02

标签: swift core-location ios8

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

有谁知道它为什么不起作用? 所有.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.
}


}

3 个答案:

答案 0 :(得分:7)

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

启发式CLVisit用于确定"访问"没有记录,但根据WWDC视频,你必须保持一些不确定的时间,然后CLVisit决定你正在访问而不仅仅是路过。获得委托回调的成功非常有限。一旦到达大约在两个地点大约两分钟之后就开始了,大约十分钟之后,大部分时间都没有一次访问。

如果你外出时,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

答案 1 :(得分:4)

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

这适合我(我在iPad mini第二代上使用iOS 8,beta 2):设置NSLocationAlwaysUsageDescription键,在功能中启用“位置更新”后台模式,并包括以下内容AppDelegate

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的示例应用程序。

答案 2 :(得分:1)

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

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

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

纬度:xx.1185726857039 经度:-xxx.7793685278068 到达时间:2014-06-26 5:59 AM departureDate:distantFuture

早些时候,我把它拿出去了很多次,偶尔也会开火。