似乎没人知道,所以我购买了一个iOS开发人员帐户并进行了一些实验。这是我发现的:
在前台运行时,可以使用CBCentralManager :: scanForPeripheralsWithServices开始扫描。您的扫描可以仅限于宣传特定服务的设备,也可以不受限制(将nil作为调用参数传递)。它还可以允许或禁止重复项;在前一种情况下,每当iPhone收到广告数据包时,您都会收到didDiscoverPeripheral回调;在后者中,每个设备只会得到一个回调。
当您进入背景时,规则如下所示:
- 如果您运行的是不受限制的扫描,它将被静默取消。您将不会获得任何didDiscover回调。
- 如果您的扫描受到限制(即您指定了您要查找的一个或多个服务UUID),则扫描将继续运行,但是“允许重复”标志将被忽略。这意味着您现在将仅获得新设备的didDiscoverPeripheral回调。如果在前台看到了所有设备,那么您将根本没有回调。
- 开始和停止扫描不会重置认为是新设备的设备。如果存在一个设备,则即使进行多次扫描,您也只会得到一个回调,除非...
- 如果您连接到设备,然后断开连接,然后再次扫描,则会再次枚举该设备(即,您将再收到一次对didDiscoverPeripheral的调用)。我猜想iOS会将其视为对设备“表现出兴趣”。
我不知道尝试连接到不可连接的设备(例如BLE广告商,如那些实现邻近配置文件的设备)是否足够好,因为我的示例设备是可连接的。但是,至少对于可连接的设备,此扫描/连接/断开连接/扫描过程足以在后台轮询设备的存在。
以上结果是使用运行iOS 5.0.1的iPhone 4S收集的