Как я могу получить доступ к изображению из макета 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 и т. д.