- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 iOS 8 中使用 Xcode 6。当应用程序在后台运行时,我正在尝试搜索和连接蓝牙设备。我正在使用核心蓝牙框架。我使用 Xcode 功能选项添加了蓝牙中心和蓝牙外围设备。
代码:
Appdelegate.h
@interface WSAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate,CBCentralManagerDelegate,CBPeripheralDelegate>
@property (strong, nonatomic) NSString *savedUUID;
@property (strong, nonatomic) CBCentralManager *CBCM;
AppDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
NSUserDefaults *defaults=[[NSUserDefaults alloc] init];
self.savedUUID= [defaults stringForKey:@"uuid"];
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask = 0;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Object Created::::");
self.CBCM = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
[app endBackgroundTask:bgTask];
}];
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
printf("Status of CoreBluetooth central manager changed \n");
if(self.CBCM.state == CBCentralManagerStatePoweredOn)
{
//okay your good to go and can now scan
// NSLog(@"your good to go and can now scan");
NSLog(@"Searching for Device::::");
NSUUID *uuid = [[NSUUID alloc]initWithUUIDString:self.savedUUID];//where savedUUID is the string version of the NSUUID you've saved somewhere
NSArray *peripherals = [self.CBCM retrievePeripheralsWithIdentifiers:@[uuid]];
for(CBPeripheral *periph in peripherals)
{
[self.CBCM connectPeripheral:periph options:nil];
}
}
else
{
//Unable to use CentralManager methods so print out the central.state and find out why
NSLog(@"Unable to use CentralManager methods so print out the central state and find out why:::%d",self.CBCM.state);
}
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
NSLog(@"Peripheral Found::::%@",peripheral);
}
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
printf("Connection to peripheral with UUID successfull\r\n");
}
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
printf("Connection to peripheral with UUID Fail,didFailToConnectPeripheral\r\n");
printf("Error code was %s\r\n",[[error description] cStringUsingEncoding:NSStringEncodingConversionAllowLossy]);
}
didDiscoverPeripheral 方法未被调用,因此我使用的是上次连接设备的已保存 uuid,但它未连接且未调用委托(delegate)方法 didConnectPeripheral 和 didFailToConnectPeripheral。那么如何解决这个问题,在后台运行的时候连接蓝牙呢?
最佳答案
我不会使用 BackgroundTask 在后台扫描外围设备。
1) 创建 CBCentralManager 时,请确保您为 CBCentralManagerOptionRestoreIdentifierKey 指定一个选项。
myCentralManager =
[[CBCentralManager alloc] initWithDelegate:self queue:nil
options:@{ CBCentralManagerOptionRestoreIdentifierKey:
@"myCentralManagerIdentifier" }];
参见:
2) 在 AppDelegate 的 didFinishLaunchingWithOptions 方法的 launchOptions 中查找 UIApplicationLaunchOptionsBluetoothCentralsKey:
NSArray *centralManagerIdentifiers =
launchOptions[UIApplicationLaunchOptionsBluetoothCentralsKey];
这用于恢复您的中央管理器。 (将与 1 中的 key 同名)。
3) 确保在 CBCentralManagerDelegate 中实现 willRestoreState。请参阅上面列出的文档。
关于iOS 8 : When App in Background CBCentralManager Delegate Method didDiscoverPeripheral, didConnectPeripheral、didFailToConnectPeripheral 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26731627/
我需要通过蓝牙向第三方设备发送 ASCII 码。希望可以与 spp 一起使用。我的术语可能是错误的。我对这个编程领域了解不够。 在 centralManagerDidUpdateState 中,我正在
iOS CoreBluetooth 中是否有一种机制,以便在发现(但未连接)外围设备“丢失”时触发事件,即正在广播的外围设备不再广播。 最佳答案 您可以在 CBCentralManager 的 sca
我正在从事 BLE 项目,当应用程序在前台时一切正常。它可以发现并连接到外围设备,所有回调方法都可以正常工作。 但问题是,当应用程序处于后台模式时(我按下主页按钮)。仅调用 centralManage
我实际上正在使用低功耗蓝牙制作一个应用程序。 到目前为止,我的应用程序获得了 3 个 View ,每个 View 都显示一些 BLE 信息。 当我的蓝牙协议(protocol)代码在第一个 View
我正在使用 BTLE 对某些 BTLE 设备使用react,我只需要知道 BTLE 设备何时在某个范围内,不需要配对,只要知道RSSI值即可, 我遇到的问题是 didDiscoverPeriphera
我在 Xcode 6 中制作了一个非常简单的 iOS 应用程序来试用 CoreBluetooth 并与我的 Polar H6 心率监测器通信。由于某种原因,没有调用 didDiscoverPeriph
发生在 iOS 12 和 iOS 13 上。 我已将 Bluetooth-central 正确添加到我的 Info.plist 我正在指定服务 UUID 列表 我所看到的: 如果我在前台与我们的 BL
我不确定为什么这段代码无法构建并且错误消息看起来很神秘。 代码: var centralManager: CBCentralManager!; var nrf8001Peripheral: CBPer
我这样扫描我的外围设备: NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool
我 99% 确定我按照说明正确设置了 CoreBluetooth。无论我做什么,当我在我的 iPad mini 上运行这个应用程序时,蓝牙都会显示它已打开。它说它正在扫描设备,但绝对找不到任何设备。如
我正在尝试在后台扫描 BLE 设备,但我的 didDiscoverPeripheral 方法没有被调用。我已经等了 5 分钟,什么也没发生,但是当我打开其他蓝牙应用程序(例如“LightBlue”)时
我正在扫描蓝牙设备。为此,我正在使用 CBCentralManager,就像这样 - (void)startScanning { [self.centralManager scanForPer
我正在使用 CoreBluetooth 并且当应用程序处于前台或后台或设备锁定且设备屏幕仍处于打开状态时,回调方法 didDiscoverPeripheral 被频繁调用。 但是一旦屏幕关闭/变黑(
我正在使用专有的信标。我可以完全访问信标的代码,并且可以根据需要设置制造商 ID。如果我将 ID 设置为 Apple 的(即使其成为 iBeacon),那么位置管理器就能够检测到信标的区域并能够确定信
我正在从 AppDelegate 的 didFinishLaunchingWithOptions 回调中调用 scanForPeripheralsWithServices。代码如下所示: - (BOO
如何发送28个字节的外设name-key广告数据并被central接收? 通常情况下,使用UUID,外设名称 key 广告数据中只有8个字符的空间。 但是有一个技巧: 我发现如果我的名字键有 28 个
我在 iOS 8 中使用 Xcode 6。当应用程序在后台运行时,我正在尝试搜索和连接蓝牙设备。我正在使用核心蓝牙框架。我使用 Xcode 功能选项添加了蓝牙中心和蓝牙外围设备。 代码: Appdel
我是一名优秀的程序员,十分优秀!