我已经阅读了文档,但是没有太多关于Multipeer Connectivity的信息,这些信息与为同行选择连接的可能媒介有关。
Multipeer Connectivity会根据WiFi或蓝牙自动发现对等体。有没有办法将此限制为仅限蓝牙?
答案 0 :(得分:3)
正如@kdogisthebest正确指出的那样,没有办法强制使用Multipeer Connectivity来使用特定的网络技术,但是当你的问题与WiFi的特定问题有关时,这个答案详细说明了我正在做的事情来解决这个问题。 的
我通过在创建discoveryInfo
时在MCNearybyServiceAdvertiser
中发送缩短的时间戳,解决了基于WiFi的'幻影'对等问题。这里有几点需要注意:
1)此解决方案假设两个设备具有相同的时间。我通过使用ios-ntp的修改版本作为应用程序的时间源来确保这一点。
2)它还假设广告和浏览不会运行太长时间。对于发现阶段,我有60秒的设置长度,并且每次重新启动时我都会完全重新启动浏览器/广告商。
3)MPC似乎不喜欢discoveryInfo
中的太多字节,因此基于纪元发送NSTimeInterval不起作用。我不得不截断它们。
因此,当我的应用进入发现模式时,它会同时开始浏览和广告。广告代码如下:
- (void)startAdvertising {
if (_advertising){
NSLog(@"Already advertising");
return;
}
self.acceptedPeerIDNameMap = [NSMutableDictionary dictionary];
NSInteger timeStamp = [self shortenedNetworkTimeStamp];
NSDictionary *discoveryInfo = @{kAdvertisingDiscoveryInfoTimestampKey:[NSString stringWithFormat:@"%ld",(long)timeStamp]};
NSLog(@"Starting advertiser");
self.serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:_myPeerID
discoveryInfo:discoveryInfo
serviceType:kServiceType];
_serviceAdvertiser.delegate = self;
[_serviceAdvertiser startAdvertisingPeer];
self.advertising = YES;
}
方法shortenedNetworkTimestamp
只需要一个NSTimeInterval(使用ntp框架或timeIntervalSinceReferenceDate
并从中移除1400000000
。
然后当浏览器发现对等体时,它会检查广告商的时间戳是否在已知的发现持续时间内(在我的情况下为60秒):
- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {
DLog(@"Browser found peer ID %@",peerID.displayName);
//Only one peer should invite the other
BOOL shouldInvite = [peerID.displayName compare:_myPeerID.displayName]==NSOrderedAscending;
//Don't re-send invitations
if (_peerInfoDisplayNameMap[peerID.displayName]){
DLog(@"Already connected to peerID %@",peerID.displayName);
shouldInvite = NO;
}
else if (_invitedPeerIDNameMap[peerID.displayName]){
DLog(@"Already invited peerID %@",peerID.displayName);
shouldInvite = NO;
}
//Invite if discovery info is valid
if (shouldInvite && [self discoveryInfoIsValid:info]) {
DLog(@"Inviting");
_invitedPeerIDNameMap[peerID.displayName] = peerID;
MCSession *session = [self availableSession];
[_serviceBrowser invitePeer:peerID toSession:session withContext:nil timeout:0];
}
else {
DLog(@"Not inviting");
}
}
发现信息有效性检查非常简单 - 只需确保信息中发送的时间戳在发现时间范围内(在我的情况下kDiscoveryPhaseDuration
为60秒):
- (BOOL)discoveryInfoIsValid:(NSDictionary *)info {
BOOL isValid = YES;
NSString *infoTimeStamp = info[kAdvertisingDiscoveryInfoTimestampKey];
NSTimeInterval sentTimeStamp = (infoTimeStamp) ? [infoTimeStamp doubleValue] : -1;
NSTimeInterval currentTimeStamp = [self shortenedNetworkTimeStamp];
if (sentTimeStamp==-1 || (currentTimeStamp - sentTimeStamp) > kDiscoveryPhaseDuration){
DLog(@"Expired discovery info (current=%f, sent=%f)",currentTimeStamp,sentTimeStamp);
isValid = NO;
}
return isValid;
}
希望这会有所帮助。 MPC中还有很多其他的怪癖,我在自己的代码中处理,但我认为上面的内容涵盖了这个特定的问题。
答案 1 :(得分:0)
Multipeer Connectivity无法实现这一点。 Apple没有采用任何方法来限制与蓝牙的连接。
这里有一个答案:Multipeer connectivity over Bluetooth?状态"没有明确的蓝牙或Wifi设置,它会以任何可能的方式连接设备。"