Преобразование CNContact в NSData и наоборот

Я пытаюсь преобразовать объекты CNContact в NSData для отправки на другое устройство через многоранговое подключение. Вот мой код для отправки данных контактов:

 func sendContactsToPeer(peerId: MCPeerID, contacts: [CNContact]) {
    let contactsData: NSData = NSKeyedArchiver.archivedDataWithRootObject(contacts)
    do {
        try self.session.sendData(NSKeyedArchiver.archivedDataWithRootObject(contactsData), toPeers: self.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
    } catch {
        print("Unable to send contacts data to \(peerId.displayName)")
    }
}

А это для получения контактов:

func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) {
    print("Received data: \(data) From Peer: \(peerID)")

    if let contacts: [CNContact] = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CNContact] {
        self.delegate?.didReceiveContacts(contacts, fromPeer: peerID)
    }
}

Вывод оператора печати для NSData указывает на то, что данные не равны нулю. Но когда я попытался разархивировать объект в массив CNContacts, он возвращает nil. Есть идеи, почему?

Обратите внимание, что я также пытался просто отправить один объект CNContact вместо их массива, но результаты такие же.


person Chan Jing Hong    schedule 11.04.2016    source источник


Ответы (2)


Я понял, что случайно дважды заархивировал данные CNContact в приведенном выше коде, а для разархивирования я сделал это только один раз. Изменение кода для разархивирования приведенного ниже работает:

func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) {
    print("Received data: \(data) From Peer: \(peerID)")

    if let contactsData: NSData = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSData {
        if let contacts: [CNContact] = NSKeyedUnarchiver.unarchiveObjectWithData(contactsData) as? [CNContact] {
            self.delegate?.didReceiveContacts(contacts, fromPeer: peerID)
        }
    }
}

Но, однако, если я заархивирую объект CNContact только один раз и разархивирую его, это не сработает. До сих пор понятия не имею, почему.

person Chan Jing Hong    schedule 12.04.2016

Ознакомьтесь с классом CNContactVCardSerialization.

person Michal Gumny    schedule 08.05.2017