所以我试图建立CNContact并将该联系人添加到某些CNGroup中。这部分正在工作。从选定的CNGroup提取CNContact不会返回任何结果。另外,我注意到在我的联系人应用程序中,自定义组位于Gmail下,当我选择该自定义组时,我看不到任何联系人。
我尝试了很多事情,但是最重要的是,我看到在创建和获取联系人时得到的那个组具有相同的标识符,因此它应该可以工作。
创建群组:
CNGroup: 0x281784c00: identifier=E43F7D4A-3240-49FB-9D22-B79E3325A080:ABGroup,name=tempContacts,iOSLegacyIdentifier=5,creationDate=(null),modificationDate=(null),externalIdentifier=(null),externalRepresentation=(null),externalModificationTag=(null),externalUUID=(null)>
要删除的组:
<CNGroup: 0x2803fd3e0: identifier=E43F7D4A-3240-49FB-9D22-B79E3325A080:ABGroup,externalUUID=(null)>
此外,它仅在我添加联系人并立即将其删除时才有效。但是,如果我在一个会话上创建联系人,而在另一个应用程序启动时,尝试从同一组中获取联系人(是的,标识符相同),将没有结果。
用于提取同一组中联系人的扩展名
extension CNContactStore
func contacts(for group: CNGroup) -> [CNContact] {
let predicate = CNContact.predicateForContactsInGroup(withIdentifier: group.identifier)
let fetchRequest = CNContactFetchRequest(keysToFetch: [CNContactPhoneNumbersKey as CNKeyDescriptor,CNContactGivenNameKey as CNKeyDescriptor,CNContactFamilyNameKey as CNKeyDescriptor])
fetchRequest.predicate = predicate
var foundContacts: [CNContact?] = []
try? self.enumerateContacts(with: fetchRequest) { contact,_ in
foundContacts.append(contact)
}
return foundContacts.compactMap { $0 }
}
func createTemporary(name: String,phoneNumber: String) {
guard hasPermission() else { return }
let mutableContact = CnmutableContact()
if let name = name {
mutableContact.givenName = name
}
mutableContact.contactType = .person
let phoneNumber = CNLabeledValue<CNPhoneNumber>(label: "temp",value: CNPhoneNumber(stringValue: phoneNumber))
mutableContact.phoneNumbers = [phoneNumber]
let saveRequest = CNSaveRequest()
saveRequest.add(mutableContact,toContainerWithIdentifier: nil)
if let group = retriveContactGroup(for: .temporary) {
saveRequest.addMember(mutableContact,to: group)
}
do {
try store.execute(saveRequest)
} catch {
print(error.localizedDescription)
}
}
private func contactGroup(for groupName: GroupName) -> CNGroup? {
do {
let groups = try store.groups(matching: nil)
let filteredGroups = groups.filter { $0.name == groupName.name }
return filteredGroups.first
} catch {
return nil
print("Error finding group")
}
}
private func retriveContactGroup(for groupName: GroupName) -> CNGroup? {
// Try to get contact group
if let group = contactGroup(for: groupName) {
return group
} else {
// Try to create the group
do {
let saveRequest = CNSaveRequest()
let newGroup = CnmutableGroup()
newGroup.name = groupName.name
saveRequest.add(newGroup,toContainerWithIdentifier: nil)
try store.execute(saveRequest)
print("Created a new group")
return newGroup
} catch {
print("Failed to save new group")
return nil
}
}
}