Добавьте примечания и изображения к сериализованному контакту VCF - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь сохранить контакт в виде vcf, используя CNContactVCardSerialization, который сработал относительно хорошо.Я обнаружил, что яблоко не включает в себя заметки или изображения как часть VCF.Я использовал ответ stackoverflow , чтобы помочь сериализации изображений, но сейчас я тоже борюсь с добавлением заметок.

Вот что я попробовал:

extension CNContactVCardSerialization {
    internal class func vcardDataAppendingPhoto(vcard: Data, photoAsBase64String photo: String) -> Data? {
        let vcardAsString = String(data: vcard, encoding: .utf8)
        let vcardPhoto = "PHOTO;TYPE=JPEG;ENCODING=BASE64:".appending(photo)
        let vcardPhotoThenEnd = vcardPhoto.appending("\nEND:VCARD")
        if let vcardPhotoAppended = vcardAsString?.replacingOccurrences(of: "END:VCARD", with: vcardPhotoThenEnd) {
            return vcardPhotoAppended.data(using: .utf8)
        }
        return nil

    }
    internal class func vcardDataAppendingNote(vcard: Data, note:String) -> Data? {
        let vcardAsString = String(data: vcard, encoding: .utf8)
        let vcardNote = "NOTE:".appending(note)
        let vcardNoteThenEnd = vcardNote.appending("\nEND:VCARD")
        if let vcardNoteAppended = vcardAsString?.replacingOccurrences(of: "END:VCARD", with: vcardNoteThenEnd) {
            return vcardNoteAppended.data(using: .utf8)
        }
        return nil
    }

    class func data(jpegPhotoContacts: [CNContact]) throws -> Data {
        var overallData = Data()
        for contact in jpegPhotoContacts {
            let data = try CNContactVCardSerialization.data(with: [contact])
            if (contact.note != "") || contact.imageDataAvailable {
                if contact.imageDataAvailable {
                    if let base64imageString = contact.thumbnailImageData?.base64EncodedString(),
                        let updatedData = vcardDataAppendingPhoto(vcard: data, photoAsBase64String: base64imageString) {
                        overallData.append(updatedData)
                    }
                }

                if contact.note != ""{
                    if let updatedData = vcardDataAppendingNote(vcard: data, note: contact.note){
                        overallData.append(updatedData)
                    }
                }
            } else {
                overallData.append(data)
            }
        }
        return overallData
    }
}

Это не похоже на работу.Я могу заставить работать либо заметки, либо раздел изображений, но не то и другое одновременно.

Вероятно, я неправильно добавляю в файл VCF.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 20 февраля 2019

Это не красиво, но вот что я сделал и сейчас работает:

extension CNContactVCardSerialization {
internal class func vcardDataAppendingPhoto(vcard: Data, photoAsBase64String photo: String) -> Data? {
    let vcardAsString = String(data: vcard, encoding: .utf8)
    let vcardPhoto = "PHOTO;TYPE=JPEG;ENCODING=BASE64:".appending(photo)
    if let vcardPhotoAppended = vcardAsString?.appending(vcardPhoto) {
        return vcardPhotoAppended.data(using: .utf8)
    }
    return nil

}
internal class func vcardDataAppendingNote(vcard: Data, note:String) -> Data? {
    let vcardAsString = String(data: vcard, encoding: .utf8)
    let vcardNote = "NOTE:".appending(note)
    let vcardFinal = vcardNote.appending("\n")
    if let vcardNoteAppended = vcardAsString?.appending(vcardFinal) {
        return vcardNoteAppended.data(using: .utf8)
    }
    return nil
}

internal class func vcardDataAppendingEnd(vcard: Data) -> Data? {
    let vcardAsString = String(data: vcard, encoding: .utf8)
    let vcardEnd = "\nEND:VCARD"
    if let vcardEndAppended = vcardAsString?.appending(vcardEnd) {
        return vcardEndAppended.data(using: .utf8)
    }
    return nil
}

internal class func vcardDataCleanEnd(vcard: Data) -> Data? {
    let vcardAsString = String(data: vcard, encoding: .utf8)

    if let vcardCleaned = vcardAsString?.replacingOccurrences(of: "END:VCARD", with: "\n"){
        return vcardCleaned.data(using: .utf8)
    }
    return nil
}

class func data(jpegPhotoContacts: [CNContact]) throws -> Data {
    var overallData = Data()
    for contact in jpegPhotoContacts {
        let data = try CNContactVCardSerialization.data(with: [contact])
        if (contact.note != "") || contact.imageDataAvailable {
            if let updatedData = vcardDataCleanEnd(vcard: data){
                overallData = updatedData
            }
            if contact.note != ""{
                if let updatedData = vcardDataAppendingNote(vcard: overallData, note: contact.note){
                    overallData = updatedData
                }
            }
            if contact.imageDataAvailable {
                if let base64imageString = contact.thumbnailImageData?.base64EncodedString(),
                    let updatedData = vcardDataAppendingPhoto(vcard: overallData, photoAsBase64String: base64imageString) {
                    overallData = updatedData
                }
            }
            if let updatedData = vcardDataAppendingEnd(vcard: overallData){
                overallData = updatedData
            }
        } else {
            overallData.append(data)
        }
    }
    return overallData
}
}
...