Изображение контакта не отправляется, если контакт сохранен CNContact

Я написал код, который сохраняет контакт с изображением. Для этого я использовал класс CNContact. Он успешно сохраняет контакт.

Контакт правильно отображается с миниатюрой в приложении «Контакты» iOS по умолчанию. Но моя проблема в том, что, когда я делюсь этим контактом через SMS или электронную почту с помощью стандартного приложения iOS для контактов, изображение не добавляется в визитную карточку.

Может ли кто-нибудь указать мне, что я сделал неправильно?

Ниже приведен метод, который я использовал для сохранения контакта. Это в Свифте.

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

person haider_kazal    schedule 22.07.2016    source источник
comment
Я зарегистрировал ошибку по этому поводу. Не понимаю, почему фото не вставлено.   -  person Daniel    schedule 25.08.2017


Ответы (2)


Как сказал @haider_kazal, да, вы можете получить данные контактного изображения в файл .vcf, как ответил здесь [Пример].

Пример:

В качестве обходного пути вы можете создать поле PHOTO внутри 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];

По некоторым причинам 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 вы получите

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.

person Anand Kore    schedule 01.06.2017

Я понял проблему. Когда я использую CNContactVCardSerialization.dataWithContacts(), я получаю изображение как NSData. Если я конвертирую его как UIImageJPEGRepresentation/UIImageJPEGRepresentation, а затем добавляю изображение со строкой vCard как @"PHOTO;BASE64;ENCODING=b;TYPE=JPEG%@", а затем добавляю данные изображения, то изображение отправляется с vCard.

person haider_kazal    schedule 14.08.2016
comment
не могли бы вы привести пример выше? - person Amit Jagesha シ; 08.04.2017