使用iBeacons在iOS中长时间运行后台任务

使用iBeacons在iOS中长时间运行后台任务,ios,swift,location,ibeacon,estimote,Ios,Swift,Location,Ibeacon,Estimote,我想做以下工作: 如果用户在CLBeaconRegion中停留了很长一段时间(大约15分钟),我希望能够执行一些代码。如果应用程序在前台,这个问题很小,但是我在将后台时间延长到分配的时间时遇到了问题。因为我使用的是定位服务,所以应该允许运行如此长的后台任务 只有当用户移动时,才会在后台调用didEnterRegion和didextregion。似乎没有任何特定于位置的API允许您根据时间执行后台任务 似乎还有其他类似的问题想要实现同样的目标,比如上面提到的所有线程。但是,建议的解决方案似乎不适用

我想做以下工作:

如果用户在
CLBeaconRegion
中停留了很长一段时间(大约15分钟),我希望能够执行一些代码。如果应用程序在前台,这个问题很小,但是我在将后台时间延长到分配的时间时遇到了问题。因为我使用的是定位服务,所以应该允许运行如此长的后台任务

只有当用户移动时,才会在后台调用
didEnterRegion
didextregion
。似乎没有任何特定于位置的API允许您根据时间执行后台任务

似乎还有其他类似的问题想要实现同样的目标,比如上面提到的所有线程。但是,建议的解决方案似乎不适用于
CLBeaconManager
(这主要涉及在
backgroundtimereserving
足够小时禁用和启用
CLLocationManager
,但我最初尝试使用此解决方案时没有成功)

另一种在有限范围内完成此操作的方法是在15分钟内安排通知,然后在
didExitRegion
中取消通知


然而,上面的解决方案让人觉得要么很粗糙,要么不够充分。是否有一种“优雅”的方式来实现我想要的功能?

只要您在Info.plist中请求了位置背景模式,您的
backgroundTimeRemaining
应该返回一个非常大的值,基本上表示无限的背景运行时间。这应该允许您在
didEnterRegion
方法中放入这样的代码块,并将其关闭

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(15*60 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
    print("It's been 15 minutes since we entered the beacon region.")
}

我注意到,在研究运行后台线程的技术时,通过将location background模式放在Info.plist中,可以获得无限的后台运行时间。您可以查看链接中的代码,了解我是如何启动后台线程的。

只要您在Info.plist中请求了位置后台模式,您的
backgroundTimeRemaining
应该返回一个非常大的值,基本上表示无限后台运行时间。这应该允许您在
didEnterRegion
方法中放入这样的代码块,并将其关闭

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(15*60 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
    print("It's been 15 minutes since we entered the beacon region.")
}

我注意到,在研究运行后台线程的技术时,通过将location background模式放在Info.plist中,可以获得无限的后台运行时间。您可以查看链接中的代码,了解我是如何启动后台线程的。

我在Info.plist中启用了位置后台模式。检查
didEnterRegion
中的
backgroundTimeRemaining
确实表明它是无限的。但是,一段时间后检查
backgroundTimeRemaining
表明它仍然从180秒开始倒计时。我想知道区别是否在于我打开了测距功能?如果这样做有效的话,也许你可以做15分钟的测距,然后在15分钟结束后停止。不幸的是,我无法复制你的结果。(我想我无论如何都不想让测距保持15分钟)测距给出了无限的
backgroundtime剩余时间
大约5秒,然后它又开始倒计时。你是说仅仅启用位置后台模式就可以提供无限的后台时间吗?这似乎与很多关于背景模式的文献相反。你确定你的“UIBackgroundModes”键带有数组项“location”吗?我在Info.plist中启用了位置背景模式。检查
didEnterRegion
中的
backgroundTimeRemaining
确实表明它是无限的。但是,一段时间后检查
backgroundTimeRemaining
表明它仍然从180秒开始倒计时。我想知道区别是否在于我打开了测距功能?如果这样做有效的话,也许你可以做15分钟的测距,然后在15分钟结束后停止。不幸的是,我无法复制你的结果。(我想我无论如何都不想让测距保持15分钟)测距给出了无限的
backgroundtime剩余时间
大约5秒,然后它又开始倒计时。你是说仅仅启用位置后台模式就可以提供无限的后台时间吗?这似乎与很多关于背景模式的文献相反。你确定你有带有数组项“location”的“UIBackgroundModes”键吗?