首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序未运行时的iBeacon通知

应用程序未运行时的iBeacon通知
EN

Stack Overflow用户
提问于 2013-10-01 22:47:00
回答 6查看 55.8K关注 0票数 57

我成功地制作了一个iBeacon,当信标在范围内时,它会在我的iPhone上触发一个本地推送通知。当应用程序处于后台模式时,它就能很好地工作。

我的问题是:即使应用程序没有运行,即使在后台也不能触发通知吗?

我以为这是可能的,但我不确定。如果是这样,我怎样才能做到这一点呢?

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-10-02 01:47:29

是的,这是可能的,应该是自动的。

在您创建了一个CLBeaconRegion并开始对其进行监视之后,Location将跟踪您的手机是否在该区域内,即使您的应用程序没有运行。如果您的应用程序在过渡期间没有运行,iOS将在后台启动应用程序几秒钟,以调用适当的CLLocationManagerDelegate方法。

我通过对我自己的应用程序的实验发现了上述行为,但我也在苹果的AirLocate示例程序中看到了这种行为。使用AirLocate,如果您设置了一个监视区域,然后重新启动您的手机,AirLocate仍然会在手机进入该区域后立即发送本地通知。

测试时要小心,因为有时在打开/关闭iBeacon之后,iOS需要4分钟才能识别区域状态转换。编辑:从iPhone 5开始,应用程序通常会在几秒钟内使用硬件加速来检测信标,如果没有硬件加速,则最多需要15分钟。

编辑3: --从iOS 13开始,您必须确保用户实际上授予后台权限,而不是“只授予一次”或“在使用中”权限,这些权限是操作系统在向用户呈现的对话框中大力推动的。详情请参见这里

编辑2:从iOS 8开始,您需要确保已经调用并成功获得了locationManager.requestAlwaysAuthorization(),因为locationManager.requestWhenInUseAuthorization()只允许在前台检测信标。

我已经在这篇博文。中详细讨论了这一切是如何工作的。

票数 67
EN

Stack Overflow用户

发布于 2014-03-19 19:04:27

好的,我已经让它正确地工作了,并对它进行了实验,这就是答案。在应用程序终止后,当您穿越信标区域边界时(假设您的应用程序在前台正常工作),您需要这样做才能调用您的应用程序:

  1. 您必须在您的AppDelegate.m CLLocation 模块中实现CLLocation委托。这个委托是由iOS调用的,所以如果您在AppDelegate.m中没有CLLocation委托代码,那么当应用程序终止时,您将无法响应iOS。这就是苹果的AirLocate示例应用程序所做的工作。

因此,在AppDelegate.m内部需要以下内容(还需要在CoreLocation.h中链接):

代码语言:javascript
复制
- (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;
}
  1. AppDelegate.m内部,您需要实现locationManager didDetermineState方法,如下所示: -(LocationManager)CLLocationManager:(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;} if(state == CLRegionStateOutside) { notification.alertBody = NSString stringWithFormat:@"You if region %@",notification.alertBody;}state{ are;}{are;}[didDetermineState presentLocalNotificationNow:notification];}

->因此,如果您的应用程序已被终止(必须至少运行一次),当设备跨越您正在监视的信标边界时,iOS将调用您的应用程序并调用AppDelegate.m模块中的locationManager:didDetermineState方法。在此方法中,您可以设置并调用presentLocalNotificationNow。当这种情况发生时,如果您的应用程序不在前台,即使它被锁定,iOS也会在屏幕上显示通知。然后,用户将不得不调用该应用程序获得更多信息。

我很确定记忆压力与此无关。此外,设置notifyEntryStateOnDisplay也与此无关。设置notifyEntryStateOnDisplay只在用户打开iOS设备显示时使用(即点击"home“或左上角按钮)。如果用户这样做,并且notifyEntryStateOnDisplayTRUE,并且设备位于您正在监视的信标区域内,那么此时您将在显示器上得到一个通知。如果此属性设置为FALSE,则不会。

当然,您需要运行iOS 7.1才能正常工作。

欲了解更多细节,请访问苹果的文档

票数 18
EN

Stack Overflow用户

发布于 2014-02-06 00:25:21

您需要为系统切换notifyEntryStateOnDisplay=YES for CLBeaconRegion,以唤醒应用程序以处理iBeacon输入/退出事件。

但有一个棘手的部分。如果您的应用程序没有运行,系统只会唤醒您的应用程序,用于信标输入/退出处理,如果您的应用程序之前由于系统内存压力而终止。如果用户通过在任务视图中单击该应用程序而杀死应用程序,系统将不会唤醒您的应用程序。要验证这种行为,启动应用程序,将其放到后台,然后连续启动几个内存消耗应用程序。由于内存压力,在我的应用程序被系统终止之前,我发布了几款3D游戏。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19127282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档