我正在尝试将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对象,而不是它们的数组,但结果是相同的。
发布于 2016-04-12 10:47:04
我意识到,在上面的代码中,我意外地将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对象归档一次,然后再将其解压,它将无法工作。仍然不知道为什么。
发布于 2017-05-08 14:52:34
查看CNContactVCardSerialization类
https://stackoverflow.com/questions/36546221
复制相似问题