CLLocationManager,didEnterRegion和UILocalNotification

时间:2013-11-03 20:24:22

标签: ios objective-c cllocationmanager uilocalnotification

因此经过多次试验和错误以及阅读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自动处理的。

0 个答案:

没有答案