Как я могу получить доступ к изображению из макета MSMessage на стороне принимающего пользователя?

Я делаю расширение iMessage, которое включает в себя пользователей, отправляющих картинки друг другу. Они оба должны иметь возможность доступа к изображениям, которые они получают друг от друга, и использовать их на своих собственных целях. Например, если ПОЛЬЗОВАТЕЛЬ 1 отправляет изображение щенка в ПОЛЬЗОВАТЕЛЬ 2, свойство изображения макета сообщений будет принадлежать щенку. ПОЛЬЗОВАТЕЛЬ 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 ответа

Вы не можете получить доступ к макету изображения, отправленного другим пользователем. https://forums.developer.apple.com/thread/53174

Ожидается выбранное сообщение с нулевой разметкой. Полученные сообщения не будут заполнены объектом макета.

Что вы можете, это на стороне отправителя, вы не только вставить MSMessage с макетом изображения в MSConversation, но также загрузите копию изображения на свой сервер и отметьте URL-адрес веб-изображения в MSMessage.URL,

Так что в следующий раз, когда пользователь выберет сообщение, вы можете развернуть MSMessage.URL и найдите URL изображения, затем загрузите его с вашего сервера.

Хотя вы не можете получить доступ к макету после получения сообщения, у вас все еще есть шанс получить его. В случае запуска расширения макет сообщения доступен по прибытии в -[didReceiveMessage:conversation:] метод вашего MSMessagesAppViewController класс.

На стороне отправителя вы можете назначить вашему сообщению URL-адрес с пользовательским идентификатором (например, UUID) - он будет всегда доступен - затем извлечь его на стороне получателя в didReceiveMessage вместе с изображением и кэшируйте последний локально с идентификатором в качестве имени. Вот черновик кода:

- (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 s, успешное создание URL и т. д.

Другие вопросы по тегам