背景中的信标范围

Posted

技术标签:

【中文标题】背景中的信标范围【英文标题】:Beacon range in background 【发布时间】:2016-10-04 14:21:01 【问题描述】:

我正在开发一个连接到信标的应用程序。我能够运行该应用程序并在应用程序处于后台时检测信标(我在 didRangeBeacons 方法中发送本地通知并收到它们)。当检测到信标时,我需要在后台运行一段代码。我能怎么做?我试图在发送本地通知后准确地编写我的 Alamofire 调用,但没有任何反应。一些建议?

【问题讨论】:

【参考方案1】:

当应用程序在后台并收到didRangeBeacons 回调时,它在被挂起之前只有 5 秒被操作系统运行。这将关闭当时打开的所有 Web 服务连接。您可以根据要求将此后台运行时间从 5 秒延长到 180 秒。下面是 Swift 3 中的一个示例,展示了如何做到这一点。

var threadStarted = false
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid

func extendBackgroundRunningTime() 
  if (self.backgroundTask != UIBackgroundTaskInvalid) 
    // if we are in here, that means the background task is already running.
    // don't restart it.
    return
  

  print("Attempting to extend background running time")

  self.backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "DummyTask", expirationHandler: 
    UIApplication.shared.endBackgroundTask(self.backgroundTask)
    self.backgroundTask = UIBackgroundTaskInvalid
  )

  if threadStarted 
    print("Background task thread already started.")
  
  else 
    threadStarted = true
    DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async 
      while (true) 
        // A dummy tasks must be running otherwise ios suspends immediately
        Thread.sleep(forTimeInterval: 1);
      
    
  

通过添加这样的代码,您的 Web 服务调用更有可能在 iOS 暂停您的应用程序之前完成。

您可以通过 didRangeBeaconsdidEnterRegion 方法调用 extendBackgroundRunningTime()

【讨论】:

它似乎工作得很好!谢谢!我只是在调试器中一段时间​​后导致此消息的 didRangeBeacons 方法出现问题:“由于内存问题而终止”。我想这是由于 Web 服务调用过多引起的,所以我现在必须以某种方式来规范调用 很明显,您不能在每个测距回调中触发 Web 服务调用——这将每秒排队一个。我可能会在通话进行时设置一个标志,在它返回时清除它,如果设置了标志,则不要进行新的通话。 是的,这可能是一个想法,甚至可以持久保存最后一次调用的时间戳并仅在当前时间戳至少在最后一次调用 5 分钟后创建一个新的时间戳,某事像这样。【参考方案2】:

当您收到 didEnter/didRange 回调时,您只有有限的时间在后台执行操作。

您应该结帐background tasks 以获得更多时间在后台调用您的服务器。

【讨论】:

以上是关于背景中的信标范围的主要内容,如果未能解决你的问题,请参考以下文章

iOS 范围检测具有预定义接近度 UDID 的信标

iBeacon:何时向服务器发送信标事件

节能信标组:让我们一起来内卷

智能车竞赛技术报告 | 节能信标组 - 兰州交通大学 - 先锋队

离子 ios 应用程序中的 didRangeBeaconsInRegion 事件中的信标数组为空

一旦我超出范围并再次进入该区域,就不会扫描信标