IOS地理围栏后台提醒

4
我正在开发一个应用程序,使用区域监控来提醒用户接近某些地标。一切都工作正常,但当应用程序处于后台时,我无法收到提醒。当我打开应用程序时,所有提醒都会弹出。我希望在应用程序后台运行时也能收到提醒。我想知道是否可能或者是否需要该应用程序在运行中才能获取提示?任何帮助都将不胜感激。
更新:问题似乎是我使用了警报而不是本地通知。这是我使用的代码:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Entered Region - %@", region.identifier);
    [self showRegionAlert:@"You are near: " forRegion:region.identifier];
}

如何将此更改为本地通知?

2
在您的 Info.plist 文件中,您是否将 location 声明为您的 UIBackgroundModes - yeesterbunny
实际上我已经做了,这就是为什么我认为它仍然可以跟踪位置的变化,这样当我运行应用时,所有的警报都会一个接一个地弹出,只是当应用在后台运行时没有弹出。 - XpApp
1
当你说你“没有收到警报”时,是指在到达地标时生成了UIAlertViews吗?这样做不起作用,因为在后台时无法显示警报。如果你还没有使用UILocalNotifications,那么你应该使用它们。 - Peter E
1
你说得对,我实际上正在使用UIAlertviews,现在很清楚了,切换到本地通知有什么线索吗? - XpApp
抱歉晚回复,我没有看到你的后续评论。请查阅UILocalNotification的文档--你可能想要的方法是presentLocalNotificationNow: - Peter E
3个回答

7
请查看“测试您的应用程序区域监控”部分,网址为:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html 如果在前台和后台之间切换,则可能无法满足阈值条件并在将应用程序带回前台之前触发。
此外,当处于后台状态的应用程序收到通知时,只有很小的时间窗口可以处理消息。尝试进行网络请求可能会超时......
检查您的plist设置-仅在需要高精度定位时将位置声明为UIBackgroundModes。即使未定义位置,重要位置更改也可以工作。
确保调用locationManager:didUpdateLocations:和locationManager:didFailWithError:并且没有发布错误。
检查是否在plist中将ApplicationRunsInBackground设置为NO。
尝试实现AppDelegates applicationDidEnterBackground:,application:didFinishLaunchingWithOptions:等,以了解您在给定时间处于应用程序生命周期的哪个阶段。

1
谢谢你的回答。实际上我已经阅读了这篇文章,我的问题是当应用程序在后台监视区域时,我甚至可以在控制台中看到它,但问题是当应用程序仍然在后台时,我没有收到任何警报。当我启动它时,我会收到所有事件的警报,这些事件发生在它在后台时。 - XpApp
实际上问题似乎是我使用了UIAlert而不是本地通知,我已经更新了我的问题并附上了我使用的代码,你知道我如何将其切换到本地通知而不是警报吗? - XpApp
我发现http://www.icodeblog.com/2010/07/29/iphone-programming-tutorial-local-notifications/详细且有帮助。 - Niels Castle

0
  1. 关于地理围栏解决方案,您可以参考@Niels Castle提供的答案。
  2. 关于本地通知,您可以参考以下代码:
UILocalNotification* localNotification = [[UILocalNotification alloc] init];

localNotification.alertBody = @"I'M IN THE REGION";

localNotification.userInfo = [[NSDictionary alloc]initWithObjectsAndKeys:@"nearBy",@"type", nil];

localNotification.timeZone = [NSTimeZone defaultTimeZone];

localNotification.soundName = UILocalNotificationDefaultSoundName;

[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];

0
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"Yes! Welcome to %@",region.identifier);
    UILocalNotification* notify = [UILocalNotification new];
    notify.alertBody = [NSString stringWithFormat:@"Welcome to %@",region.identifier];
    notify.soundName = UILocalNotificationDefaultSoundName;
    if (notify.applicationIconBadgeNumber == 0) {
        notify.applicationIconBadgeNumber = 1;
    }
    [[UIApplication sharedApplication] presentLocalNotificationNow:notify];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接