4

我已经编写了一个代码来保存带有图像的联系人。我使用 CNContact 类来做到这一点。它成功保存了联系人。

联系人在 iOS 的默认联系人应用程序中正确显示缩略图。但我的问题是,当我使用 iOS 的默认联系人应用程序通过 SMS 或电子邮件共享该联系人时,该图像不会添加到 vCard 中。

谁能指导我做错了什么?

以下是我用来保存联系人的方法。它在斯威夫特。

func addContact(withData: ContactModel, andPicture picture: NSData?) -> Bool {
    if(checkForPermission() != true) {
        print("No permission")
        return false
    }

    let contact = convertToCNMutableContact(withData)
    contact.imageData = picture
    let saveRequest = CNSaveRequest()
    saveRequest.addContact(contact, toContainerWithIdentifier: nil)
    do {
        try contactStore.executeSaveRequest(saveRequest)
        return true
    } catch  {
        print("Couldn't save contact")
        return false
    }
}
4

2 回答 2

6

正如@haider_kazal所说,是的,您可以将联系人图像数据放入 .vcf 文件中,如此处的回答 [Example]

示例:

作为一种解决方法,您可以在 VCard 内创建 PHOTO 字段。

NSError* error = nil;
NSData* vCardData = [CNContactVCardSerialization dataWithContacts:@[contact] error:&error];
NSString* vcString = [[NSString alloc] initWithData:vCardData encoding:NSUTF8StringEncoding];
NSString* base64Image = contact.imageData.base64Encoding;
NSString* vcardImageString = [[@"PHOTO;TYPE=JPEG;ENCODING=BASE64:" stringByAppendingString:base64Image] stringByAppendingString:@"\n"];
vcString = [vcString stringByReplacingOccurrencesOfString:@"END:VCARD" withString:[vcardImageString stringByAppendingString:@"END:VCARD"]];
vCardData = [vcString dataUsingEncoding:NSUTF8StringEncoding];

由于某些原因,CNContactVCardSerialization 不使用任何联系人照片。序列化后的 VCard 是这样的:

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iPhone OS 9.3.2//EN
N:Contact;Test;;;
FN: Test  Contact 
END:VCARD

在 VCard 中插入 PHOTO 字段后,您将获得

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iPhone OS 9.3.2//EN
N:Contact;Test;;;
FN: Test  Contact 
PHOTO;TYPE=JPEG;ENCODING=BASE64:<photo base64 string>
END:VCARD

在 CNContactViewController 中这个插入联系人看起来很好

于 2017-06-01T13:04:42.580 回答
1

我解决了这个问题。当我使用时CNContactVCardSerialization.dataWithContacts(),我将图像作为 NSData。如果我将其转换为UIImageJPEGRepresentation/ UIImageJPEGRepresentation,然后将图像附加到 vCard 字符串作为@"PHOTO;BASE64;ENCODING=b;TYPE=JPEG%@",然后附加图像数据,则图片将与 vCard 一起发送。

于 2016-08-14T11:01:29.020 回答