iOS11:UIActivityViewController无法成功将UIImage共享给第三方应用

问题描述 投票:6回答:3

所以在iOS10中如果你想用UIActivityViewController共享一个图像,你只需要编写一些看起来像的swift3代码:

func shareTapped() {       
        if let image = imageView.image {
            let vc = UIActivityViewController(activityItems: [image], applicationActivities: [])
            vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
            present(vc, animated: true, completion: nil)
        }

如果您想将图像保存到相机胶卷(假设您已经要求相应的权限),或者想要通过信使,空投或任何其他Apple实现共享,则此方法似乎仍然有效。

不幸的是,如果您尝试通过Twitter,Facebook,Instagram等分享图像,他们将无法成功附加图像,并会抛出错误或无声地失败。

我花了很多时间搜索谷歌,youtube和stackoverflow,一切都指向iOS10解决方案,自iOS11发布以来什么都没有。

我应该注意,如果你想在这些行上传递字符串,url或其他东西,这个函数仍然可以正常工作。

swift ios11 swift4
3个回答
11
投票

短版/ TLDR

通过首先将图像转换为数据,然后将该对象传递给UIActivityViewController,可以在尝试传递图像时解决Twitter / Facebook问题:

   if let jpgImage = UIImageJPEGRepresentation(image, 0.8) {
       let vc = UIActivityViewController(activityItems: [jpgImage], applicationActivities: [])
   }

可以在下面找到更长的外植和完整代码:

版本更长

我联系了一些专家,他们都暗示它应该正常工作,但即使在查看他们的示例应用程序时,他们都表现出同样的问题。所以我最终认为这可能是Twitter或Facebook的一个问题,因为共享到Apple工具正常工作。然后我开始玩照片应用程序,并决定点击那里的分享按钮,瞧,它与Twitter和Facebook合作!这让我想知道这是否意味着需要一些增量设置来实现它。在尝试了许多不同的事情后,我终于找到了一种有效的方法通过PNG或JPG将图像转换为数据并将新对象传递给您的activityItems解决了Twitter / Facebook问题,并且似乎仍然适用于其他所有问题。将图像转换为JPG的更新后的swift4 / ios11代码如下所示:

@objc func shareTapped() {
        if let image = imageView.image {
            if let jpgImage = UIImageJPEGRepresentation(image, 0.8) {
                let vc = UIActivityViewController(activityItems: [jpgImage], applicationActivities: [])
                // add the following line if using doing universal and need iPad
                vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
                present(vc, animated: true)
            }
        }
    }

希望这可以帮助其他任何自iOS11以来一直在努力分享图像的人。


0
投票

接受的答案确实/不适用于所有第三方应用,例如Microsoft Teams应用程序。将图像数据写入磁盘并共享URL似乎适用于所有应用程序:

guard 
    let image = UIImage(named: "your-image"),
    let imageData = image.pngData(),
    let imagePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("image-to-be-shared")?.appendingPathExtension("png") else {
        return
}
do {
    try imageData.write(to: imagePath)
} catch {
    // handle error
    return
}

let activity = UIActivityViewController(activityItems: [imagePath], applicationActivities: nil)
activity.completionWithItemsHandler = { _, _, _, _ in
    do {
        try FileManager.default.removeItem(at: imagePath)
    } catch {
        // handle error
    }
}
present(activity, animated: true, completion: nil)

0
投票

对于iOS 11及更高版本,您可能希望将其转换为数据格式并返回到UIImage,以便AirDrop和仅共享图像的所有应用程序将其转换为UIImage。如果您不将其转换回图像,AirDrop将无法识别它。

let imageToShare = UIImage(data: selectedImage.jpegData(compressionQuality: 1.0)!)
© www.soinside.com 2019 - 2024. All rights reserved.