2016-04-11 13 views
0

CNContactオブジェクトをNSDataに変換しようとすると、Multipeer Connectivity経由で別のデバイスに送信されます。ここでの連絡先データを送信するための私のコードだ: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) 
    } 
} 

データがnilでないことを示しNSDataためのprint文の出力には、があります。しかし、私はCNContactsの配列にオブジェクトを展開しようとすると、nilを返します。なぜどんなアイデア?

私はまた、それらの配列の代わりに単一のCNContactオブジェクトを送信しようとしましたが、結果は同じです。

答えて

0

上記のコードでCNContactのデータを2回誤ってアーカイブしてしまったことに気がつきました。アーカイブを解除するためには1度しか行っていません。以下のいずれかをアーカイブ解除するコードを変更すると、動作します:

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オブジェクトをアーカイブし、それをアーカイブ解除ならば、それは動作しません。それでも理由は分かりません。

0

CNContactVCardSerializationクラスを参照してください。

関連する問題