我正在创建一个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.
}发布于 2016-10-31 06:23:02
您无法访问从其他用户发送的布局映像。https://forums.developer.apple.com/thread/53174
需要具有零布局的所选消息。接收到的消息不会被填充布局对象。
您可以做的是,在发送方,您不仅插入一个具有图像布局的MSMessage到MSConversation,而且还将图像副本上传到您的服务器,并在MSMessage.URL中标记web图像URL。
因此,下次当用户选择一条消息时,您可以打开MSMessage.URL并找到图像URL,然后从服务器下载它。
发布于 2016-12-22 02:40:26
虽然收到消息后无法访问布局,但仍然有一次机会获得它。在启动扩展时,消息布局在到达-[didReceiveMessage:conversation:]方法的MSMessagesAppViewController-based类时可以访问。
在发送方,您可以为您的消息分配一个具有自定义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];
}
}别忘了为nil添加所有必要的检查,成功地创建URL等等。
https://stackoverflow.com/questions/40209653
复制相似问题