使用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展示了可用的应用程序。

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) } }