因此经过多次试验和错误以及阅读Apples文档和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文件在模拟器上进行测试以在边界上移动位置时,两种方案都可以完美地工作。但是,在测试应用程序时,当应用程序处于后台时,通知似乎不会触发,直到您唤醒设备。即。您可以越过边界并且没有任何反应,然后当您解锁设备时,它会振动,它会振动并且视图会相应地改变。 (如果解锁时应用程序不是最重要的,那么在重新启动应用程序之前不会发生这种情况。)
我应该在appDidFinishLaunchingWithOptions中进行此设置吗?在我的测试中,该方法和didRecieveLocalNotification:在app委托之前不会被调用,直到'之后'通知被触发并且用户通过操作通知重新启动了应用程序(此时你可以检查为在选项数组中启动密钥),这似乎对于作为didEnterRegion的一部分的通知的初始触发没有任何用处。目前我在这两种方法中都没有代码。
据我所知,我不需要为didEnterRegion做任何后台位置更新,这是由iOS自动处理的。