0

我编写了代码将单个联系人打包到 vCard Data 对象中,然后将其解包,然后在之前没有的地方添加一个姓氏,然后将解包后的联系人保存回同一个容器并将其添加到同一个组中原始联系人在。当我查看联系人 iOS 应用程序时的结果是,当我获取该组中的统一联系人时,我保存的解压缩联系人显示为与原始联系人不同的联系人。我期待一个将这两个联系人结合在一起的统一联系人。

我看到 vCard 数据更新了我 iPhone 中的联系人。他们是怎么做到的?解压缩 vCard 数据对象时,标识符会更改。通过查看标识符,无法知道 iPhone 中的现有联系人是否与 vCard Data 对象中的相同联系人。如果我检查 iPhone 中统一联系人的所有属性,如果自从该联系人保存在联系人存储中后 iPhone 上的属性发生了更改怎么办?如果我确实在联系人存储中找到与解压缩的联系人相同的联系人,当我将解压缩的联系人保存在联系人存储中时,它将是一个全新的联系人,并且当下次调用 enumerateContacts 并将 unifyResults 设置为 true 时,正如我的代码所证明的那样,我相信新联系人不会与原始联系人统一。

是枚举联系人存储中所有统一联系人的唯一解决方案并比较所有属性,并将具有最多属性值的统一联系人与解包联系人中的相同属性相同,并使用值更新该统一联系人解包联系人中的属性?

do {
    
    print("contact.identifier: \(contact.identifier)")
    
    var data = Data()
    
    try data = CNContactVCardSerialization.data(with: [contact])
    
    let contacts = try CNContactVCardSerialization.contacts(with: data)
    
    let unpackedContact = contacts.first!
    
    print("unpackedContact.identifier: \(unpackedContact.identifier)")
    
    if contact.identifier == unpackedContact.identifier {
        print("identifier didn't change when unpacking from vCard data")
    } else {
        print("identifier changed when unpacking from vCard data")
    }
    
    let mutableCopyOfUnpackedContact: CNMutableContact = unpackedContact.mutableCopy() as! CNMutableContact
    
    mutableCopyOfUnpackedContact.familyName = "Lee"

    let saveContactRequest = CNSaveRequest()

    saveContactRequest.add(mutableCopyOfUnpackedContact, toContainerWithIdentifier: contactStore.defaultContainerIdentifier())
    
    saveContactRequest.addMember(mutableCopyOfUnpackedContact, to: group)
    
    try contactStore.execute(saveContactRequest)
    
} catch {
    
    print(error.localizedDescription)
    
}

调试窗口:

contact.identifier: 82A9D82C-7B97-402B-82AC-D1D2D7036C3A:ABPerson
unpackedContact.identifier: 06FB07FB-17F7-473C-BB38-F34A260948C4:ABPerson
identifier changed when unpacking from vCard data


do {
    
    let predicateGroups = CNGroup.predicateForGroupsInContainer(withIdentifier: contactStore.defaultContainerIdentifier())
    
    let groups = try contactStore.groups(matching: predicateGroups)
    
    var groupFamily: CNGroup! = nil
    
    for group in groups {
        
        if group.name == "Family" {
            groupFamily = group
        }
        
    }
    
    
    let predicateContactsInGroup = CNContact.predicateForContactsInGroup(withIdentifier: groupFamily.identifier)
    
    let contactFetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)
    
    contactFetchRequest.predicate = predicateContactsInGroup
    
    contactFetchRequest.unifyResults = true
    
    do {
        
        try contactStore.enumerateContacts(with: contactFetchRequest) {
            
            contact, stop in
            
            print("contact givenName: \(contact.givenName) familyName: \(contact.familyName)")
            
        } // try contactStore.enumerateContacts
        
    } catch {
        
        print(error.localizedDescription)
        
    }
    
} catch {
    
    print(error.localizedDescription)
    
}

这导致一个与原始联系人相同的全新联系人,除了新联系人分配了姓氏,即“Lee”。

4

0 回答 0