3

我正在制作一个 iMessage 扩展程序,其中涉及用户来回发送图片。他们都需要能够访问从彼此接收到的图像并在自己的端使用它。例如,如果 USER 1 向 USER 2 发送了一张小狗的图片,则消息布局的 image 属性将是小狗的。然后用户 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.
}
4

2 回答 2

4

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

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

你可以做的是,在发送方,你不仅要插入一个MSMessage带有图片的布局MSConversation,还要上传一个图片副本到你的服务器,并在MSMessage.URL.

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

于 2016-10-31T06:23:02.653 回答
2

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

在发送方,您可以为您的消息分配一个带有自定义 ID(例如 UUID)的 URL - 它始终可以访问 - 然后在接收方将其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];
    }
}

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

于 2016-12-22T02:40:26.307 回答