我已经基于Apples CoreBluetooth TemperatureSensor示例(https://developer.apple.com/library/ios/samplecode/TemperatureSensor/Introduction/Intro.html)为应用程序实现了CoreBluetooth。它可以很好地搜索设备,在tableview中填充结果,选择一个并连接。我的问题是我希望在整个应用程序的视图之间保持连接。
在我当前的设置中,我有一个带有按钮的视图,可以转到蓝牙设置视图。蓝牙视图以模态方式呈现,在这里我搜索BT设备并连接到其中一个。一旦我解除了视图,连接就会丢失,可能是因为它没有被保留?
因此我使用单例实现来保持对象(也像在Apples示例中一样)希望保持连接活着,但没有运气。然而,我可以从单例中检索对象并调用connectPeripheral并重新连接,但从用户的角度来看,用户在刚刚连接之后必须再次输入密码并不是那么好。
那么,如何在视图之间保持蓝牙连接,例如当有设置视图连接BT设备,然后在剩余的应用程序中使用相同的连接?
更新:包含代码
另外值得一提的是,我的类(包括共享实例)不仅基于Apple示例,还基于HMSoft的SerialGATT实现(我猜这是基于Apples实现)。这是我在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];
NB!我从原始的SerialGATT示例重命名了discoveryDelegate,之后它被简单地命名为“delegate”。 discoveryDelegate是Apples示例中使用的名称,并不重要。
从这里开始,我的模态蓝牙设置视图中的一切正常。如上所述,我可以搜索和连接设备。代表们正在被召集,一切都很好,花花公子。但是,当我关闭模式时,设备断开连接,但是当访问单例时我仍然可以在其他视图中找到该对象,例如重新连接。但话说回来,我宁愿保持连接的存在,而不是重新连接,不得不再次输入密码。