iOS11:UIActivityViewController未成功将UIImage共享给第三方应用程序



因此,在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)
}

如果你想将图像保存到你的相机胶卷中(前提是你已经请求了适当的权限),或者想通过信使、空投或任何其他苹果实现共享,这种方法似乎仍然有效。

不幸的是,如果你试图通过推特、脸书、Instagram等分享图片,他们不会成功附加图片,并且会抛出错误或默默失败。

我花了大量时间搜索谷歌、youtube和stackoverflow,所有的东西都指向iOS10解决方案,但自iOS11发布以来,什么都没有。

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

短版本/TLDR

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

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

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

更长版本

我联系了一些专家,他们都暗示这应该有效,但即使在查看他们的示例应用程序时,他们都表现出了同样的问题。所以我最终认为这可能是推特或脸书的问题,因为与苹果应用程序共享刚刚奏效。然后我开始玩照片应用程序,并决定点击那里的共享按钮,瞧,它在推特和脸书上都很管用!这让我怀疑这是否意味着需要一些增量设置才能使其发挥作用。在尝试了许多不同的东西之后,我终于找到了一种行之有效的方法。通过PNG或JPG将图像转换为Data,并将新对象传递给您的activityItems,可以解决Twitter/Facebook问题,并且似乎仍然可以与其他一切一起使用。更新后的swift4/ios11代码将图像转换为JPG,如下所示:

@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以来一直在努力分享图像的其他人。

接受的答案适用于/不适用于所有第三方应用程序,例如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)

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

let imageToShare = UIImage(data: selectedImage.jpegData(compressionQuality: 1.0)!)