发现是一个简单但非常有用的库,用于使用BLE(低功耗蓝牙)发现附近的设备,并在设备上的应用工作在前台或后台状态时交换一个值(由你根据在相邻设备上运行的应用中所决定的ID或用户名)。
我随库添加了一个简单但有趣的例子。只需要下载,运行`pod install`,并在两个或更多蓝牙启动设备上安装它,然后享受乐趣。它同时适用于iPhone和iPad。
pod 'Discovery', '~> 1.0'
// create our UUID.
NSString *uuidStr = @"B9407F30-F5F8-466E-AFF9-25556B57FE99";
CBUUID *uuid = [CBUUID UUIDWithString:uuidStr];
__weak typeof(self) weakSelf = self;
// start Discovery
self.discovery = [[Discovery alloc] initWithUUID:uuid username:self.username usersBlock:^(NSArray *users, BOOL usersChanged) {
NSLog(@"Updating table view with users count : %d", users.count);
weakSelf.users = users;
[weakSelf.tableView reloadData];
}];
让我们澄清我们所要解决的问题:我们的目标是要处理发现其他设备(也运行我们的应用)以及交换一个ID(可以是用户名、名字或编号ID)的问题,即使在我们设备上的应用处于后台运行时。
如果您已经深入了解了 BLE 和 iBeacon 的概念,您可能知道 iOS 对如何利用这些功能有一些限制。iBeacon 实际上是 BLE 技术的一个子集。您可以将您的设备编程为广告者或监听者。然而,当您的应用程序处于后台状态时,无法作为 iBeacon 进行广告。此外,您只能传输主值和次值,这也限制了传输。
因此,直接使用 BLE 功能更为方便。但是,这里也存在一些问题!基本上,这个问题再次与您的应用程序状态有关,即在前后台状态下交换用户名(或任何类型的 ID)。如果您的应用程序运行在前台状态,则没有任何问题。我们可以简单地将数据(即我们的用户名)附加到数据上,当对等设备检测到我们的信号时,它将通过 CBAdvertisementDataLocalNameKey 获取用户名。然而,当我们的应用程序进入后台状态时,iOS 将裁剪这些信息。它仍然继续广告,但您试图传输的数据(即用户名)无法被其他对等设备读取。因此,我们需要其他方法来确定该设备属于谁。
通过为广告者的服务创建一些特定的属性,发现功能解决了这个问题,这些属性与广告者的服务相关联。当监听对等设备发现我们的设备时,它首先检查是否可以读取 CBAdvertisementDataLocalNameKey 的值。如果可以,则没有问题,设备被识别。如果它 无法读取(这意味着我们的应用程序处于后台状态),它将尝试连接并发现我们的服务。连接成功后,对等设备遍历我们的服务,读取我们的属性,然后从中检索我们的用户名——成功了!然后简单地断开连接。
我希望在最初发布时将“发现”保持得尽可能简单。在下一次发布中,我可能会添加一些可靠的错误处理和一些回调,供开发者在需要时干预。也许过了不久,我还可以为对等设备添加一些额外的功能,以实现它们之间的持久连接并继续交换信息流。
请看这个 Stackoverflow 上的问题。根据我的经验,我在 iOS8 上没有遇到这个问题,只有在 iOS7 上偶尔会出现。
请勿犹豫,发送拉取请求,但是我只接受 develop 分支上的请求。
Ömer Faruk Gül