MFMessageComposeViewController iOS7 addAttachmentData: typeIdentifier: имя файла: не работает

Я хочу прикрепить изображение к MMS, на iOS7. Я написал следующий код:

    MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init];
    messageController.messageComposeDelegate = self;

    NSData *imgData = [NSData dataWithContentsOfFile:@"blablabla"];
    BOOL didAttachImage = [messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image"];

    if (didAttachImage)
    {
        // Present message view controller on screen
        [self presentViewController:messageController animated:YES completion:nil];
    }
    else
    {
        UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                               message:@"Failed to attach image"
                                                              delegate:nil
                                                     cancelButtonTitle:@"OK"
                                                     otherButtonTitles:nil];
        [warningAlert show];
        return;
    }

Проблема в том, что когда появляется экран SMS, он не распознает изображение и не может его отправить. Я вижу что-то вроде этого:

Экран сообщений

Я считаю, что это как-то связано либо с imgData, который я отправляю, либо с typeIdentifier.

Примечание. Я перепробовал почти все возможные идентификаторы типов: @"public.data", @"public.image", @"public.item", ... и т. д. Ни один из них не сработал.

Кто-нибудь может мне помочь? Какой тип идентификатора вы используете? Тестирую на iPhone 5, iOS 7.0.2.

Спасибо.


РЕШЕНИЕ:

По указанию Грега это решило мою проблему: установите имя файла как @ «image.png», а typeIdentifier — как kUTTypePNG.

[messageController addAttachmentData:imgData typeIdentifier:(NSString *)kUTTypePNG filename:@"image.png"];

Спасибо, Грег.


person Beny Boariu    schedule 03.10.2013    source источник
comment
Я получаю didAttachImage = YES, но я не вижу ни одного вложенного изображения на моем представленном экране SMS. Тестирую на Iphone 6plus, iOS 8.4.1   -  person Niharika    schedule 11.01.2017


Ответы (2)


MFMessageComposeViewController хочет, чтобы вложение имело правильное расширение для типа загружаемого изображения. Я проверил, протестировав файл PNG и следующие варианты добавления данных вложения:

[messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image"];
[messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image.abc"];
[messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image.png"];

Сработал только последний вариант. Мне не нужно было менять typeIdentifier, хотя, вероятно, имело бы смысл выбрать UTI, соответствующий типу данных.

Полный список UTI доступен здесь: Объявленные системой унифицированные идентификаторы типов (Спасибо, @iWasRobbed!)

person Greg    schedule 03.10.2013
comment
Полный список можно найти здесь: developer.apple.com/library/ios/documentation/Miscellaneous/ - person iwasrobbed; 04.10.2013
comment
Пробовал оба. До сих пор не работает. UIImage *img = [UIImage imageWithContentsOfFile:image.i_filePath]; NSData *imgData = UIImagePNGRepresentation(img); BOOL didAttachImage = [messageController addAttachmentData:imgData typeIdentifier:(NSString *)kUTTypePNG filename:@image]; - person Beny Boariu; 04.10.2013
comment
Да ладно, это слишком глупо. Имя файла изменено на image.png, и теперь оно работает. Ржу не могу. Не могу поверить. Спасибо, Грег. - person Beny Boariu; 04.10.2013
comment
Хороший. :-) Рад, что смог помочь! - person Greg; 04.10.2013
comment
Спасибо! Просто примечание, это работает и для видео, просто назовите файл video.mp4 или video.mov и так далее. - person Linuxios; 24.10.2013

Для Swift вы можете попробовать это

if (MFMessageComposeViewController.canSendText()) {
     
     let controller = MFMessageComposeViewController()
     controller.body = "Solution for broken image in composer"
     controller.messageComposeDelegate = self
        
      if image.imageAsset != nil {
            
            let imageData = UIImageJPEGRepresentation(self.fixOrientation(img: image), 1)  //! as NSData
            controller.addAttachmentData(imageData! , typeIdentifier: "image/.jpeg", filename: "image.jpeg")
            
        }
        
        viewController.present(controller, animated: true,completion: {
           
        })
}
    
person GaganDeep Singh    schedule 03.11.2017