As a workaround, you can create a PHOTO field inside VCard.
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];
For some reason, CNContactVCardSerialization does not use any contact photos. VCard after serialization is as follows:
BEGIN:VCARD VERSION:3.0 PRODID:-//Apple Inc.//iPhone OS 9.3.2//EN N:Contact;Test;;; FN: Test Contact END:VCARD
After entering the PHOTO field inside VCard, you will get
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
After that, the insert contact will look normal in CNContactViewController
source share