2017-01-15 3 views
0

Я экспериментирую с UIImagePickerController, чтобы фотографии можно было выбирать из библиотеки или фотографировать с помощью камеры.UIImagePickerController throwing SIGABRT

Я выполнил шаги на веб-сайте (https://makeapppie.com/2016/06/28/how-to-use-uiimagepickercontroller-for-a-camera-and-photo-library-in-swift-3-0/) и получил эту работу для библиотеки фотографий, но всякий раз, когда я пытаюсь вызвать камеру из своего приложения, она дает ошибку «Thread 1: signal SIGABRT».

Это код, который я использую для вызова камеры:

picker.allowsEditing = false 
picker.sourceType = UIImagePickerControllerSourceType.camera 
picker.cameraCaptureMode = .photo 
picker.modalPresentationStyle = .fullScreen 
present(picker,animated: true,completion: nil) 

Это было мое пониманием того, что ошибка SIGABRT можно была бы ожидать в тренажере. Однако, когда я попробовал это на своем iPhone 7, я ожидал, что он сработает, и он дал ту же ошибку.

Я добавил в файл Info.plist «Конфиденциальность - описание использования камеры».

Любые идеи, что я сделал неправильно?

ответ

2

Вот мой полный код для использования/выбора

// MARK: Camera App 

func openCameraApp() { 
    if UIImagePickerController.availableCaptureModes(for: .rear) != nil { 
     picker.allowsEditing = false 
     picker.sourceType = UIImagePickerControllerSourceType.camera 
     picker.cameraCaptureMode = .photo 
     picker.modalPresentationStyle = .fullScreen 
     present(picker, 
       animated: true, 
       completion: nil) 
    } else { 
     noCamera() 
    } 
} 
func noCamera(){ 
    let alertVC = UIAlertController(
     title: "No Camera", 
     message: "Sorry, this device has no camera", 
     preferredStyle: .alert) 
    let okAction = UIAlertAction(
     title: "OK", 
     style:.default, 
     handler: nil) 
    alertVC.addAction(okAction) 
    present(
     alertVC, 
     animated: true, 
     completion: nil) 
} 

// MARK: Photos Albums 

func showImagePicker() { 
    picker.allowsEditing = false 
    picker.sourceType = .photoLibrary 
    //picker.modalPresentationStyle = .Popover 
    present(picker, 
      animated: true, 
      completion: nil) 
    picker.popoverPresentationController?.sourceView = self.view 
} 
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    image = chosenImage 
    self.performSegue(withIdentifier: "ShowEditView", sender: self) 
    dismiss(animated: true, completion: nil) 
} 
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    dismiss(animated: false, completion: nil) 
} 

// MARK: Seque to EditViewController 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ShowEditView" { 
     if let vc = segue.destination as? EditViewController { 
      vc.image = image 
      //vc.image = images[0] 
     } 
    } 
} 

Игнорируйте две закомментированные линии - это те шахты для тестирования вещей. Этот код работает на всех устройствах iOS 9+, все ориентации (но помните, что iPhone всегда отображается портрет), и у меня никогда не было проблем ни в симуляторе (у него нет камеры), ни в физическом устройстве.

Особый интерес представляет одна вещь, которая может вызвать проблему (не уверен, что она выбрасывает SIGABRT). Я проверяю заднюю камеру и выставляю предупреждение, если оно не существует. (Нет проверки на переднюю камеру, хотя я даже не уверен, что если у iPod touch нет передней камеры).

Кроме того, не забудьте добавить две вещи к вашему info.plist для iOS 10:

<key>NSCameraUsageDescription</key> 
<string>Used to capture new image for photo effect</string> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>Used to select an image for photo effect</string> 

Вы можете поместить все, что хотите, в теги описания. Без них приложение будет закрыто в iOS 10, и Apple отклонит ваше представление. Here's ссылка на более подробную информацию.

+0

Спасибо за ответ. Извините, мой оригинальный вопрос был немного неоднозначным. Я ожидал получить ошибку в симуляторе, но не на моем iPhone. Я получаю ту же ошибку на обоих. –

+0

Я отредактирую свой ответ с полным кодом. Если это не поможет, сообщите мне, и я удалю его. Благодарю. – dfd

+0

@AlanSpark - Вы должны решить проблему, просто обновив файл 'info.plist' так же, как предлагалось @dfd. Если вам нужен более простой способ сделать это, скопируйте и вставьте ключи, а затем вручную введите значение в столбце значений, когда вы вставляете новую строку в свой файл 'info.plist'. Например, создайте новую строку и вставьте 'NSCameraUsageDescription' в столбец« Ключ ». Xcode автоматически обновит его, чтобы сказать что-то вроде «Privacy - Camera Access», а затем просто введите описание в столбце «Значение» – Pierce