iOS 10.0.2导致iBeacons失效?

5
大家在iOS 10.0.2上使用iBeacons的情况怎么样?希望比我好!更新:用于测试的硬件是两台iPhone。 iPhone 5S(A1533)和iPhone 7(A1778)。
以下swift 2.x代码的版本可以在iPhone上用于iOS版本9.x广告简单的iBeacon,但是今天,已经更新为swift 3并在iOS 10.0.2上运行的相同代码似乎根本不会广告。
我将代码减少到一个非常简单的辅助类和ViewController,并认为它应该充分证明问题。请注意,Storyboard只有一个连接到启动/停止iBeacon广告的按钮。
我在安装了iOS 10.0.2的iPhone 5和iPhone 7上运行了该应用程序。为了测试,我创建了一个自定义扫描器(嗅探特定的近距离UUID),当那不起作用时,我尝试了更通用的iBeacon检测应用程序,例如Estimote和LightBlue。
叹气-没有什么能看到iBeacon。
你有什么想法吗?苹果开发者论坛提到了关于10.x iBeacon的问题,但据我所知,没有像这样简单的问题。谢谢...
- - - iBeaconConfiguration.swift - - - - - -

import Foundation

class iBeaconConfiguration
{
    static let uuid = UUID(uuidString: "F34A1A1F-500F-48FB-AFAA-9584D641D7B1")!

    private init() {}
}

- - - ViewController.swift - - - - - -

import UIKit
import CoreLocation
import CoreBluetooth

class ViewController: UIViewController, CBPeripheralManagerDelegate 
{

    @IBOutlet weak var btnAction: UIButton!

    let UUID: UUID = iBeaconConfiguration.uuid

    var beaconRegion: CLBeaconRegion!

    var dataDictionary = NSDictionary()

    var bluetoothPeripheralManager: CBPeripheralManager!

    var isBroadcasting = false

    override func viewDidLoad() {
        super.viewDidLoad()

        bluetoothPeripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil)
    }


    @IBAction func switchBroadcastingState(_ sender: AnyObject) 
    {

    if !isBroadcasting {
        if bluetoothPeripheralManager.state == CBManagerState.poweredOn {

            let major: CLBeaconMajorValue = 123
            let minor: CLBeaconMinorValue = 456

            beaconRegion = CLBeaconRegion(proximityUUID: UUID, major: major, minor: minor, identifier: "com.rdz.bcast")

            dataDictionary = beaconRegion.peripheralData(withMeasuredPower: nil)

            bluetoothPeripheralManager.startAdvertising(dataDictionary as? [String : Any])

            btnAction.setTitle("Stop", for: UIControlState.normal)

            isBroadcasting = true
        }
    }
    else {
        bluetoothPeripheralManager.stopAdvertising()

        btnAction.setTitle("Start", for: UIControlState.normal)

        isBroadcasting = false
    }
}

func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {

    print ("peripheralManagerDidStartAdvertising()")

    if error != nil
    {
        print(error)
    }
}

func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
    print ("peripheralManager(...didReceiveRead)")
}

func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
    var statusMessage = ""

    switch peripheral.state {
    case CBManagerState.poweredOn:
        statusMessage = "Bluetooth Status: Turned On"

    case CBManagerState.poweredOff:
        if isBroadcasting {
            switchBroadcastingState(self)
        }
        statusMessage = "Bluetooth Status: Turned Off"

    case CBManagerState.resetting:
        statusMessage = "Bluetooth Status: Resetting"

    case CBManagerState.unauthorized:
        statusMessage = "Bluetooth Status: Not Authorized"

    case CBManagerState.unsupported:
        statusMessage = "Bluetooth Status: Not Supported"

    default:
        statusMessage = "Bluetooth Status: Unknown"
    }

        print("Bluetooth Status: \(statusMessage)")
    }
}
- - - END - - - - -

(对于任何代码格式错误,我深表歉意。)

2个回答

3
许多人报告iOS 10上的蓝牙问题,但问题并不普遍。
在iPod Touch第6代型号mkh22ll/a上测试10.0.2(14A456),我可以成功扫描信标并使用Locate app for iOS传输iBeacon。这是用Objective C编写的,但使用与您展示的相同的API。您可以在有问题的设备上尝试此应用程序,看看是否仍然有问题。
在同一设备上测试另一个使用Swift 3编写的应用程序(该应用程序同时发送和接收iBeacon数据包),我已经验证它成功接收和发送iBeacon数据包。
归根结底,iOS 10上的iBeacon传输和检测在某些设备上运行良好。 我怀疑iOS 10的蓝牙问题只会发生在某些iPhone硬件型号上(也许只会发生在这些型号的某些特定设备上),这些型号具有略微不同的蓝牙硬件芯片组。
一些可能有助于排除故障的事项:
  1. 关闭蓝牙然后重新打开。
  2. 重新启动您的设备。(我知道这很无聊)
  3. 尝试在设置中扫描其他附近的蓝牙设备,看看是否能够看到其他设备,如您的 Mac 或蓝牙扬声器。如果这个简单的蓝牙任务不能正常工作,那么 iBeacon 将无法工作。
  4. 使用上面描述的 Locate app 进行测试。这可能会消除编码问题。

请更新问题,并提供您的硬件设备信息。


1
嗨,David,感谢您的快速回复和底线:您解决了我的问题。 - Cascadia_Mike
1
在两个设备上运行定位应用程序:A1533和A1778。 A1533扫描并定位了广告A1778信标,没有问题。切换活动时,A1778无法在其广告期间找到A1533。(我尝试了广告各种信标、重新启动应用程序、重新启动蓝牙等)重新启动两个手机似乎清除了我遇到的任何问题。再次感谢!-迈克尔 - Cascadia_Mike
很高兴重新启动解决了问题,但总是让人沮丧,因为这是唯一的解决方法。你有什么想法,为什么在重新启动之前蓝牙可能处于不良状态?在上一次重新启动和蓝牙停止工作之间发生了什么可疑的事情吗?这可能是在升级到iOS 10.0.2或其他可能导致蓝牙处于不良状态的事件之后吗? - davidgyoung
1
我已经考虑了几种情况,但都不合理,但是我的蓝牙堆栈知识目前还很肤浅。A1533在一天的工作后经常关闭,因此我倾向于认为问题与A1788有关(它一直处于开启状态),但我想不出可能会破坏堆栈的任何具体事件。 - Cascadia_Mike
我想补充一点,使用 iPhone 7 进行外围广告似乎无法正常工作。我将其与 iPhone 6S 并排测试了一下。 - rclai
当我的5S手机出现故障时,Locate可以帮我修复它,而无需重置设备-只需更新其中一个UUID / Region即可(在设备进入后台并唤醒后无法检测到所有信标时)。 - Saik Caskey

0

我也尝试在iPhone 7(A1778)和iPhone 6S(A1688)上使用iBeacon区域监控。我也发现iPhone 7上从未执行didEnterRegiondidExitRegion。这可能是因为苹果在iPhone 7上放弃了iBeacon微定位。

根据技术规格,“iBeacon微定位”不再列在iPhone 7的规格中。以下是iPhone 7的技术规格:https://support.apple.com/kb/SP743?locale=en_US 这是iPhone 6S的规格:https://support.apple.com/kb/SP726?locale=en_US

我已经尝试重新启动,实际上只有在应用程序在前台运行时才能让它正常工作。后台区域监控根本不起作用。如果应用程序在后台运行并返回前台,它也无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接