使用Swift Multipeer连接时发送和接收数据失败

时间:2015-11-08 20:28:50

标签: ios swift multipeer-connectivity

我正在为4人玩的纸牌游戏构建iOS应用程序。我打算使用Multipeer Connectivity框架。所以我开始从聊天应用程序中学习并将其修改为群聊应用程序。 (我复制了Building a Chat App in Swift Using Multipeer Connectivity Framework

中的一些代码

当只连接2或3个设备时,一切运行良好,但当我尝试4个设备时,我遇到了这个问题: 某些设备之间传递的消息有时会失败。例如,在一次测试中,D不能向C发送消息,而A,B和C可以向所有其他消息发送消息。

我怀疑它的连接问题。所以我打印出session.connectedPeers.count来检查所有设备是否有3个连接对等体。他们做到了。我还列出了所有这些作为证明。

我在线搜索了一些相关问题,并且有答案说广告和浏览同时会导致连接问题。所以我避免这样做。我尝试过制作一个设备广告,另外三个浏览,还尝试制作三个设备进行浏览和一个广告。此外,当群聊开始时,我关闭了广告和浏览(连接后)。但他们都没有解决我的问题。

现在我猜它与发送数据有关,但我不会收到错误。我想知道session.connectedPeers中的所有同伴都可以接收数据吗?或者如何处理群聊的发送和接收过程?

以下是我发送数据的代码:(输入消息时,会将其发送到聊天组中的其他设备)

 func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()     
    let text = textField.text as String!
    let messageDictionary: [String: String] = ["message": text]   
    let messageData = NSKeyedArchiver.archivedDataWithRootObject(messageDictionary)

    do {
        try appDelegate.mpcManager.session.sendData(messageData, toPeers: appDelegate.mpcManager.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
    } catch let error as NSError {
        print(error.localizedDescription)
        return false
    }

    let dictionary: [String: String] = ["sender": "self", "message": text]
    messagesArray.append(dictionary)
    self.updateTableview()
    textField.text = ""       
    return true
}

以下是收到数据的方式:

func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) {
    let dictionary: [String: AnyObject] = ["data": data, "fromPeer": peerID]
    NSNotificationCenter.defaultCenter().postNotificationName("receivedMPCDataNotification", object: dictionary)
}


func handleMPCReceivedDataWithNotification(notification: NSNotification) {
    // Get the dictionary containing the data and the source peer from the notification.
    let receivedDataDictionary = notification.object as! Dictionary<String, AnyObject>

    // "Extract" the data and the source peer from the received dictionary.
    let data = receivedDataDictionary["data"] as? NSData
    let fromPeer = receivedDataDictionary["fromPeer"] as! MCPeerID

    // Convert the data (NSData) into a Dictionary object.
    let dataDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! Dictionary<String, String>

    // Check if there's an entry with the "message" key.
    if let message = dataDictionary["message"] {

        // Create a new dictionary and set the sender and the received message to it.
        let messageDictionary: [String: String] = ["sender": fromPeer.displayName, "message": message]

        // Add this dictionary to the messagesArray array.
        messagesArray.append(messageDictionary)

        // Reload the tableview data and scroll to the bottom using the main thread.
        NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                self.updateTableview()
        })
    }
}

0 个答案:

没有答案