当 CNContact 保存联系人时联系人图像不发送
Contact image doesn't send when contact saved by CNContact
我写了一个代码,用图像保存联系人。我使用 CNContact class 来完成它。保存联系人成功。
联系人在 iOS 的默认联系人应用中正确显示缩略图。但我的问题是,当我使用 iOS 的默认联系人应用程序通过短信或电子邮件共享该联系人时,图像不会添加到 vCard 中。
任何人都可以指导我做错了什么吗?
以下是我保存联系人的方法。它位于 Swift.
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
}
}
我想通了。当我使用 CNContactVCardSerialization.dataWithContacts()
时,我得到的图像是 NSData。如果我将其转换为 UIImageJPEGRepresentation
/UIImageJPEGRepresentation
,然后将图像与 vCard 字符串附加为 @"PHOTO;BASE64;ENCODING=b;TYPE=JPEG%@"
,然后附加图像数据,则图片将与 vCard 一起发送。
作为@haider_kazal said, yes you can get contact image data into .vcf file as answered 。
示例:
作为解决方法,您可以在 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 中看起来很好
我写了一个代码,用图像保存联系人。我使用 CNContact class 来完成它。保存联系人成功。
联系人在 iOS 的默认联系人应用中正确显示缩略图。但我的问题是,当我使用 iOS 的默认联系人应用程序通过短信或电子邮件共享该联系人时,图像不会添加到 vCard 中。
任何人都可以指导我做错了什么吗?
以下是我保存联系人的方法。它位于 Swift.
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
}
}
我想通了。当我使用 CNContactVCardSerialization.dataWithContacts()
时,我得到的图像是 NSData。如果我将其转换为 UIImageJPEGRepresentation
/UIImageJPEGRepresentation
,然后将图像与 vCard 字符串附加为 @"PHOTO;BASE64;ENCODING=b;TYPE=JPEG%@"
,然后附加图像数据,则图片将与 vCard 一起发送。
作为@haider_kazal said, yes you can get contact image data into .vcf file as answered
示例:
作为解决方法,您可以在 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 中看起来很好