使用UIActivityViewController将图像和文本共享到Facebook Messenger失败
题
必须对下面的代码进行哪些更改,以确保Messenger与
UIActivityViewController
很好地共享,并共享图像和文本,或者至少是图像?
背景
我正在使用UIActivityViewController
从我的应用程序共享文本和图像,并将它们发送到电子邮件,消息和其他共享应用程序。 UIActivityViewController
很棒,并且以大多数应用程序的简单和标准方式工作……但是,我遇到了不想合作的Messenger(Facebook Messenger)的问题。
在下面的代码中,我点击了一个UIButton
,它拍摄了屏幕的快照图像,将其转换为.png,然后将准备好的图像( imageShare
)和我准备好的文本( textShare
)一起发送到UIActivityViewController
。 这个简单的方法允许我的应用程序成功共享电子邮件,消息和许多其他共享应用程序,除了Messenger。
(旁注,Facebook只能共享准备好的图像( imageShare
),但不能共享文本。)
问题
尝试与UIActivityViewController
共享到Messenger时,这些是问题:
-
共享
activityItems: [textShare, imageShare]
- Messenger仅发送共享文本。
-
共享
activityItems: [textShare]
- 在
UIActivityViewController
甚至无法使用共享到Messenger的选项。
- 在
-
共享
activityItems: [imageShare]
- 显示错误: “无法加载内容。 加载内容时出现问题。 请再试一次。”
码
@IBAction func myButton(sender: UIButton) { // Take snapshot of screen let imageSnapshot: UIImage! UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0) self.view.drawViewHierarchyInRect(CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height), afterScreenUpdates: false) imageSnapshot = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // Prepare text to share let textShare: String! textShare = "This is my original text." // Prepare image to share let imageShare: NSData imageShare = UIImagePNGRepresentation(imageSnapshot)! // Share text and image let activity = UIActivityViewController(activityItems: [textShare, imageShare], applicationActivities: nil) if UIDevice.currentDevice().userInterfaceIdiom == .Phone { self.presentViewController(activity, animated: true, completion: nil) } }
图片
iOS向UIActivityViewController
展示了可用的应用程序。
尝试使用UIImage而不是NSData。 您可以将UIImage转换为AnyObject并添加到您的数组中。
另请看这个问题: 使用UIActivityViewController共享图像
let textShare = "This is my original text." var shareObject = [AnyObject]() if textShare != nil { shareObject.append(textShare as AnyObject) } let Yourimage = UIImage(named: "image.png") let imageData = UIImagePNGRepresentation(Yourimage!) as NSData? if let data = imageData { shareObject.append(data) } if shareObject.count > 0 { // check condition for text and image let activityViewController = UIActivityViewController(activityItems: shareObject, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view present(activityViewController, animated: true, completion: nil) }
所以最终需要的是将NSData
转换回UIImage
的额外步骤。
注意,这种将
NSData
转换回UIImage
方法的一个问题是它产生无损(即消息和邮件)或有损(即Notes,Photos,Messenger)的图像质量。有趣的是,消息,邮件和各种第三方共享应用程序非常满意地在
UIActivityViewController
共享NSData
,而Messenger则不会容忍它。 (我有兴趣了解为什么到底?)
变化
由此:
// Prepare image to share let imageShare: NSData imageShare = UIImagePNGRepresentation(imageSnapshot)!
为此:
// Prepare image to share let imageShareData: NSData imageShareData = UIImagePNGRepresentation(imageSnapshot)! let imageShare = UIImage(data: imageShareData)!
最终的工作代码
@IBAction func myButton(sender: UIButton) { // Take snapshot of screen var imageSnapshot: UIImage! UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0) self.view.drawViewHierarchyInRect(CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height), afterScreenUpdates: false) imageSnapshot = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // Prepare text to share let textShare: String! textShare = "This is my original text." // Prepare image to share let imageShareData: NSData imageShareData = UIImagePNGRepresentation(imageSnapshot)! let imageShare = UIImage(data: imageShareData)! // Share text and image let activity = UIActivityViewController(activityItems: [textShare, imageShare], applicationActivities: nil) if UIDevice.currentDevice().userInterfaceIdiom == .Phone { self.presentViewController(activity, animated: true, completion: nil) } }