您可以保留 peerID 显示名称。这是 MCPeerID 上的属性。当您开始浏览时,无论是在用户选择以前连接的对等点之前还是在进入该屏幕后开始浏览,循环浏览附近的对等点并查看您是否有显示名称匹配。如果是这样,您可以系统地发送邀请并重新建立连接。
您甚至可以这样做,因此唯一可选择的先前连接是当前附近对等点的连接。
更新:因此,为了确保您没有对等名称冲突,您需要使名称唯一。 我知道如何做到这一点的最好方法是创建一个基于 UUID 的名称。我将其保存在一个简单对象(下面的 UserPeerInfo)中并将其保存/加载到 NSUserDefaults,因此该对等名称将始终用于该对等
// Initialize with any stored data
if (!_userPeerInfo) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"userPeerInfo"]) {
NSData *userPeerInfoData = [defaults objectForKey:@"userPeerInfo"];
_userPeerInfo = (UserPeerInfo*)[NSKeyedUnarchiver unarchiveObjectWithData:userPeerInfoData];
} else
{
NSString *peerName = [[NSUUID UUID] UUIDString];
_userPeerInfo.peerName = peerName;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Create an NSData representation
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_userPeerInfo];
[defaults setObject:data forKey:@"userPeerInfo"];
[defaults synchronize];
}
}
然后在设置对等点的名称和初始化时,像往常一样使用该对等点名称
self.peerId = [[MCPeerID alloc] initWithDisplayName:self.userPeerInfo.peerName];
self.advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.peerId discoveryInfo:info serviceType:kServiceType];
self.advertiser.delegate = self;
[self.advertiser startAdvertisingPeer];