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

Posted

技术标签:

【中文标题】iOS11:UIActivityViewController 未成功将 UIImage 共享给 3rd 方应用程序【英文标题】:iOS11: UIActivityViewController not successfully sharing UIImage to 3rd party apps 【发布时间】:2017-10-20 00:18:35 【问题描述】:

所以在 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 等分享图片,他们将无法成功附加图片,并且会抛出错误或静默失败。

我花了很多时间搜索 google、youtube 和 ***,所有内容都指向 iOS10 解决方案,而自 iOS11 发布以来什么都没有。

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

【问题讨论】:

【参考方案1】:

短版/TLDR

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

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

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

加长版

我联系了几位专家,他们都暗示它应该可以正常工作,但即使查看他们的示例应用程序,他们也都表现出同样的问题。所以我最终认为这可能是 Twitter 或 Facebook 的问题,因为分享到 Apple 应用程序才有效。然后我开始玩照片应用程序并决定点击那里的分享按钮,瞧,它可以与 Twitter 和 Facebook 一起使用!这让我想知道这是否意味着需要一些增量设置才能使其正常工作。在尝试了许多不同的事情之后,我终于找到了一种有效的方法。通过 PNG 或 JPG 将图像转换为 Data 并将该新对象传递给您的 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 以来一直在努力分享图像的其他人有所帮助。

【讨论】:

很公平。更新以利用 JPG 和安全展开。 太棒了!拯救了我的一天!谢谢! UIImageJPEGRepresentation(image, 0.8) 确实有助于修复iOS 11 中的图像共享问题并在早期版本中工作,谢谢! @Causaelity 你知道如何用文字分享图片吗?当我尝试使用 facebook 时,我只能分享图片!请建议 @PrashantTukadiya 您通常会将文本传递到与activityItems 相关联的数组中。所以[textToShare,jpgImage]。也就是说,接收应用程序需要愿意接受该信息并使用它。对于 Facebook,他们不再接受传入的文本,而是希望用户手动输入。但是,如果您想确认您的代码有效,这仍然适用于 Twitter 应用程序。【参考方案2】:

接受的答案对所有第 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)

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于iOS11:UIActivityViewController 未成功将 UIImage 共享给 3rd 方应用程序的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11开发教程iOS11模拟器介绍二

iOS 11开发教程

AVPlayerViewController 视频适用于 iOS 11、12,但不适用于 iPhone 11 的 iOS 13

“命名颜色在 iOS 11.0 之前不起作用。”即使部署目标是 >= iOS 11.0

iOS 11开发教程iOS11模拟器介绍一

iOS 11开发教程iOS11无线连接手机真机测试