CoreBluetooth“willRestoreState” - 究竟应该在那里做什么?

时间:2016-06-13 18:29:18

标签: ios objective-c core-bluetooth bluetooth-lowenergy cbcentralmanager

我正在开发一个需要持续运行并跟踪某些外围特性的应用程序。

前景一切正常 它也可以在后台运行,但我不确定我是否正确使用它。

我发布了很多关于状态恢复和实现willRestoreState的帖子,但是很多帖子没有明确告诉你在调用这个方法时该怎么做。

我正在制作的过程是这样的:

我正在使用

创建一个中央管理员
myCentralManager =
        [[CBCentralManager alloc] initWithDelegate:self queue:nil
         options:@{ CBCentralManagerOptionRestoreIdentifierKey:
         @"myCentralManagerIdentifier" }];

从这里开始我正在做常规流程: 等待中央管理器上电(centralManagerDidUpdateState) - >扫描我的外设 - >连接到它 - >发现服务 - >发现特征 - >订阅charactristic - >阅读数据

然后我使用

杀了我的应用程序
kill(getpid(), SIGKILL);

我等了几秒钟,然后从我的外围设备再次开始做广告。

然后我可以看到该过程重新开始,我的日志显示AppDelegate中的didFinishLaunchingWithOptions被调用。

然后我按照以下方式恢复中央管理员:

 NSArray *identifiers = launchOptions[UIApplicationLaunchOptionsBluetoothCentralsKey];

   if (identifiers && identifiers.count > 0) {
        _centralManager = [[CBCentralManager alloc] initWithDelegate:self
                                                               queue:nil
                                                             options:@{CBCentralManagerOptionRestoreIdentifierKey:[identifiers objectAtIndex:0]}];
    } 

我还可以看到willRestoreStatecentralManagerDidUpdateState被调用。

这是我迷失的地方。 接下来我该怎么办?如果我继续做常规流程(我在上面描述过,All似乎工作正常 - 并且与上面相同。

但是 - 我做对了吗?

我应该在willRestoreState做些什么吗? 如果是,我应该做什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

基本上你会将已经连接的外围设备交还给你 - 你应该保存对它的引用并为自己设置代理。这是我的代码,非常简单:

select *
from users u1
where verb = 'tried log in'
and not exists
(
select 1
from users u2
where u1.firstname = u2.firstname 
and u1.lastname = u2.lastname
and u2.verb = 'logged in'
)