我没有找到任何关于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.
}
}
答案 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的问题。我希望它在以后的测试版中更好用。 它对我来说仍然相当不稳定 - 有时连续两次到达,有时连续两次离开,在访问之前长时间延迟......
答案 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
早些时候,我把它拿出去了很多次,偶尔也会开火。