【问题标题】:Estimote beacons not working on Iphone as expectedEstimote 信标无法按预期在 Iphone 上运行
【发布时间】:2016-12-08 14:59:09
【问题描述】:

我们的 Estimote 信标目标: 我们计划在高尔夫球场设置 Estimote 信标。我们的场景是每当玩家到达球洞时,比赛的节奏是什么,它应该被信标检测到并通过我们的 iPhone 应用程序响应服务器。 在这种情况下,用户不需要打开应用程序,因为手机就在他的口袋里,他正在玩游戏。

到目前为止我们做了什么:

  1. 仅当应用程序仅处于活动状态时,测距才有效。 (目标未实现)。
  2. 为了实现这个目标,我们正在使用监控,但问题是监控委托(didDetermineState state: for region:) 有时调用有时不调用(调用:立即、一些延迟和从不)。换句话说,iOS 并不总是通过监控来检测信标。 (目标未实现)。
  3. 如果我们在两部或多部具有相同 iOS 版本 10 的 iPhone 6s 上进行测试,每部手机都会有不同的结果,有些检测到,有些则没有。为了进行测试,我们使用翻转睡眠并在不同位置设置信标以触发进入/退出事件和最低广告间隔。
  4. 在 estimote 信标上实施了 edystone,当应用程序在后台时,它们不工作。 (目标未实现)。

我们尝试了以下在互联网或 estimote 信标论坛上找到的解决方案。

  1. 2013 年 11 月的文章 Ibeacon monitoring 但在 2016 年 12 月似乎没有什么不同。

  2. 我们还尝试通过 CoreLocationManager.startUpdatingLocation 进行后台测距: HereHere

  3. 我们试图说 Estimote,但他们的回答模棱两可,“我们很痛苦地意识到 iBeacon 监控有时可能有点挑剔。我们讨厌它,就像开发者试图构建基于信标的应用程序一样,但是当它谈到 iBeacon,我们很无奈,因为 Apple 的 API 处于锁定状态——iOS 上除了通过内置 API 之外没有其他方法可以检测 iBeacon 数据包,这会显示出这些问题。” 似乎有些可能。
  4. 这就是我注册信标数组的方式,目前我们有 3 到 6 个信标。

    func loadBeacons() { // Load beacons 
         self.beacons = getAllbeacons()
         self.beaconManager = ESTBeaconManager()
         self.beaconManager.delegate = self
         self.beaconManager.requestAlwaysAuthorization()
      if self.beaconManager.isAuthorizedForMonitoring() == true {
         self.rangingBeaconsSetup()
      } else {
        self.beaconManager.requestAlwaysAuthorization()
      }
     }
    
    
    func rangingBeaconsSetup() { // SET UP Ranging beacons
       for beacon in self.beacons {
     if let beaconRegion = self.beaconRegionFromItem(beacon) {
         beaconRegion.notifyEntryStateOnDisplay = true
         self.beaconManager.startMonitoring(for: beaconRegion)
         self.beaconManager.startRangingBeacons(in: beaconRegion)
       }
      }
     }
    
    func beaconRegionFrom(_ beacon: Beacon) -> CLBeaconRegion? { // GET VALID REGION
        let val = 1 << 16
        if let uuid = NSUUID(uuidString: beacon.uuid), beacon.major < val &&      beacon.minor < val {
     return CLBeaconRegion(proximityUUID: uuid as UUID, major:    CLBeaconMajorValue(beacon.major), minor: CLBeaconMinorValue(beacon.minor),   identifier: beacon.deviceName)
       }
      return nil
     }
    
      func beaconManager(_ manager: Any, didDetermineState state:   CLRegionState, for region: CLBeaconRegion) { // Monitoring delegate.
       if state == .inside {
       let notification = UILocalNotification()
       notification.alertBody = "By tapping you will be able to check-in"
       notification.alertAction = "OK"
       notification.fireDate = Date()
       application.scheduleLocalNotification(notification)
       }
      }
    
  5. 当我们拥有相同的 IOS 设备 (OS 10) 时,我们收到以下响应,它们的行为不一致。

相关问题:

  1. 我们对信标准确性的期望是否很高?
  2. 如果信标正在向所有手机广播数据,那么每个设备的行为必须相同,因为我们有相同的 IOS 版本、相同的 Iphone 和相同的代码。 我们怎样才能得到一致的结果 我们的经验是,检测“从几秒到 15 分钟不等,有时根本检测不到”

  3. 我们可以做些什么来获得一致和可靠的结果?

【问题讨论】:

    标签: ios iphone ibeacon estimote eddystone


    【解决方案1】:

    从您的问题描述来看,您遇到的核心问题是后台监控回调中的行为不一致。

    理论上,您应该能够获得一个监控回调,该回调在后台唤醒您的应用,并让它在后台运行 10 秒(如果您使用this technique,则可以延长到 3 分钟)每次信标第一次在受监视区域中检测到或每次在受监视区域中停止检测到所有信标时。这将触发 didEnterRegiondidExitRegion 回调。

    如您所见,有时这些回调不会按预期出现。这主要有两个原因:

    1. 您没有收到进入或退出回调,因为区域状态没有改变。当 iOS 认为它始终位于 CLBeacon 区域内时,通常会发生这种情况,而应用程序测试人员将 iOS 设备从信标附近短暂移除(通过移动手机或关闭信标)然后将其返回到该区域。在这种情况下,无法获得退出/进入序列通常是由于没有给 iOS 足够的时间来检测它是否已退出该区域。在后台,这可能需要长达 15 分钟。 大多数情况下,这纯粹是一个测试问题,而不是您的实际用户将面临的问题 - 测试人员面临完成测试的时间压力,因此他们通常只是等待的时间不够长这些测试用例。为何时发生区域退出添加日志记录、通知或其他见解可以帮助您的测试人员确保他们等待足够长的时间。

    2. 你不会很快得到一个入口回调,因为所有硬件加速槽都被填满了。为了在一两秒内检测信标并发送didEnterRegion回调,iOS依赖当检测到感兴趣的信标时,蓝牙硬件过滤器唤醒操作系统。问题是这些硬件过滤器是一种稀缺资源,如果它们被首先安装在手机上的其他应用程序耗尽,那么您的应用程序将无法访问它们,这意味着检测时间将退回到软件扫描最多可能需要 15 分钟。无法知道您的应用程序是否已被授予访问这些硬件过滤器的权限,甚至在您的手机上卸载并重新安装应用程序也可能会改变这是否属实,从而导致结果不一致。可用过滤器的数量没有记录,但some evidence suggests 的数量是 30,这意味着只有在手机上监控的前 30 个CLBeaconRegions 才能获得优先访问权。

    为了解决测试中的问题 #2,卸载您认为可能会监控信标的任何其他应用,然后重新安装您的应用。您应该会获得更一致的结果。

    当然,您不能让真实用户卸载其他信标应用程序,因此他们可能仍会面临这些问题。但好消息是,大多数普通用户的手机上不会有很多信标应用程序,因此与经常在手机上安装大量信标应用程序的开发人员或测试人员相比,真实用户发生这种情况的可能性要小得多.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2021-04-16
      • 2017-02-15
      • 2019-02-14
      相关资源
      最近更新 更多