另一个对等方接收的PeerID对象与MultipeerConnectivity Framework中的原始对象不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了另一个对等方接收的PeerID对象与MultipeerConnectivity Framework中的原始对象不同相关的知识,希望对你有一定的参考价值。

我正在使用Multipeer Connectivity框架。我正在NSUserDefaults中保存我的PeerId以重复使用它(如Apple建议的那样)(下面的代码是swift但是Objective c也有相同的行为)。 :

        var peerId: MCPeerID = {
        let defaults = NSUserDefaults.standardUserDefaults();
        let dataToShow = defaults.dataForKey("kPeerID");
        var peer = NSKeyedUnarchiver.unarchiveObjectWithData(dataToShow) as? MCPeerID;
        if peer == nil {
            peer = MCPeerID(displayName: UIDevice.currentDevice().name);
            let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(peer);
            defaults.setObject(data, forKey: "kPeerID");
            defaults.synchronize();
        }
        println("I am peer: \(peer!)");
        return peer!;
    }()

我将邀请发送给发现的同行,如下所示:

func browser(browser: MCNearbyServiceBrowser!, foundPeer peerID: MCPeerID!, withDiscoveryInfo info: [NSObject : AnyObject]!) {    
    println("\(self.peerId) Found peer \(peerID)");
    if let browserSession = self.session {
        browserSession.delegate = self;
        browser.invitePeer(peerID, toSession: browserSession, withContext: nil, timeout: 30);
    }else {
        println("Browser session is nil");
   }    
}

广告商使用代码找到它:

func advertiser(advertiser: MCNearbyServiceAdvertiser!, didReceiveInvitationFromPeer peerID: MCPeerID!, withContext context: NSData!, invitationHandler: ((Bool, MCSession!) -> Void)!) {
    println("\(self.peerId) Received Invitation from \(peerID)");
    var session = availableSession();
    invitationHandler(true, session);
}

我面临的问题是:当广告客户找到peerId时,它会显示与原始peerId不同的peerId,但具有正确的显示名称。

浏览器控制台输出是:

  I am peer: <MCPeerID: 0x1663e670 DisplayName = Jon Yang’s iPad>
  <MCPeerID: 0x1663e670 DisplayName = Jon Yang’s iPad> Received Invitation from <MCPeerID: 0x1666daf0 DisplayName = Jon Yang’s iPadMini>
  <MCPeerID: 0x1663e670 DisplayName = Jon Yang’s iPad> Connecting with <MCPeerID: 0x1666daf0 DisplayName = Jon Yang’s iPadMini>
  <MCPeerID: 0x1663e670 DisplayName = Jon Yang’s iPad> Connected with <MCPeerID: 0x1666daf0 DisplayName = Jon Yang’s iPadMini>

和广告商控制台输出是:

 I am peer: <MCPeerID: 0x1569d230 DisplayName = Jon Yang’s iPadMini>
 <MCPeerID: 0x1569d230 DisplayName = Jon Yang’s iPadMini> Found peer <MCPeerID: 0x15586600 DisplayName = Jon Yang’s iPad>
 <MCPeerID: 0x1569d230 DisplayName = Jon Yang’s iPadMini> Connecting with <MCPeerID: 0x15586600 DisplayName = Jon Yang’s iPad>
 <MCPeerID: 0x1569d230 DisplayName = Jon Yang’s iPadMini> Connected with <MCPeerID: 0x15586600 DisplayName = Jon Yang’s iPad>

正如您所看到的,即使Browser和Advertiser有他们的peerId信息,当他们被其他对等方接收时,他们的peerId也是不同的。有谁能解释一下?有什么我做错了吗?

答案
 <MCPeerID: 0x1663e670 DisplayName = Jon Yang’s iPad>

0x1663e670表示当前设备上MCPeerID对象的内存地址。不要将它与框架引用的实际MCPeerID对象混淆。只要displayName符合预期,那么它就是正确的同伴。

以上是关于另一个对等方接收的PeerID对象与MultipeerConnectivity Framework中的原始对象不同的主要内容,如果未能解决你的问题,请参考以下文章

多点连接 手动连接/管理点

linux虚拟内存附加/分离信号

在 Python 中使用 Twitch IRC 时“由对等方重置连接”

在 TCP 中检测到其他对等方已关闭

什么时候需要转?对称 NAT 和端口限制 NAT

Python socket.error:[Errno 104] 对等方重置连接