5

我正在使用 WWDC 2018 中引入的 ARKit 2.0 测试 Apple 的 Multiuser AR 演示应用程序:创建多用户 AR 体验

文档说,在每个设备重新定位到相同的位置后World Map,只有重新创建每个用户操作所需的信息在设备之间共享(例如,如果用户点击屏幕并出现 3D 对象,则只有该新对象ARAnchor应该发送到其他设备)。对我来说,虽然它显示了发送设备在捕获并发送世界地图之前放置的所有 3D 字符,但它不显示在发送世界地图之后添加的任何对象。我得到的错误说:

// can't decode data recieved from peer.

有没有人遇到过这个问题并且知道它是怎么回事?

我没有更改演示代码中的任何内容。

4

2 回答 2

0

我遇到了同样的麻烦,但我以这种方式解决了它。

(1)首先创建一个变量来检查世界地图是否有发送。

var worldMapHasInited: Bool = false

(2)然后在func shareSession(_ button: UIButton)中将这一行添加到下面的末尾

self.multipeerSession.sendToAllPeers(数据)

self.worldMapHasInited = true

(3)最后在func receivedData(_data:Data,from peer:MCPeerID)

检查世界地图是否已发送,如果已发送,则跳过检查数据是否包含世界地图。

    if !worldMapHasInited {
        if let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data)
        {
            //....
            // when received world map, set the receiver's 
            // worldMapHasInited to true  
            self.worldMapHasInited = true                                              
        }
    }
    else
        if let anchor = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARAnchor.self, from: data) {
            // ...
    }

这将直接检查数据是否包含锚点。

于 2018-09-24T19:49:01.807 回答
0

在 MultipeerConnectivity ARSession 中,几个对等点彼此共享数据。但是发送和接收的数据必须首先使用NSKeyedArchiverNSKeyedUnarchiver类的两个实例方法进行归档然后取消归档:

func archive(worldMap: ARWorldMap) throws {

    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap,
                                         requiringSecureCoding: true)

    try data.write(to: worldMapURL, options: [.atomic])
}

和:

func unarchive(worldMapData: Data) -> ARWorldMap? {

    guard let unarchievedData = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, 
                                                                           from: worldMapData)
    else { return nil }

    return unarchievedData
}

因此,如果您在 Xcode 控制台中收到以下消息:

"can't decode data received from peer"

这意味着在传输或取消归档 ARWorldMap 数据时发生错误。

于 2020-06-26T14:22:31.300 回答