我正在制作一个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.
}
答案 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等。