Swift 请求在应用程序被终止后使用UIImagePickerController拾取的视频文件的权限

Swift 请求在应用程序被终止后使用UIImagePickerController拾取的视频文件的权限,swift,permissions,swift4,uiimagepickercontroller,Swift,Permissions,Swift4,Uiimagepickercontroller,因此,我目前正在使用UIImagePickerController从画廊中挑选视频。我有以下代码: func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let videoURL = info[UIImagePickerController.Inf

因此,我目前正在使用UIImagePickerController从画廊中挑选视频。我有以下代码:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
            MediaManager.shared.sourceType = picker.sourceType
            self.metadata.videoURL = videoURL
            ...
        }
        else if let asset =  info[UIImagePickerController.InfoKey.phAsset] as? PHAsset {
            asset.getURL(completionHandler: { url in
                self.metadata.videoURL = url
               ...
            })
        }
        else if let ref =  info[UIImagePickerController.InfoKey.phAsset] as? URL {
            self.metadata.videoURL = ref
           ...
        }
        else {
           ...
        }


    }
所以,我保存视频url,并基于该url,我可以获得视频数据等

问题是,下一次我重新启动应用程序时,我希望能够再次获取该视频,而无需使用picker。但我似乎没有这个权限。有没有办法向iOS申请许可,即使我关闭了应用程序(或者应用程序崩溃),我也可以通过其url打开视频

编辑:

例如,我得到的url如下:

file:///private/var/mobile/Containers/Data/Application/AC5AD743-924F-430D-9C34-F3848E4CEE75/tmp/4CBAD829-8764-4234-BCCF-BFA571845D55.MOV
但我真的不能在应用程序被杀后使用它。因此,如何使用picker拾取某些内容,并在以后重新使用。

说:

重要提示:虽然文件引用URL在应用程序运行时可以安全使用,但在应用程序启动之间存储和重用文件引用URL并不安全,因为如果系统重新启动,文件的ID可能会更改。如果要在应用程序启动之间持久存储文件位置,请按照“使用书签定位文件”中的说明创建书签

所以我建议使用该方法为现有URL创建书签

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        guard let mediaType = info[.mediaType] as? String,
            mediaType == kUTTypeMovie as String,
            let url = info[.mediaURL] as? URL else {
            return
        }

        do {
            let bookmarkData = try url.bookmarkData()
            UserDefaults.standard.set(bookmarkData, forKey: "mediaURL")
        } catch {
            print("bookmarkData error: \(error)")
        }
    }

    func mediaURL() -> URL? {
        guard let urlData = UserDefaults.standard.data(forKey: "mediaURL") else {
            return nil
        }

        var staleData = false
        let mediaURL = try? URL(resolvingBookmarkData: urlData, options: .withoutUI, relativeTo: nil, bookmarkDataIsStale: &staleData)

        return staleData ? nil : mediaURL
    }

根据@Michcio的答案,您可以这样做:

选择视频事件:

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {

    let mediaType = info[UIImagePickerController.InfoKey.mediaType] as AnyObject
    if mediaType as! String == kUTTypeMovie as String {
        guard let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL else {
            return
        }
        let bookmarkData: Data

        do {
            try bookmarkData = videoURL.bookmarkData()
            let userDefaults = UserDefaults.standard
            userDefaults.set(bookmarkData, forKey: "video")
            userDefaults.synchronize()
        } catch {
            print(error)
        }

        self.pickerController.dismiss(animated: true, completion: nil)
    }

}
重新启动后恢复视频URL:

func getVideo() {

    let userDefaults = UserDefaults.standard
    guard let decoded  = userDefaults.data(forKey: "video") else {
        return
    }

    var videoURL: NSURL

    do {
        var isSSNField = ObjCBool(true)
        try videoURL = NSURL.init(resolvingBookmarkData: decoded, options: .withoutUI, relativeTo: nil, bookmarkDataIsStale: &isSSNField)
        print(videoURL)
    } catch {
        print(error)
    }

}

你能演示一下如何使用你建议的方法吗?至少举个简单的例子?