2015-12-14 16 views
5

Sto cercando di creare una condivisione estensione iOS per condividere i contatti utilizzando il seguente codice:Come creare una quota di estensione iOS per i contatti

let contactType = "public.vcard" 

override func viewDidLoad() { 
    let items = extensionContext?.inputItems 
    var itemProvider: NSItemProvider? 

    if items != nil && items!.isEmpty == false { 
     let item = items![0] as! NSExtensionItem 
     if let attachments = item.attachments { 
      if !attachments.isEmpty { 
       itemProvider = attachments[0] as? NSItemProvider 
      } 
     } 
    } 

    if itemProvider?.hasItemConformingToTypeIdentifier(contactType) == true { 
     itemProvider?.loadItemForTypeIdentifier(contactType, options: nil) { item, error in 
      if error == nil { 
       print("item: \(item)") 
      } 
     } 
    } 
} 

Sto ottenendo il seguente output:

item: Optional(<42454749 4e3a5643 4152440d 0a564552 53494f4e 3a332e30 0d0a5052 4f444944 3a2d2f2f 4170706c 6520496e 632e2f2f 6950686f 6e65204f 5320392e 322f2f45 4e0d0a4e 3a42656e 6e657474 3b436872 69733b3b 3b0d0a46 4e3a2043 68726973 20204265 6e6e6574 74200d0a 54454c3b 74797065 3d484f4d 453b7479 70653d56 4f494345 3b747970 653d7072 65663a28 36313529 c2a03432 352d3637 31390d0a 454e443a 56434152 440d0a>) 

Se imposto un breakpoint, vedo che l'elemento ha un tipo di NSSecureCoding. La mia domanda è: come posso trasformare questo in un contatto CNC?

risposta

4

L'articolo che si ottiene è del tipo NSData. Bisogna trasformarlo in String per ottenere la stringa vCard:

if itemProvider?.hasItemConformingToTypeIdentifier(contactType) == true { 
    itemProvider?.loadItemForTypeIdentifier(contactType, options: nil) { item, error in 
     if error == nil { 
      if let data = item as? NSData, let vCardString = String(data: data, encoding: NSUTF8StringEncoding) { 
       print(vCardString) 
      } 
     } 
    } 
} 
+0

impressionante che ha funzionato, grazie. – atmospherelabs

+0

Ho fatto le cose ma sono rimasto bloccato al momento del rilascio. La convalida dell'applicazione non è riuscita e ha mostrato l'errore: ** Info.plist non valido. Il valore per la chiave 'NSExtensionActivationRule' in bundle non è valido ** Se hai avuto la stessa esperienza, per favore aiutami. Grazie in anticipo .. –

+0

@BhavinTrivedi Non ho avuto questo problema. Aggiungi una nuova domanda per il tuo problema. – joern

0

risposta aggiornata del @joern a Swift 3:

if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeContact as String) { 

    itemProvider.loadItem(forTypeIdentifier: kUTTypeContact as String, options: nil, completionHandler: { (contact, error) in 
      if let contactData = contact as? Data, let vCardString = String(data: contactData, encoding: .utf8) { 
       print(vCardString) 
      } 
    }) 
} 

anche una proroga di azione è necessario aggiungere il OperationQueue:

if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeContact as String) { 

    itemProvider.loadItem(forTypeIdentifier: kUTTypeContact as String, options: nil, completionHandler: { (contact, error) in 
     OperationQueue.main.addOperation { 
      if let contactData = contact as? Data, let vCardString = String(data: contactData, encoding: .utf8) { 
       print(vCardString) 
      } 
     } 
    }) 
} 
2

Quando si condivide qualsiasi contatto, itemProvider contiene vCard format di CNContact. Per accedere a quel contatto, è necessario convertire tali dati (digitare NSSecureCoding) in CNContact.

let uttypeContact = kUTTypeContact as String 
if itemProvider.hasItemConformingToTypeIdentifier(uttypeContact) { 
    itemProvider.loadItemForTypeIdentifier(uttypeContact, options: nil, completionHandler: { (data, error) in 

    if error == nil { 
     do { 
     if let data = data as? NSData { 
      let contact = try CNContactVCardSerialization.contactsWithData(data) 
      print(contact) 
     } 
     } catch {} 
    } 
    }) 
} 

[Update] Per maggiori dettagli https://forums.developer.apple.com/message/92115#92115