首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从接收用户端的MSMessage布局访问图像?

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

Stack Overflow用户
提问于 2016-10-24 01:45:59
回答 2查看 1K关注 0票数 3

我正在创建一个iMessage扩展,它涉及到用户之间来回发送图片。他们都需要能够访问彼此接收到的图像,并在自己的终端上使用。例如,如果用户1向用户2发送小狗的图片,则消息布局的图像属性将为小狗。然后,用户2应该能够点击该消息,并将小狗加载到屏幕上的图像视图。到目前为止我还不知道我该怎么做。

这是我把布局图片设置为小狗的地方。

代码语言:javascript
复制
@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()

        })

    }
}

现在,当第二个用户点击小狗,我想在他们的屏幕上设置一个图像视图给小狗。不太确定怎么做,但我想做的是:

代码语言:javascript
复制
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.
}
EN

回答 2

Stack Overflow用户

发布于 2016-10-31 06:23:02

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

需要具有零布局的所选消息。接收到的消息不会被填充布局对象。

您可以做的是,在发送方,您不仅插入一个具有图像布局的MSMessageMSConversation,而且还将图像副本上传到您的服务器,并在MSMessage.URL中标记web图像URL。

因此,下次当用户选择一条消息时,您可以打开MSMessage.URL并找到图像URL,然后从服务器下载它。

票数 4
EN

Stack Overflow用户

发布于 2016-12-22 02:40:26

虽然收到消息后无法访问布局,但仍然有一次机会获得它。在启动扩展时,消息布局在到达-[didReceiveMessage:conversation:]方法的MSMessagesAppViewController-based类时可以访问。

在发送方,您可以为您的消息分配一个具有自定义ID (例如,UUID)的URL --它将始终是可访问的--然后在didReceiveMessage中的接收方将其与图像一起提取,并以ID作为名称在本地缓存后者。下面是代码草案:

代码语言:javascript
复制
- (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并从缓存读取相应的图像(如果可用的话):

代码语言:javascript
复制
- (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等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40209653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档