【问题标题】:UIDocumentInreactionController won't allow NSURL for .URL (Swift)UIDocumentInreactionController 不允许 .URL 的 NSURL (Swift)
【发布时间】:2026-01-13 13:00:01
【问题描述】:

我基本上是在截取视图,将其保存到我的相机胶卷,获取 NSURL 路径并导出到 Whatsapp

    //Create the UIImage
    UIGraphicsBeginImageContext(view.frame.size)
    view.layer.renderInContext(UIGraphicsGetCurrentContext())
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    //Save it to camera roll round 2
    var library = ALAssetsLibrary()

    library.writeImageToSavedPhotosAlbum(image.CGImage, metadata: nil, completionBlock: {
        (path:NSURL!, error:NSError!) -> Void in

        if NSThread.currentThread() == NSThread.mainThread(){
            println("\(path)")
            var controller = UIDocumentInteractionController()
            controller.delegate = self
            controller.UTI = "net.whatsapp.image"
            controller.URL = path
            controller.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)

        }
    })

我收到此错误:

-[UIDocumentInteractionController setURL:] 中的断言失败, /SourceCache/UIKit/UIKit-3318.16.21/UIDocumentInteractionController.m:1024

但根据 Apple 的文档,它必须是 NSURL (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDocumentInteractionController_class/#//apple_ref/occ/instp/UIDocumentInteractionController/URL)

有什么想法吗?

【问题讨论】:

  • 但不能是nil。是吗?
  • 顺便说一句,不要写if NSThread.currentThread() == NSThread.mainThread()。使用isMainThread。更好的是,甚至不要问那个问题;如果您的目标是进入主线程,请进入主线程(使用dispatch_async)。
  • @matt 感谢您的反馈!我只是快速检查一下completionBlock 是否在mainThread 上运行。从现在开始我将使用 isMainThread。
  • 但是如果它不是主线程呢?你仍然想这样做。照我说的做;与dispatch_async 合作。

标签: ios swift screenshot whatsapp


【解决方案1】:

将图像保存在相机胶卷或应用程序之外的某个位置后,您可以使用带有“assets-library scheme”的 URL 访问它。

但 UIDocumentInteractionController 的 URL 属性只支持带有“文件方案”的 URL。

因此,您需要将图像保存到应用程序的临时目录,并将“路径”属性设置为其文件方案 URL。

【讨论】:

  • 非常感谢,应该可以了!