我正在为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()
})
}
}