2016-10-17 2 views
11

Ich möchte ein benutzerdefiniertes verstecktes Feld in iOS mobile Kontakte aus meiner Anwendung hinzufügen.Wie kann ich ein benutzerdefiniertes verstecktes Feld in ios mobile Kontakte durch CNMutableContact hinzufügen?

Ist es möglich, das neue versteckte Feld mit Wert in mobilen iOS-Kontakten hinzuzufügen? Kann CNMutableContact mir die neue benutzerdefinierte Eigenschaft hinzufügen?

+0

Thew Dokumentation scheint anzuzeigen, dass Sie können - ich bin auch auf der Suche nach der gleichen Antwort. – Jeremy

+0

können Sie über versteckte Felder erklären? welche Art von versteckten Feld –

+0

Nein, Sie können nicht neue Felder in CNContact oder CNMutableContact hinzufügen –

Antwort

2

Die kurze Antwort ist leider nein, das ist nicht möglich.

Die lange Antwort ist: CNMutableContact ist Unterklasse CNContact, die mit der folgenden öffentlichen Schnittstelle kommt.

open class CNContact : NSObject, NSCopying, NSMutableCopying, NSSecureCoding { 
    open var identifier: String { get } 
    open var contactType: CNContactType { get } 
    open var namePrefix: String { get } 
    open var givenName: String { get } 
    open var middleName: String { get } 
    open var familyName: String { get } 
    open var previousFamilyName: String { get } 
    open var nameSuffix: String { get } 
    open var nickname: String { get } 
    open var organizationName: String { get } 
    open var departmentName: String { get } 
    open var jobTitle: String { get } 
    open var phoneticGivenName: String { get } 
    open var phoneticMiddleName: String { get } 
    open var phoneticFamilyName: String { get } 
    open var phoneticOrganizationName: String { get } 
    open var note: String { get } 
    open var imageData: Data? { get } 
    open var thumbnailImageData: Data? { get } 
    open var imageDataAvailable: Bool { get } 
    open var phoneNumbers: [CNLabeledValue<CNPhoneNumber>] { get } 
    open var emailAddresses: [CNLabeledValue<NSString>] { get } 
    open var postalAddresses: [CNLabeledValue<CNPostalAddress>] { get } 
    open var urlAddresses: [CNLabeledValue<NSString>] { get } 
    open var contactRelations: [CNLabeledValue<CNContactRelation>] { get } 
    open var socialProfiles: [CNLabeledValue<CNSocialProfile>] { get } 
    open var instantMessageAddresses: [CNLabeledValue<CNInstantMessageAddress>] { get } 
    open var birthday: DateComponents? { get } 
    open var nonGregorianBirthday: DateComponents? { get } 
    open var dates: [CNLabeledValue<NSDateComponents>] { get } 
    /* [...] functions */ 
} 

Der einzige notwendige Unterschied zwischen den beiden Typen (die es wandelbar macht) ist, dass abgesehen von der identifier Eigenschaft der CNMutableContact ‚s Eigenschaften nicht als get-nur die angegeben. Wenn Sie genauer hinsehen, können Sie jetzt erkennen, dass benutzerdefinierte Eigenschaften für Kontaktobjekte nicht möglich sind. Wenn ich die CNMutableContact wie im folgenden Beispiel subklassifiziere, ergibt dies nilError und CNContactStore speichert unseren benutzerdefinierten Kontakt nicht.

func saveCustomContact() { 
    let contactStore = CNContactStore() 
    let contact = MyContact() 

    contact.givenName = "John" 
    contact.familyName = "Doe" 
    contact.test = "Hello World" 

    do { 
     let saveRequest = CNSaveRequest() 
     saveRequest.add(contact, toContainerWithIdentifier: nil) 
     try contactStore.execute(saveRequest) 
    } catch { 
     print(error) 
    } 
} 

func retrieveCustomContact() { 
    DispatchQueue.global().async { 
     let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName),CNContactPhoneNumbersKey] as [Any] 
     let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch as! [CNKeyDescriptor]) 
     CNContact.localizedString(forKey: CNLabelPhoneNumberiPhone) 

     fetchRequest.mutableObjects = false 
     fetchRequest.unifyResults = true 
     fetchRequest.sortOrder = .userDefault 

     do { 
      try CNContactStore().enumerateContacts(with: fetchRequest) { (contact, stop) -> Void in 
       guard let contact = contact as? MyContact else { print("damn - it's not working!"); return } 
       print(contact.test) 
      } 
     } catch { 
      print(error) 
     } 
    } 
} 

open class MyContact: CNMutableContact { 
    open var test: String? 
} 

Das bringt mich zu dem Schluss, dass Apple will uns nicht benutzerdefinierte Felder in dem Standardkontaktbuch speichern, die von einem Sync (Serialisierung/Deserialisation) Perspektive leicht verständlich ist.

+0

Danke @ cr0ss Ich mag, wie Sie die öffentliche Schnittstelle hier geteilt. Das hilft. Das Umbenennen eines Felds klingt wie ein Workaround, ist aber für den Endbenutzer immer noch sichtbar. Bummel. :) Sehr geschätzt, unabhängig! – finneycanhelp

Verwandte Themen