我正在测试苹果的多用户AR演示应用程序,其中包含WWDC 2018中引入的ARKit 2.0:创建多用户AR体验。
文档说,在每个设备重新定位到相同的World Map
后,只有重新创建每个用户操作所需的信息才会在设备之间共享(例如,如果用户点击屏幕并出现3D对象,则只有该新对象的ARAnchor
应发送到其他设备(。对我来说,虽然它显示了发送设备在捕获和发送世界地图之前放置的所有 3D 角色,但它没有显示发送世界地图后添加的任何对象。我得到的错误说:
// can't decode data recieved from peer.
有没有人遇到过这个问题,知道它是关于什么的?
我没有更改演示代码中的任何内容。
我遇到了同样的麻烦,但我以这种方式解决了它。
(1(首先创建一个变量来检查世界地图是否已发送。
var worldMapHasInited: bool = false
(2(然后在func shareSession(_按钮:UIButton(中将这一行添加到下面的末尾
self.multipeerSession.sendToAllPeers(data(
self.worldMapHasInited = true
(3(最后在函数中接收数据(_数据:数据,来自对等方: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) {
// ...
}
这将直接检查数据是否包含锚点。
在MultipeerConnectivity ARSession中,多个对等体相互共享数据。但是,发送和接收的数据必须首先存档,然后使用NSKeyedArchiver
和NSKeyedUnarchiver
类的两种实例方法取消存档:
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 数据时发生错误。