Изображение контакта не получается при извлечении всего списка контактов с iPhone с помощью CNContact

Я знаю, что этот вопрос уже задан, но не получил решения.

Из этого кода я получу всю информацию от контакта, но изображение не будет найдено при открытии файлов vcf в Mac OS, а также не будет получено при совместном использовании этого файла. Я использую эту ссылку stackoverflow здесь но это не полная помощь.

var contacts = [CNContact]()
let keys = [CNContactVCardSerialization.descriptorForRequiredKeys()
        ] as [Any]
let request = CNContactFetchRequest(keysToFetch: keys as! [CNKeyDescriptor])

    do {
        try self.contactStore.enumerateContacts(with: request) {
            (contact, stop) in
            // Array containing all unified contacts from everywhere
            contacts.append(contact)
        }
    } catch {
        print("unable to fetch contacts")
    }

    do {
        let data = try CNContactVCardSerialization.data(with: contacts)

        if let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
            let fileURL = directoryURL.appendingPathComponent("contacts").appendingPathExtension("vcf")
            print(fileURL)
            do {
                try data.write(to: fileURL, options: .atomic)
            } catch {
                print("error \(error)")
            }
        }

    } catch {
        print("error \(error)")
    }

person Trupesh Vaghasiya    schedule 21.11.2018    source источник


Ответы (2)


Да, let data = try CNContactVCardSerialization.data(with: contacts) дает только информацию о контактах, а не данные изображения, поэтому вам нужно сделать так, чтобы вы могли получить правильные файлы VCF.

var finalData = Data()

    for contact in contacts {
        do {
            var data = try CNContactVCardSerialization.data(with: [contact])
            var vcString = String(data: data, encoding: String.Encoding.utf8)
            let base64Image = contact.imageData?.base64EncodedString()
            let vcardImageString = "PHOTO;TYPE=JPEG;ENCODING=BASE64:" + (base64Image ?? "") + ("\n")
            vcString = vcString?.replacingOccurrences(of: "END:VCARD", with: vcardImageString + ("END:VCARD"))
            data = (vcString?.data(using: .utf8))!
            finalData += data
        } catch {
            print("error \(error)")
        }
    }

    if let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
        let fileURL = directoryURL.appendingPathComponent("contacts").appendingPathExtension("vcf")
        do {
            try finalData.write(to: fileURL, options: .atomic)
        } catch {
            print("error \(error)")
        }
    }
person Haresh Gediya    schedule 22.11.2018

Вероятно,

let data = try CNContactVCardSerialization.data(with: contacts)

Добавляет только контактную информацию без тега изображения, поэтому вам нужно вручную добавить тег изображения в файл VCF. вы можете найти решение здесь.

https://stackoverflow.com/a/44308365/5576675

person Anand Kore    schedule 21.11.2018