因此,经过多次试验和错误并阅读 Apple 文档和 SO 线程后,我认为我的 didEnterRegion 工作正常。
这就是我完成的...
- (void)locationManager:(LocationManager *)locationManager didEnterRegion:(CLRegion *)region{
NSLog(@"Location manager did enter region called");
[self.locationManager stopUpdatingLocation];
if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
UILocalNotification *localNotification = [[UILocalNotification alloc]init];
localNotification.alertBody = @"You are about to arrive";
localNotification.alertAction = @"Open";
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1;
[[UIApplication sharedApplication]presentLocalNotificationNow:localNotification];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"App Running in foreground notification fired");
[self setupAlarmTriggeredView];
//vibrate device
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
});
}
}
如您所见,它会简单检查应用程序是否处于活动状态,如果没有,它会设置一个 UILocalNotification 立即呈现,如果它只是振动并更改视图。
当在模拟器上使用 GPX 文件将位置移动到边界上时,这两种情况都可以完美运行。但是,在测试应用程序时,当应用程序在后台时,通知似乎不会触发,直到您唤醒设备。IE。您可以越过边界并且没有任何反应,然后当您解锁设备时,繁荣,它会振动并且视图会相应更改。(如果您解锁时应用程序不是最重要的,则在您重新启动应用程序之前不会发生这种情况)。
我应该在 appDidFinishLaunchingWithOptions 中进行此设置吗?在我对该方法和 didRecieveLocalNotification 的测试中:在应用程序委托中,直到“在”通知被触发并且用户通过操作通知重新启动应用程序时才被调用(此时您可以检查选项数组中的启动键),这对于作为 didEnterRegion 的一部分的通知的初始触发似乎没有任何用处。目前我在这两种方法中都没有代码。
据我所知,我不需要为 didEnterRegion 进行任何后台位置更新,这是由 iOS 自动处理的。