为什么通过Multipeer Connectivity发送的字符串在接收端出现乱码?

时间:2018-10-16 14:59:16

标签: ios swift multipeer-connectivity

我正在开发一个增强现实应用程序,其中多个用户可以连接并查看相同的虚拟内容。我正在使用Apple的Multipeer Connectivity框架进行通信,但是在两个已连接对等体之间发送和接收字符串时遇到麻烦。

想法是,当将SCNNode添加到用户的虚拟空间时,Multipeer将在对等网络中发送节点在3D空间中的位置,其颜色及其大小,接收对等体可以添加相同的内容满足他们的空间。

我像这样构建字符串:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    let nodeColor = node.geometry?.firstMaterial?.diffuse.contents
    let nodePosition = node.position
    let dataString = "x: \(nodePosition.x) y: \(nodePosition.y) z: \(nodePosition.z) color: \(nodeColor!) radius: \(sphereRadius)"
    let dataToSend = dataString.data(using: .utf8)
    MultiPeer.instance.send(data: dataToSend!)
}

以下是发送数据的功能:

public func send(data: Data){
    if isConnected {
        do {
            let item = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)
            try session.send(item, toPeers: session.connectedPeers, with: MCSessionSendDataMode.reliable)
        } catch let error {
            printDebug(error.localizedDescription)
        }
    }
}

在接收端:

public func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    let incomingString = String(decoding: data, as: UTF8.self)
    print(incomingString)
}

我通过发送字符串测试了代码,这是其中三个字符串在接收端的输出:

Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$top:-0.04734481 z: -0.019065317 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�

Troot�#-27:@����bplist00�X$versionX$objectsY$archiverT$topIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�

Troot�#-27:@����bplist00� X$versionX$objectsY$archiverT$top\277\275U$nullOax: 0.01673067 y: -0.048672535 z: -0.02221658 color: UIExtendedSRGBColorSpace 1 0 0 1 radius: 0.01_NSKeyedArchiver�

很显然,正在发送和接收字符串,但并非没有多余的字符和符号。 任何输入表示赞赏,谢谢!

更新:Martin R.指出我没有使用NSKeyedUnarchiver来解码字符串。此后,我更新了代码以使用它:

let receivedData = data
let receivedString = String(data: receivedData, encoding: .utf8)
print("Received data \(String(describing: receivedString))")


do {
    let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
    let decodedString = unarchiver.decodeData()
    print("Decoded string: \(String(describing: decodedString))")
}catch let error {
    print(error.localizedDescription)
}

该字符串不再乱码,但为零。在解码之前是这样,因此当对等方接收到该字符串时,该字符串为nil。

1 个答案:

答案 0 :(得分:2)

@Martin R.解决了添加符号的问题,并建议使用NSKeyedUnarchiver解压缩数据。之后,我发现接收端的字符串为nil。更改

do {
    let unarchiver = try NSKeyedUnarchiver(forReadingFrom: receivedData)
    let decodedString = unarchiver.decodeData()
    print("Decoded string: \(String(describing: decodedString))")
}catch let error {
    print(error.localizedDescription)
}

do {
    let decodedString = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(receivedData)
    print("Decoded string: \(String(describing: decodedString))")
}catch let error {
    print(error.localizedDescription)
}

解决了该问题,现在可以正确发送和接收字符串了。