0

我已经为基于 Apples CoreBluetooth TemperatureSensor 示例(https://developer.apple.com/library/ios/samplecode/TemperatureSensor/Introduction/Intro.html)的应用程序实现了 CoreBluetooth。它非常适合搜索设备,在表格视图中填充结果,选择一个并连接。我的问题是我想在整个应用程序的视图之间保持连接。

在我当前的设置中,我有一个带有按钮的视图,可将您带到蓝牙设置视图。蓝牙视图以模态方式呈现,在这里我搜索 BT 设备并连接到其中一个。一旦我关闭视图,连接就会丢失,可能是因为它没有被保留?

因此,我使用单例实现来保持对象(也如 Apple 示例中那样),希望保持连接处于活动状态,但没有运气。但是,我可以从单例中检索对象并调用 connectPeripheral 并重新连接,但从用户的角度来看,用户在刚刚连接之前必须再次输入密码并不是那么好。

那么,我怎样才能在视图之间保持蓝牙连接,例如当有一个连接 BT 设备的设置视图时,然后在剩余的应用程序中使用相同的连接?

更新:包含代码

另外值得一提的是,我的课程(包括共享实例)不仅基于 Apple 示例,还基于 HMSoft 的 SerialGATT 实现(我猜它是基于 Apple 的实现)。这是我在 git https://github.com/ezefranca/kit-iot-wearable-ios/blob/master/kit-iot-wearable-ios/SerialGATT.h上找到的一个地方的链接

因此,对于我的单身人士,我在 SerialGATT.h 中添加了以下内容(也尝试了 id,并不是说它有所作为)

+ (SerialGATT *)sharedManager;

在 SerialGATT.m 我有

+ (SerialGATT*)sharedManager {
    static SerialGATT *_sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });

    return _sharedInstance;
}

在我的蓝牙视图控制器中使用 SerialGATT 和单例时,我实现了 SerialGATT 的委托方法,然后在 viewDidLoad 中有以下内容

[[SerialGATT sharedManager] setup];
[[SerialGATT sharedManager] setDiscoveryDelegate:self];

注意!在将其简单命名为“delegate”之前,我已将原始 SerialGATT 示例中的 discoveryDelegate 重命名。discoveryDelegate 是 Apple 示例中使用的名称,并不重要。

从这里开始,在我的模态蓝牙设置视图中一切正常。如上所述,我可以搜索和连接设备。正在召集代表,一切都很好,花花公子。但是,当我关闭模式时,设备会断开连接,但在访问单例时我仍然可以在其他视图中找到对象,例如重新连接。但话又说回来,我宁愿保持连接有效,而不是重新连接并不得不再次输入密码。

4

0 回答 0