web-dev-qa-db-fra.com

MFMessageComposeViewController iOS7 addAttachmentData: typeIdentifier: nom du fichier: ne fonctionne pas

Je souhaite joindre une image à un MMS, sur iOS7. J'ai écrit le code suivant:

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

Le problème est que lorsque l'écran SMS est présenté, il ne reconnaît pas l'image et ne peut pas l'envoyer. Je vois quelque chose comme ça:

Message Screen

Je pense que cela a quelque chose à voir avec imgData que j'envoie ou avec typeIdentifier.

Note: J'ai essayé presque tous les identificateurs de type possibles: @ "Public.data", @ "public.image", @ "public.item", ... etc. Aucun n'a fonctionné.

Quelqu'un peut-il m'aider s'il vous plaît? Quel est le typeIdentifier que vous utilisez? Je teste sur iPhone 5, iOS 7.0.2.

Merci.


SOLUTION:

Comme Greg l’a indiqué, cela a résolu mon problème: définir le nom de fichier comme étant "" image.png "et le typeIdentifier comme étant kUTTypePNG.

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

Merci Greg.

19
Beny Boariu

MFMessageComposeViewController souhaite que la pièce jointe porte l'extension appropriée pour le type d'image que vous téléchargez. J'ai vérifié en testant avec un fichier PNG et les variantes suivantes de l'ajout des données de pièce jointe:

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

Seule la dernière option a fonctionné. Je n'ai pas eu besoin de changer le typeIdentifier, même s'il serait probablement logique de choisir une UTI qui correspond au type de données.

La liste complète des UTI est disponible ici: Identificateurs de type uniforme déclarés par le système (Merci @iWasRobbed!)

34
Greg

Pour Swift, vous pouvez essayer ceci 

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: {

        })

}

0
GaganDeep Singh