Как получить авторизованный PHAsset от UIImagePickerController? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть этот код:

@IBAction func importButtonPressed(_ sender: Any) {
        self.imagePicker.sourceType = .photoLibrary
        self.imagePicker.allowsEditing = true
        self.imagePicker.mediaTypes = [kUTTypeMovie as String, kUTTypeImage as String]

        self.present(self.imagePicker,animated: true, completion: nil)
}

Это прекрасно представляет UIImagePicker.Затем, когда я хочу использовать выбранный элемент, чтобы получить, скажем, дату PHAsset:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        guard info[UIImagePickerControllerMediaType] != nil else { return }
        let mediaType = info[UIImagePickerControllerMediaType] as! CFString
        switch mediaType {
        case kUTTypeImage:
            if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                ...
            }
            break
        case kUTTypeMovie:
            if let videoURL = info[UIImagePickerControllerMediaURL] as? URL, let pickedAsset = info[UIImagePickerControllerPHAsset] as? PHAsset {
                print("kUTTypeMovie")
                MyVariables.isScreenshot = false
                let creationDate = pickedAsset.creationDate
                print(creationDate,"creationDate")
            }
            break
        case kUTTypeLivePhoto:
            print("livePhoto")
            dismiss(animated: true, completion: nil)

            break
        default:
            dismiss(animated: true, completion: nil)

            print("something else")
            break
        }
    }

Теперь, когда я выбираю, например, видео, print("kUTTypeMovie") терпит неудачу, я думаю, потому что let pickedAsset = info[UIImagePickerControllerPHAsset] as? PHAsset терпит неудачу

В другом месте ( UIImagePickerControllerDelegate получить дату от выбранного изображения в iOS 11 ) Я видел, что, возможно, это потому, что мне нужна авторизация для выбора PHAssets.

Поэтому я изменяю свой первый блок кода на:

@IBAction func importButtonPressed(_ sender: Any) {

        let status = PHPhotoLibrary.authorizationStatus()

        switch status {
        case .authorized:
            PHPhotoLibrary.requestAuthorization({status in
                if status == .authorized {
                    self.imagePicker.sourceType = .photoLibrary
                    self.imagePicker.allowsEditing = true
                    self.imagePicker.mediaTypes = [kUTTypeMovie as String, kUTTypeImage as String]

                    self.present(self.imagePicker,animated: true, completion: nil)
                }
            })
        case .denied:
            print("denied")
        // probably alert the user that they need to grant photo access
        case .notDetermined:
            print("not determined")
        case .restricted:
            print("restricted")
            // probably alert the user that photo access is restricted
        }

    }

Однако теперь, когда я нажимаю кнопку импорта, он вылетает с ошибкой lldb:

libsystem_kernel.dylib`__abort_with_payload:
    0x1854f7040 <+0>:  mov    x16, #0x209
    0x1854f7044 <+4>:  svc    #0x80
->  0x1854f7048 <+8>:  b.lo   0x1854f7060               ; <+32>
    0x1854f704c <+12>: stp    x29, x30, [sp, #-0x10]!
    0x1854f7050 <+16>: mov    x29, sp
    0x1854f7054 <+20>: bl     0x1854d8bdc               ; cerror_nocancel
    0x1854f7058 <+24>: mov    sp, x29
    0x1854f705c <+28>: ldp    x29, x30, [sp], #0x10
    0x1854f7060 <+32>: ret    

Такясно, что я не делаю это правильно.Как я должен это сделать?

1 Ответ

0 голосов
/ 04 июня 2018

Сбой из-за отсутствия разрешения на доступ к библиотеке фотографий, приведенного ниже,

Это приложение упало из-за попытки доступа к конфиденциальным данным без описания использования.Info.plist приложения должен содержать ключ NSPhotoLibraryUsageDescription со строковым значением, объясняющим пользователю, как приложение использует эти данные.

В вашем Info.plist добавьте ключ NSPhotoLibraryUsageDescription с некоторым описанием, как показано нижеи он будет работать нормально

enter image description here

Редактировать Вы также должны использовать PhotoLibrary авторизацию надлежащим образом, как показано ниже.

@IBAction func importButtonPressed(_ sender: Any) {

    PHPhotoLibrary.requestAuthorization({status in
        switch status {
        case .authorized:
            self.imagePicker.sourceType = .photoLibrary
            self.imagePicker.allowsEditing = true
            self.imagePicker.mediaTypes = [kUTTypeMovie as String, kUTTypeImage as String]

            self.present(self.imagePicker,animated: true, completion: nil)
        case .denied:
            print("denied")
        // probably alert the user that they need to grant photo access
        case .notDetermined:
            print("not determined")
        case .restricted:
            print("restricted")
            // probably alert the user that photo access is restricted
        }
    })
}
...