使用UIActivityViewController将图像和文本共享到Facebook Messenger失败

时间:2017-07-17 12:21:24

标签: ios swift optimization 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 screenshot

3 个答案:

答案 0 :(得分:0)

尝试使用UIImage而不是NSData。您可以将UIImage转换为AnyObject并添加到您的数组中。

另请看这个问题:Sharing image using UIActivityViewController

答案 1 :(得分:0)

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

答案 2 :(得分:0)

所以最后需要的是将NSData转换回UIImage的额外步骤。

  

请注意,这种转换NSData的方法存在一个问题   进入UIImage是它产生的图像质量   无损(即邮件和邮件)或有损(即备注,照片,   信使)。

     

有趣的消息,邮件和各种第三方共享   应用程序非常满意地共享NSData   UIActivityViewController而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)
    }

}