Запрос разрешения на использование видеофайла, выбранного с помощью UIImagePickerController после закрытия приложения - PullRequest
1 голос
/ 19 сентября 2019

Итак, я сейчас выбираю видео из галереи, используя 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 я могу получить видеоданные и т. Д.

Дело в том, что при следующем перезапуске приложенияЯ хочу получить это видео снова, без использования средства выбора.Но, похоже, у меня нет прав на это.Есть ли способ попросить у iOS разрешение, которое даст мне возможность открывать видео по его URL, даже если я закрыл приложение (или если оно упало)?

РЕДАКТИРОВАТЬ:

так, например, я получаю что-то вроде этого в виде URL:

file:///private/var/mobile/Containers/Data/Application/AC5AD743-924F-430D-9C34-F3848E4CEE75/tmp/4CBAD829-8764-4234-BCCF-BFA571845D55.MOV

, но я не могу использовать его после того, как приложение будет убито.Итак, как выбрать что-то с помощью инструмента выбора и использовать его позже.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Адаптируя ответ @ 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)
    }

}
0 голосов
/ 26 сентября 2019

Документация Apple гласит:

Важное замечание: Несмотря на то, что они безопасны в использовании во время работы вашего приложения, URL-адреса ссылок на файлы небезопасны для хранения и повторного использования между запусками вашего приложения.приложение, потому что идентификатор файла может измениться, если система перезагрузится.Если вы хотите постоянно сохранять местоположение файла между запусками вашего приложения, создайте закладку, как описано в разделе «Поиск файлов с помощью закладок».

Поэтому я предложу использовать bookmarkData (параметры: includesResourceValuesForKeys :lativeTo:) метод для создания закладки для существующего 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
    }
...