ARKit 4.0 - Можно ли преобразовать данные ARWorldMap в файл JSON? - PullRequest
4 голосов
/ 04 августа 2020

Я хотел бы знать, возможно ли преобразовать двоичные данные worldMap (которые хранят состояние сопоставления пространства и набор ARAnchors) в json или xml файл?

func writeWorldMap(_ worldMap: ARWorldMap, to url: URL) throws {

    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, 
                                         requiringSecureCoding: true)
    try data.write(to: url)
}

Если это возможно, какие инструменты я могу использовать для этого?

1 Ответ

4 голосов
/ 09 августа 2020

Боюсь, что единственный способ сделать это - обернуть объект ARWorldMap в объект Codable, например:

struct ARData {
    var worldMap: ARWorldMap?
}

extension ARData: Codable {
    enum CodingKeys: String, CodingKey {
        case worldMap
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        let worldMapData = try container.decode(Data.self, forKey: .worldMap)
        worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: worldMapData)
    }
    
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        
        if let worldMap = worldMap {
            let colorData = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
            try container.encode(colorData, forKey: .worldMap)
        }
    }
}

Чтобы закодировать экземпляр этого объекта в JSON используйте функцию encode(:) из JSONEncoder:

let arData = ARData(worldMap: worldMap)
let encoder = JSONEncoder()

do {
    let jsonData = try encoder.encode(arData)
} catch {
    print(error.localizedDescription)
}

По умолчанию JSONEncoder преобразует данные ARWorldMap в строку Base64, которую можно прочитать с помощью JSONDecoder:

let decoder = JSONDecoder()

do {
    let decoded = try decoder.decode(ARData.self, from: jsonData)
} catch {
    print(error.localizedDescription)
}
...