当应用程序没有运行时,iBeacon通知
当信标在范围内时,我设法做出一个iBeacon,在我的iPhone上触发一个本地推送通知。 当应用程序处于后台模式时,它是完美的工作。
我的问题是:即使应用程序未运行,即使在后台,我是否可以触发通知?
我认为这是可能的,但我不确定。 如果是这样,我怎么能做到这一点?
谢谢!
是的,这是可能的,应该是自动的。
创buildCLBeaconRegion并开始对其进行监控后,定位服务将会跟踪您的手机是否在该地区,即使您的应用程序未运行。 如果您的应用在转换过程中没有运行,iOS会将您的应用启动到后台几秒钟,以调用相应的CLLocationManagerDelegate方法。
我通过我自己的应用程序进行了实验,发现了上述行为,但也通过Apple的AirLocate示例程序见证了上述行为。 使用AirLocate,如果您设置了监控区域,然后重新启动您的手机,AirLocate将在手机进入该区域后立即发送本地通知。
testing时要小心,因为在iOS识别区域状态转换之前,有时在打开/closuresiBeacon之后最多需要4分钟。 编辑 :从iPhone 5开始,应用程序通常会在几秒钟内使用硬件加速来检测信标,如果硬件加速不可用,最多可能需要15分钟。
编辑:作为iOS 8,你需要确保你已经调用并成功地获得locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
只允许在前台检测到信标。
我已经发布了详细的讨论如何在这篇博客文章中工作。
好吧,我已经得到了这个工作正确,并尝试围绕它,所以这里是答案。 在应用程序终止之后(假设您的应用程序在前台运行时),在跨越信标区域边界时,您需要做的就是调用您的应用程序:
- 你必须在你的
AppDelegate.m
模块中实现一个CLLocation
委托。 这个委托是由iOS调用的,所以如果你没有AppDelegate.m
的CLLocation
委托代码,当你的应用程序被终止时,你将无法响应iOS。 这就是Apple的AirLocate示例应用程序所做的。
所以,在AppDelegate.m
里面你需要以下的东西(你也需要在CoreLocation.h
链接):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // This location manager will be used to notify the user of region state transitions when the app has been previously terminated. self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; return YES; }
-
在
AppDelegate.m
,你需要实现locationManager的didDetermineState方法,像这样:-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{ UILocalNotification *notification = [[UILocalNotification alloc] init]; if(state == CLRegionStateInside) { notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier]; } else if(state == CLRegionStateOutside) { notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier]; } else { return; } [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; }
– >因此,如果您的应用程序已被终止(它必须至less运行一次),那么当设备在监视的信标边界上转换时,iOS将调用您的应用程序并调用AppDelegate.m中的locationManager:didDetermineState
方法模块。 在这个方法里面,你可以设置并调用presentLocalNotificationNow。 如果您的应用程序不在前台,iOS会在屏幕上显示通知,即使它被locking。 用户将不得不调用应用程序的更多信息。
我很确定内存压力与此无关。 另外,设置notifyEntryStateOnDisplay
也没有这个问题。 设置notifyEntryStateOnDisplay
仅在用户打开iOS设备显示(即点击“home”或左上angularbutton)时使用。 如果用户这样做,并且notifyEntryStateOnDisplay
为TRUE
,并且设备位于正在监视的信标区域内,那么当时您会在显示屏上收到通知。 如果此属性设置为FALSE
,则不会。
当然,你需要运行iOS 7.1才能正常工作。
有关更多详细信息,请访问Apple的文档
您需要将CLaeaconRegion的notifyEntryStateOnDisplay = YES切换为系统唤醒您的应用程序以进行iBeacon进入/退出事件。
但是有一个棘手的部分。 如果您的应用程序未运行,则系统将仅唤醒您的应用程序以进行信标进入/退出处理,前提是您的应用程序因系统内存压力而被终止。 如果用户通过在任务视图中向上滑动来杀死应用程序,则系统不会唤醒您的应用程序。 要validation这种行为,启动你的应用程序,把它放到后台,然后连续启动几个内存消耗的应用程序。 由于内存压力,在我的应用程序被系统终止之前,我启动了几个3D游戏。
只需将您的iOS版本升级到7.1,并设置“notifyEntryStateOnDisplay = YES”,即使应用程序未运行,它也应该像魅力一样工作。 我之前遇到过这个问题,但是一旦我升级了,就会得到修复! 请享用..
我能够完成这项工作的唯一方法是通过监视主要的位置变化,这似乎是伎俩。 被警告我没有testing过所有的设备或用例场景。
是的,我们可以在终止状态或后台状态下呈现本地通知,只需按照以下步骤操作,
1)使用CLLocationManager类启动位置pipe理器。
locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.desiredAccuracy=kCLLocationAccuracyBest; locationManager.distanceFilter=kCLDistanceFilterNone;
2)创buildCLBeaconRegion,
CLBeaconRegion *beacon_Region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:mjorVa minor:minorVa identifier:identifier]; beacon_Region.notifyEntryStateOnDisplay = YES; beacon_Region.notifyOnEntry=YES; beacon_Region.notifyOnExit=YES;
3)实施两个位置pipe理器委托方法,
-didEnterRegion -didExitRegion
上述两个位置pipe理器的方法,即使你的应用程序被杀死或在后台工作。 系统会跟踪你的信标,当它超出范围时,系统将会触发didExitRegion方法,当系统进入系统时会触发didEnterRegion方法。