MFMessageComposeViewController iOS7 addAttachmentData: typeIdentifier: nazwa pliku: nie działa

Chcę dołączyć obraz do MMS, na iOS7. Napisałem następujący kod:

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

Problem polega na tym, że gdy ekran SMS jest wyświetlany, nie rozpoznaje obrazu i nie może go wysłać. Widzę coś takiego:

Ekran Wiadomości

Uważam, że ma to coś wspólnego z imgData, którą wysyłam, lub z typeIdentifier.

Uwaga: próbowałem prawie wszystkich możliwych typów: @ "public.data", @ " public.image", @ " public.pozycji",... itd. Brak zadziałało.

Czy ktoś może mi pomóc? Co to jest typeIdentifier używasz? Testuję na iPhone 5, iOS 7.0.2. Dzięki.

Rozwiązanie:

Zgodnie z instrukcją Grega, to rozwiązało mój problem: ustaw nazwę pliku jako @ " image.png", i typeIdentifier do kUTTypePNG.

[messageController addAttachmentData:imgData typeIdentifier:(NSString *)kUTTypePNG filename:@"image.png"];
Dzięki Greg.
Author: Beny Boariu, 2013-10-03

2 answers

MFMessageComposeViewController chce, aby załącznik miał odpowiednie rozszerzenie dla typu przesyłanego obrazu. Zweryfikowałem testując plik PNG i następujące odmiany dodawania danych załącznika:

[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"];

Zadziałała tylko ostatnia opcja. Nie musiałem zmieniać typeIdentifier, chociaż prawdopodobnie sensownym byłoby wybranie UTI pasującego do typu danych.

Pełna lista UTIs dostępna jest tutaj: System-Declared Uniform Type Identyfikatory (dzięki @ iWasRobbed!)

 36
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 23:13:49

Dla Swift możesz spróbować tego

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: {
           
        })
}
    
 1
Author: GaganDeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-13 16:21:03