菜鸟教程小白 发表于 2022-12-13 03:52:19

ios - 在应用程序暂停后重新打开蓝牙 radio 不会调用 centralManagerDidUpdateState


                                            <p><p>我的应用与低能耗外围设备连接。当外围设备超出范围时,我会收到 <code>didDisconnect</code> 方法回调,我只需在外围设备上调用 connect ,只要它回到范围内,它就会连接。</p>
<p>即使在后台,即使应用程序被 iOS 挂起,但由于我有一个挂起的连接,它会唤醒应用程序并连接。</p>
<p>但是,如果用户关闭蓝牙,所有外围设备都会进入断开状态,因此不会保留未决连接。如果应用程序被 iOS 挂起,并且用户在挂起后重新打开它,我的委托(delegate)方法都不会被调用,我在下面添加了我的初始化和状态恢复方法。</p>
<p>我在后台队列中初始化我的中央管理器,但每当我收到回调时,我都会让主队列执行任务:</p>
<pre><code>- (void)initialize {
if (!self.centralManager) {
    _centralManager = [ initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) options:@{ CBCentralManagerOptionRestoreIdentifierKey:@&#34;CBCentralManagerIdentifierKey&#34; }];
}
}
</code></pre>
<p><strong>我的中央状态回调方法</strong></p>
<pre><code>- (void)centralManagerDidUpdateState:(CBCentralManager *)central {

dispatch_async(dispatch_get_main_queue(), ^{
    ;
    if (central.state == CBManagerStatePoweredOff) {
      ;
      [ postNotificationName:CB_MANAGER_BLUETOOTH_POWERED_OFF object:nil];
    }
    else if (central.state == CBManagerStatePoweredOn) {
      ;
      ; // here I reconnect to already known devices, retrieved from calling central method of retrievePeripheralsWithIdentifiers
      [ postNotificationName:CB_MANAGER_BLUETOOTH_POWERED_ON object:nil];
    }
});
</code></pre>
<p>}</p>
<p><strong>我的中央恢复方法:</strong></p>
<pre><code>- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary&lt;NSString *, id&gt; *)dict {

dispatch_async(dispatch_get_main_queue(), ^{
    ; // Here, I start a background task.
    ;
   });
}
</code></pre>
<p>当用户重新打开应用程序时,我需要在后台重新连接到外围设备,但由于当用户从控制中心或设置重新打开蓝牙时从未调用 centralManagerDidUpdateState 方法,所以我无法发送连接调用。</p >
<p>当我手动启动应用程序时,外围设备处于连接状态但不会重新连接。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您是否正在监视 <code>CBCentralManager</code> 中的状态变化?当蓝牙关闭和打开时,您应该得到一个委托(delegate)回调,记录 <a href="https://developer.apple.com/documentation/corebluetooth/cbcentralmanagerdelegate/1518888-centralmanagerdidupdatestate?language=objc" rel="noreferrer noopener nofollow">here</a> :</p>

<pre><code>- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    if (central.state == CBManagerStatePoweredOn) {
      // reconnect/scan/etc
    }
}
</code></pre>

<p>听起来您正在使用 Core Bluetooth <a href="https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW5" rel="noreferrer noopener nofollow"><em>State Preservation and Restoration</em></a> ,它应该会在这些状态更改时通知您。</p>

<p>另外,我现在无法尝试,但您也可以在蓝牙关闭时尝试重新连接,因为连接请求不会超时。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在应用程序暂停后重新打开蓝牙 radio 不会调用 centralManagerDidUpdateState,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/48030480/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/48030480/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在应用程序暂停后重新打开蓝牙 radio 不会调用 centralManagerDidUpdateState