如何从接收用户端的MSMessage布局中访问图像?

时间:2016-10-24 01:46:00

标签: ios10 imessage msmessage msmessagetemplatelayout

我正在制作一个iMessage扩展程序,涉及用户来回发送图片。他们需要能够访问彼此接收的图像并在自己的最终使用它们。例如,如果USER 1将小狗的图片发送给USER 2,则消息布局的图像属性将属于小狗。然后,USER 2应该能够点击该消息,并将小狗加载到屏幕上的图像视图中。到目前为止,我不知道如何做到这一点。

在这里,我将布局图像设置为小狗的图像。

@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()

        })

    }
}

现在当第二个用户点击小狗时,我想在他们的屏幕上为小狗设置一个图像视图。不完全确定如何,但我喜欢做的是:

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

2 个答案:

答案 0 :(得分:4)

您无法访问从其他用户发送的布局图像。 https://forums.developer.apple.com/thread/53174

  

预期具有零布局的所选消息。收到   消息不会填充布局对象。

您可以,在发件人方面,不仅可以将MSMessage的图像布局插入MSConversation,还可以将图像副本上传到服务器,并在{}中标记网络图片网址{1}}。

因此,下次用户选择邮件时,您可以解包MSMessage.URL并找到图片网址,然后从服务器下载。

答案 1 :(得分:2)

虽然收到消息后无法访问布局,但您仍然有机会获得它。如果启动了扩展程序,则可以在基于-[didReceiveMessage:conversation:]的类的MSMessagesAppViewController方法中到达时访问邮件的布局。

在发件人方面,您可以为您的邮件分配一个带有自定义ID(例如UUID)的网址 - 它始终可以访问 - 然后在didReceiveMessage的接收方一起将其提取到图像并缓存后者本地使用ID作为名称。这是代码草案:

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

之后,点击邮件后,将调用-[didSelectMessage:conversation:]。在这里,您可以再次获取URL并从缓存中读取相应的图像(如果可用):

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

并且不要忘记为nil添加所有必要的检查,成功创建URL等。