簡體   English   中英

將注釋和圖像添加到序列化的VCF聯系人

[英]Add Notes and Images to serialized VCF contact

我正在嘗試使用CNContactVCardSerialization將聯系人另存為vcf,效果比較好。 我確實發現蘋果不將Notes或Images包含在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文件中。

任何幫助是極大的贊賞。

它雖然不漂亮,但是這是我已經做過的事情,現在它正在工作:

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
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM