通过本地 url 共享图像时,Instagram 共享扩展返回错误消息

Yar*_*dam 8 uikit instagram uiactivityviewcontroller swift

我在通过 iOS 共享表将图像共享到 Instagram 时遇到问题。我需要通过 URL 将图像共享到本地文件,因为我希望图像在共享时以某种方式命名,这是我发现我可以做到的唯一方法。代码是:

//This saves the image into the local temp directory and returns the file url
saveImageForSharing(image: image!) {(tempUrl) in
    if tempUrl != nil {
        let objectsToShare = [tempUrl!]
        let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
        self.present(activityVC, animated: true, completion: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

当 UIActivityViewController 出现时,您可以成功地将图像分享到所有可用的服务(包括 Facebook、电子邮件、Twitter 等),除了 Instagram。分享到Instagram时,弹出以下错误: Instagram 错误

为 UIActivityViewController 的 completionWithItemsHandler 设置完成处理程序,'success' 参数返回为 false,但错误对象为 nil,因此没有关于出错的信息。

直接共享一个 UIImage 是没有问题的。保存到不同的 URL 或更改文件名时也是如此。

任何想法在这里可能发生的事情,或者我如何在设置项目名称的同时成功共享图像?

编辑:我在尝试通过其 url 共享视频时也遇到了这个问题。该视频仅存储在照片库中,我无法让 Instagram 接受它,即使从照片应用程序共享时它共享得非常好!此外,我在输出控制台中收到一条消息,显示“无法为 URL: ssue 沙箱令牌”。有什么建议吗?

谢谢!

RPK*_*RPK 1

尝试一下,看看是否可以解决您的问题。

class ShareItem: NSObject, UIActivityItemSource {
    private let url: URL
    private let title: String

    init(url: URL, title: String) {
        self.url = url
        self.title = title
    }

    func activityViewControllerPlaceholderItem(_: UIActivityViewController) -> Any {
        url
    }

    func activityViewController(_: UIActivityViewController, itemForActivityType _: UIActivity.ActivityType?) -> Any? {
        url
    }

    func activityViewController(_: UIActivityViewController, subjectForActivityType _: UIActivity.ActivityType?) -> String {
        title
    }

    func activityViewController(_: UIActivityViewController, dataTypeIdentifierForActivityType _: UIActivity.ActivityType?) -> String {
        (try? url.resourceValues(forKeys: [.typeIdentifierKey]).typeIdentifier) ?? ""
    }

    func activityViewController(_: UIActivityViewController, thumbnailImageForActivityType _: UIActivity.ActivityType?, suggestedSize _: CGSize) -> UIImage? {
        UIImage(contentsOfFile: url.absoluteString)
    }

    func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata? {
        let metadata = LPLinkMetadata()

        metadata.originalURL = url
        metadata.url = url
        metadata.title = title

        return metadata
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您将传递一个实例ShareItemUIActivityViewController代替您的 tempUrl。

// This saves the image into the local temp directory and returns the file url
saveImageForSharing(image: image!) { tempUrl in
    guard let url = tempUrl else {
        return
    }

    let activityVC = UIActivityViewController(
        activityItems: [
            ShareItem(url: url, title: "Your Title")
        ],
        applicationActivities: nil
    )

    self.present(
        activityVC,
        animated: true,
        completion: nil
    )
}
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助。