我正在创建一个iOS应用程序,当你进入运行应用程序的另一部iPhone的蓝牙接近时,它会触发服务器调用。每个iOS设备都应该有一些独特的蓝牙广告标识符(例如主要/次要组合),因此可以进行适当的服务器/数据库调用。
我的第一个计划是使用标准的iBeacon API(CoreBluetooth + CoreLocation)。当我意识到你不能在你的应用程序在后台使用这种方法宣传蓝牙时,工作就像一个魅力,但停止了。
Method 1
//Create the NSUUID Object
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"6CA7D72E-824E-45D1-99E9-02BD33599A81"];
//Initialize the Beacon Region
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:1 minor:1 identifier:@"com.emjoseph.test"];
//Get the beacon data to advertise
self.myBeaconData = [self.myBeaconRegion peripheralDataWithMeasuredPower:nil];
//Start the peripheral manager
self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];
-(void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
if(peripheral.state == CBPeripheralManagerStatePoweredOn){
//Bluetooth is on - start broadcasting
[self.peripheralManager startAdvertising:self.myBeaconData];
}
}
我的第二次尝试是使用Instrument/Vicinity在Github上设置的Bentford API,它仅使用CoreBluetooth复制iBeacon API。这解决了能够在后台进行广告的问题。但问题是,我无法弄清楚如何在蓝牙广告数据中发送等效的主要或次要,这是有限的,因为接收电话需要一些它接收数据的设备的唯一标识符,因此它可以使适当的服务器/数据库调用。看来我只能访问广告数据中的UUID和name属性。
Method 2
NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"emjoseph",
CBAdvertisementDataServiceUUIDsKey:@[CBUUID],
};
// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData];
我是如何实现所需设置的?我想过将方法2的CBAdvertisementDataLocalNameKey属性字符串用作唯一ID,但它有其限制。
此外,我希望该应用的所有用户都使用相同的UUID来过滤掉不需要的信号。
再次重申,该应用程序的基本流程是: 当人A接近人B的电话时,人A通过蓝牙(例如主要/次要组合)从人B接收一些唯一ID,而人A使用该唯一ID从DB /服务器检索相关信息。唯一的规定是,当应用程序在后台运行时,我希望这个过程发生。