MCAdvertiserAssistant object to tell the peers that your app can join a multipeer session of a particular service type. The advertiserAssistant also provides a standard user interface for the local peer to accept or decline an invitation to connect to a session.
func sendToAllPeers(_ data: Data) {
do {
try mcSession.send(data, toPeers: mcSession.connectedPeers, with: .reliable)
} catch {
print("""
error sending data to peers:
\(error.localizedDescription)
""")
}
}
func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
sceneView.session.getCurrentWorldMap { (worldMap, error) in
guard let map = worldMap else {
print("Error: \(error!.localizedDescription)")
return
}
// 取得產生AR物件的環境截圖,這樣對方才知道在哪個地方會出現AR物件
guard let snapshotAnchor = SnapshotAnchor(capturing: self.sceneView) else {
fatalError("Can't take snapshot")
}
map.anchors.append(snapshotAnchor)
// 將資料進行encode
guard let data =
try? NSKeyedArchiver.archivedData(withRootObject: map,
requiringSecureCoding: true)else {
fatalError("can't encode map")
}
self.peerSession.sendToAllPeers(data)
}
browserViewController.dismiss(animated: true, completion: nil)
}
extension ViewController {
func handleReceivedData(_ data: Data, from peer: MCPeerID) {
do {
// parse data
if let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data) {
DispatchQueue.main.async {
// restore virtual content to the screen
self.displaySnapshotImage(from: worldMap)
}
// configure the AR session using the world map
configureARSession(for: worldMap)
// set mapProvider to remember the sender
mapProvider = peer
return
}
} catch {
print("can't decode data received from \(peer)")
}
// 表示之前已經有取得ARWorldMap
if !isRelocalizingMap {
do {
// 等待ARLineAnchor的資料
if let anchor = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARLineAnchor.self, from: data) {
sceneView.session.add(anchor: anchor)
}
} catch {
print("unknown data received from \(peer)")
}
}
}
}