我正在开发一个与点对点共享信息的应用。两种设备同时充当中心和外围设备。
当iOS设备A连接到iOS设备B时,它们会交换信息,然后中心断开连接,并再次开始扫描。如果设备获取任何新信息,我想使用反映更新时间的新序列日期(和deviceID)更新CBAdvertisementDataServiceUUIDsKey
中的第二个服务UUID。通过这种方式,其他iOS设备可以从广告中判断出它们是否应该连接。更新广播的代码如下。它产生的UUID是有效的,但是一旦我修改广告,我的中心就不再找到外围设备了。我知道广告是缓存的,但我假设删除服务并重新添加它,我可以解决这个问题。
-(void)updateBroadcast{
[self.peripheralManager stopAdvertising];
if (self.pmIsConnected) {
NSLog(@"PM connected->Can't update advertising");
dispatch_async(dispatch_get_main_queue(), ^{
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateBroadcast) userInfo:nil repeats:YES];
});
return;
}else{
[self.peripheralManager removeService:self.infoService];
[self setupInfoService];
[self startBroadcasting];
NSArray *services=@[self.tNetService.UUID,[self createAdvertiseUUID];
NSDictionary *advertisingDict =
@{CBAdvertisementDataLocalNameKey:self.deviceNameKey,
CBAdvertisementDataServiceUUIDsKey:services};
[self.peripheralManager startAdvertising:advertisingDict];
}
}
是否可以更新此密钥?或者我犯了其他错误?
答案 0 :(得分:1)
如果不尝试重现您的代码,我会有一些观察
stopAdvertising
(尽管如果它对您有效,这可能不是绝对必要的)CBCentralManagerScanOptionAllowDuplicatesKey
选项设置为@YES
并查看您是否注意到广告中的更新广告和托管服务不一定必须相同。它们实际上可能完全不同。因此,更新服务数据库不是更改广告的必要条件。
您的用例对我来说并不完全清楚,但我觉得您想要实现多种聊天或类似的东西。有一个question on this earlier,我解释说通过广告实施广播不是一个特别好的主意。如果广告相对不经常变化,那么它可能会起作用,但我不会将我的解决方案建立在这种方法上。如果您的对等端数量相对较少,则多路连接器连接框架可能更适合您的需求,但基于IP的解决方案将扩展得最好。