iOS11:UIActivityViewController 未成功将 UIImage 共享给第 3 方应用程序
iOS11: UIActivityViewController not successfully sharing UIImage to 3rd party apps
所以在 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)
}
如果您想将图像保存到相机胶卷(前提是您已请求适当的权限),或者想通过 Messenger、Airdrop 或任何其他 Apple 实现方式共享,此方法似乎仍然有效。
不幸的是,如果您尝试通过 Twitter、Facebook、Instagram 等分享图片,他们将无法成功附加图片,并且会抛出错误或静默失败。
我花了很多时间搜索 google、youtube 和 Whosebug,所有内容都指向 iOS10 解决方案,但自 iOS11 发布以来什么都没有。
我应该注意到,如果您想传递字符串 url 或那些行中的内容,此函数仍然可以正常工作。
简短版/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 问题,并且似乎仍然适用于其他所有内容。更新后的 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 以来一直难以分享图像的其他人有所帮助。
接受的答案 did/does 不适用于所有第 3 方应用程序,例如微软团队应用程序。
将图像数据写入磁盘并共享 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 及更高版本,您可能希望将其转换为数据格式并返回 UIImage,以便 AirDrop 和所有仅共享图像的应用程序获取它。
如果您不将其转换回图像,AirDrop 将无法识别它。
let imageToShare = UIImage(data: selectedImage.jpegData(compressionQuality: 1.0)!)
所以在 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)
}
如果您想将图像保存到相机胶卷(前提是您已请求适当的权限),或者想通过 Messenger、Airdrop 或任何其他 Apple 实现方式共享,此方法似乎仍然有效。
不幸的是,如果您尝试通过 Twitter、Facebook、Instagram 等分享图片,他们将无法成功附加图片,并且会抛出错误或静默失败。
我花了很多时间搜索 google、youtube 和 Whosebug,所有内容都指向 iOS10 解决方案,但自 iOS11 发布以来什么都没有。
我应该注意到,如果您想传递字符串 url 或那些行中的内容,此函数仍然可以正常工作。
简短版/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 问题,并且似乎仍然适用于其他所有内容。更新后的 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 以来一直难以分享图像的其他人有所帮助。
接受的答案 did/does 不适用于所有第 3 方应用程序,例如微软团队应用程序。 将图像数据写入磁盘并共享 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 及更高版本,您可能希望将其转换为数据格式并返回 UIImage,以便 AirDrop 和所有仅共享图像的应用程序获取它。 如果您不将其转换回图像,AirDrop 将无法识别它。
let imageToShare = UIImage(data: selectedImage.jpegData(compressionQuality: 1.0)!)