поэтому я попытался создать CNContact и добавить этот контакт в какую-то группу CNGroup. Эта часть работает. Получение CNContacts от выбранной CNGroup не возвращает мне никаких результатов. Кроме того, я заметил, что в моей контактной группе пользовательская группа находится в 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, name=tempContacts, iOSLegacyIdentifier=5, creationDate=(null), modificationDate=(null), externalIdentifier=(null), externalRepresentation=(null), externalModificationTag=(null), 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
}
}
}