0

MCNearbyServiceBrowser用来发现附近的蓝牙设备并使用invitePeer: toSession: withContext: timeout:.

UITableview现在的问题是,如果它们再次在附近,我想保留所有连接设备的历史记录并在将来重新连接它们(手动单击它们)。这可能吗?它是否符合 Apple 的政策?谢谢。

更新:

我已经实现了“jamdaddy25”回答的目标(在他回答之前:P)并且它也工作正常。但是如果两个设备具有相同的名称怎么办?在这种情况下,不显示列表中的两个或多个设备之一将是一个问题。我不希望那样。顺便说一句,感谢您的回复。

4

1 回答 1

2

您可以保留 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];
于 2014-01-23T19:50:32.230 回答