发现 1.1.1

发现 1.1.1

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布最新版本2015年5月

Omer Faruk Gul维护。



发现 1.1.1

  • 作者:
  • Ömer Faruk Gül

发现:一个简单的库,用于发现和检索附近设备的数据。

Screenshot

发现是一个简单但非常有用的库,用于使用BLE(低功耗蓝牙)发现附近的设备,并在设备上的应用工作在前台或后台状态时交换一个值(由你根据在相邻设备上运行的应用中所决定的ID或用户名)。

版本

发现

  • 让您轻松发现附近的设备
  • 检索它们在应用在前台或后台状态时分配的id
  • 隐藏了BLE调用和代理的细节
  • 确定相邻设备的距离

版本 1.1

  • 您可以在仅检测或仅广播模式中初始化发现。默认初始化器将启动两者。

示例应用

我随库添加了一个简单但有趣的例子。只需要下载,运行`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)的问题,即使在我们设备上的应用处于后台运行时。

如果您已经深入了解了 BLEiBeacon 的概念,您可能知道 iOS 对如何利用这些功能有一些限制。iBeacon 实际上是 BLE 技术的一个子集。您可以将您的设备编程为广告者或监听者。然而,当您的应用程序处于后台状态时,无法作为 iBeacon 进行广告。此外,您只能传输主值和次值,这也限制了传输。

因此,直接使用 BLE 功能更为方便。但是,这里也存在一些问题!基本上,这个问题再次与您的应用程序状态有关,即在前后台状态下交换用户名(或任何类型的 ID)。如果您的应用程序运行在前台状态,则没有任何问题。我们可以简单地将数据(即我们的用户名)附加到数据上,当对等设备检测到我们的信号时,它将通过 CBAdvertisementDataLocalNameKey 获取用户名。然而,当我们的应用程序进入后台状态时,iOS 将裁剪这些信息。它仍然继续广告,但您试图传输的数据(即用户名)无法被其他对等设备读取。因此,我们需要其他方法来确定该设备属于谁。

通过为广告者的服务创建一些特定的属性,发现功能解决了这个问题,这些属性与广告者的服务相关联。当监听对等设备发现我们的设备时,它首先检查是否可以读取 CBAdvertisementDataLocalNameKey 的值。如果可以,则没有问题,设备被识别。如果它 无法读取(这意味着我们的应用程序处于后台状态),它将尝试连接并发现我们的服务。连接成功后,对等设备遍历我们的服务,读取我们的属性,然后从中检索我们的用户名——成功了!然后简单地断开连接。

下一步是什么?

我希望在最初发布时将“发现”保持得尽可能简单。在下一次发布中,我可能会添加一些可靠的错误处理和一些回调,供开发者在需要时干预。也许过了不久,我还可以为对等设备添加一些额外的功能,以实现它们之间的持久连接并继续交换信息流。

问题案例

请看这个 Stackoverflow 上的问题。根据我的经验,我在 iOS8 上没有遇到这个问题,只有在 iOS7 上偶尔会出现。

贡献

请勿犹豫,发送拉取请求,但是我只接受 develop 分支上的请求。

联系

Ömer Faruk Gül

我的 LinkedIn 账户