2016-10-24 1 views
3

Je crée une extension iMessage qui implique que les utilisateurs se transmettent des images les unes aux autres. Ils doivent à la fois pouvoir accéder aux images qu'ils reçoivent les uns des autres et les utiliser de leur propre chef. Par exemple, si USER 1 envoie une image d'un chiot à USER 2, la propriété d'image de la disposition des messages sera celle du chiot. L'UTILISATEUR 2 devrait alors être capable de toucher ce message, et le chiot se chargera dans une vue d'image à l'écran. Jusqu'à présent, je ne sais pas comment je ferais cela.Comment puis-je accéder à l'image à partir de la mise en page MSMessage sur la fin de l'utilisateur de réception?

Voici où je définis l'image mise en page à celle d'un chiot.

@IBAction func sendPicturePressed(_ sender: AnyObject) { 

    if chosenImage.image != nil { 

     let session = MSSession() 
     let message = MSMessage(session: session) 
     let conversation = self.activeConversation 
     let components = URLComponents() 

     let layout = MSMessageTemplateLayout() 

     let image = chosenImage.image 
     layout.image = image 

     message.layout = layout 
     message.url = components.url! 

     conversation?.insert(message, completionHandler: { (error) in 

      self.dismiss() 

     }) 

    } 
} 

Maintenant, lorsque le deuxième utilisateur tape le chiot, je veux définir une vue de l'image sur leur écran pour le chiot. Pas exactement comment, mais ce que je voudrais faire est:

override func willBecomeActive(with conversation: MSConversation) { 

    imageView.image = conversation.selectedMessage.layout.image 

    //There is no image property to access this like I've provided, that's just what I'm trying to accomplish. 
} 

Répondre

3

Vous ne pouvez pas accéder à l'image de mise en page qui envoient d'un autre utilisateur. https://forums.developer.apple.com/thread/53174

Le message sélectionné ayant une disposition nulle est attendue. Reçus messages ne seront pas un objet de mise en page remplie.

Qu'est-ce que vous pouvez, est du côté de l'expéditeur, non seulement insérer une MSMessage avec la mise en page d'image à MSConversation, mais aussi télécharger une copie de l'image sur votre serveur et marquez l'URL de l'image Web au MSMessage.URL. Donc, la prochaine fois que l'utilisateur sélectionnera un message, vous pouvez déballer MSMessage.URL et trouver l'URL de l'image, puis le télécharger depuis votre serveur.

2

Bien que vous ne puissiez pas accéder à la mise en page une fois le message reçu, vous avez encore une chance de l'obtenir. Au cas où l'extension est lancée, la disposition du message est accessible à l'arrivée dans la méthode -[didReceiveMessage:conversation:] de votre classe MSMessagesAppViewController. Du coté de l'expéditeur, vous pouvez attribuer à votre message une URL avec un ID personnalisé (par exemple UUID) - il sera toujours accessible - puis l'extraire du côté récepteur dans le didReceiveMessage avec l'image et mettre en cache localement cette dernière avec le ID en tant que nom. Voici le projet de code:

- (NSURL*) fileURLFromRawURL:(NSURL*)idURL 
{ 
    NSString *fileID = idURL.relativePath; 
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:fileID]; 

    return [NSURL fileURLWithPath:path]; 
} 

- (MSMessage*) composeMessageWithImage:(UIImage*)image session:(MSSession*)session 
{  
    MSMessageTemplateLayout *layout = [MSMessageTemplateLayout new]; 
    layout.image = image; 

    MSMessage *message = [[MSMessage alloc] initWithSession:session]; 
    message.layout = layout; 
    message.URL = [NSURL fileURLWithPath:[[NSUUID UUID] UUIDString]]; 

    return message; 
} 

- (void) didReceiveMessage:(MSMessage *)message conversation:(MSConversation *)conversation 
{ 
    // Assuming that the extension is launched: 
    MSMessageTemplateLayout *layout = message.layout; 
    UIImage *img = layout.image; // you've got the image 
    NSURL *path = [self fileURLFromRawURL:message.URL]; 
    if (path && image){ 
     NSData *data = UIImageJPEGRepresentation((UIImage*)resource, 0.8); 
     [data writeToURL:path options:NSDataWritingAtomic error:nil]; 
    } 
} 

Après cela, une fois votre message tapé, la -[didSelectMessage:conversation:] sera appelée. Ici, vous pouvez obtenir l'URL à nouveau et lire l'image correspondante du cache (dans le cas où il est disponible):

- (void) didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation 
{ 
    NSURL *path = [self fileURLFromRawURL:message.URL]; 
    if (path){ 
     NSData *imageData = [NSData dataWithContentsOfURL:path]; 
     UIImage *img = [UIImage imageWithData:imageData]; 
    } 
} 

Et ne pas oublier d'ajouter tous les contrôles nécessaires pour nil s, la création d'URL, etc. Successfull

+0

C'est génial! En fait, le fichier est déjà accessible dans layout.mediaFileURL, il suffit donc de copier. Est-ce documenté n'importe où? message.layout est un objet MSMessageLayout sans membres accessibles, ce qui est un peu inquiétant car il doit être converti en MSMessageTemplateLayout. – user1055568

+0

Ahh, mais juste réalisé, comme vous l'avez dit, cela ne fonctionne que pour les messages qui arrivent quand l'extension est active. Bummer. Vous ne savez pas pourquoi Apple rend ces données indisponibles. – user1055568