我正在使用CNContacts和CNContactUI框架并通过此选择联系人
CNContactPickerViewController *contactPicker = [CNContactPickerViewController new];
contactPicker.delegate = self;
[self presentViewController:contactPicker animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
和
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
NSArray *array = [[NSArray alloc] initWithObjects:contact, nil];
NSError *error;
NSData *data = [CNContactVCardSerialization dataWithContacts:array error:&error];
NSLog(@"ERROR_IF_ANY :: %@",error.description);
}
Run Code Online (Sandbox Code Playgroud)
此联系人对象具有contact.imageData和日志.但是当我试图通过交叉检查这些数据时
NSArray *contactList = [NSArray arrayWithArray:[CNContactVCardSerialization contactsWithData:data error:nil]];
CNContact *contactObject = [contactList objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
这是空的:
//contactObject.imageData
Run Code Online (Sandbox Code Playgroud)
为什么我收到此null并且此联系人在签入联系人时有图像?
kud*_*nis 11
作为一种解决方法,您可以在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];
Run Code Online (Sandbox Code Playgroud)
由于某些原因,CNContactVCardSerialization不使用任何联系人照片.序列化后的VCard如下所示:
BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iPhone OS 9.3.2//EN
N:Contact;Test;;;
FN: Test Contact
END:VCARD
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
在此插入后,联系人在CNContactViewController中看起来很好
我希望通过kudinovdenis改进和现代化Swift 3的优秀答案.
只需将以下扩展名放入您的项目中即可
import Foundation
import Contacts
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
}
class func data(jpegPhotoContacts: [CNContact]) throws -> Data {
var overallData = Data()
for contact in jpegPhotoContacts {
let data = try CNContactVCardSerialization.data(with: [contact])
if contact.imageDataAvailable {
if let base64imageString = contact.imageData?.base64EncodedString(),
let updatedData = vcardDataAppendingPhoto(vcard: data, photoAsBase64String: base64imageString) {
overallData.append(updatedData)
}
} else {
overallData.append(data)
}
}
return overallData
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用它类似于现有的序列化方法:
CNContactVCardSerialization.data(jpegPhotoContacts: [contact1, contact2])
Run Code Online (Sandbox Code Playgroud)
请注意,这需要进行序列化,如果您还要导入,则需要编写类似的反序列化方法.
| 归档时间: |
|
| 查看次数: |
1883 次 |
| 最近记录: |