Добавление CNContact в CNGroup и получение CNContacts из CNGroup не работает - PullRequest
0 голосов
/ 06 ноября 2019

поэтому я попытался создать 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
            }
        }
    }
...