Извлечение контакта из Contacts Framework не работает iOS 13 - PullRequest
0 голосов
/ 16 октября 2019

В своем приложении я создаю CNContact и сохраняю в хранилище контактов, а также сохраняю контактный идентификатор . В другом разделе приложения я использую идентификатор для извлечения этого контакта, но не работает в iOS 13. ( Это работает на iOS 12 )

Примечание: Мне известно о разрешении ключа заметки контакта на iOS 13, но я не получаю это поле.

Вот как я могу создать контакт:

func createPlaceholderContactFor(telephoneNumber: String) {
    guard
        placeholderContactIdentifier == nil,
        CNContactStore.authorizationStatus(for: .contacts) == .authorized
    else {
        return
    }

    // Creating a mutable object to add to the contact
    let contact = CNMutableContact()
    contact.imageData = UIImage(named: "MainIcon")?.jpegData(compressionQuality: 1.0)
    contact.givenName = placeholderDefaultName
    contact.familyName = ""
    contact.phoneNumbers = [CNLabeledValue(
        label:CNLabelPhoneNumberiPhone,
        value:CNPhoneNumber(stringValue:telephoneNumber))]

    // Saving the newly created contact
    let saveRequest = CNSaveRequest()
    saveRequest.add(contact, toContainerWithIdentifier:nil)

    do {
        let store = CNContactStore()
        try store.execute(saveRequest)

        if contact.isKeyAvailable(CNContactIdentifierKey) {
            print(contact.identifier) //this is printed on console and contact appears on phone app.
            placeholderContactIdentifier = contact.identifier
        }
    } catch {
        print(error.localizedDescription)
    }
}

Вот как я получаю контакт:

private func placeholderContact() -> CNContact? {
    guard
        let identifier = placeholderContactIdentifier,
        CNContactStore.authorizationStatus(for: .contacts) == .authorized
        else { return nil }

    let predicate: NSPredicate = CNContact.predicateForContacts(withIdentifiers: [identifier])

    let keysToFetch = [
        CNContactIdentifierKey as CNKeyDescriptor,
        CNContactGivenNameKey as CNKeyDescriptor,
        CNContactFamilyNameKey as CNKeyDescriptor,
        CNContactPhoneNumbersKey as CNKeyDescriptor
    ]

    do {
        let store = CNContactStore()

        let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
        return contacts.first
    }
    catch {
        print(error.localizedDescription)

        return nil
    }
}

Я также пытался использовать let contact = try store.unifiedContact(withIdentifier: identifier, keysToFetch: keysToFetch) вместо let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch), но это выдает ошибку.

...