2017-01-15 2 views
0

Ich experimentiere mit UIImagePickerController, um Fotos aus der Bibliothek oder durch ein Foto mit der Kamera zu wählen.UIImagePickerController werfen SIGABRT

Ich befolgte die Schritte auf einer Website (https://makeapppie.com/2016/06/28/how-to-use-uiimagepickercontroller-for-a-camera-and-photo-library-in-swift-3-0/) und funktionierte für die Fotobibliothek, aber jedes Mal, wenn ich versuche, die Kamera von meiner App aufzurufen, gibt es den Fehler "Thread 1: Signal SIGABRT".

Dies ist der Code, den ich die Kamera aufzurufen bin mit:

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

Es war mein Verständnis, dass die SIGABRT Fehler würde in den Simulator zu erwarten. Aber als ich es auf meinem iPhone 7 versuchte, erwartete ich, dass es funktioniert und es gab den gleichen Fehler.

Ich habe die "Privacy - Camera Usage Description" zur Datei Info.plist hinzugefügt.

Irgendwelche Ideen, was ich falsch gemacht habe?

Antwort

2

Hier ist meine vollständige Code für die Verwendung/Auswahl

// 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] 
     } 
    } 
} 

ignorieren die beiden kommentierten aus Linien - das sind Mine zum Testen Dinge. Dieser Code funktioniert auf allen Geräten, iOS 9+, alle Orientierungen (aber denken Sie daran, dass das iPhone immer im Hochformat angezeigt wird), und ich hatte nie Probleme im Simulator (es hat keine Kamera) noch ein physikalisches Gerät.

Interessant ist eine Sache, die ein Problem verursachen könnte (nicht sicher, ob es SIGABRT wirft) - Ich suche nach einer hinteren Kamera und gebe einen Alarm aus, wenn es nicht existiert. (Keine Überprüfung für die Frontkamera. Ich bin mir nicht einmal sicher, ob irgendetwas außer einem iPod touch keine Frontkamera hat.)

Vergessen Sie auch nicht, zwei Dinge zu Ihrer info.plist hinzuzufügen 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> 

Sie können setzen, was Sie wollen, in die Beschreibung Tags. Ohne diese wird die App in iOS 10 heruntergefahren und Apple wird Ihre Einreichung ablehnen. Here's ein Link zu mehr Details.

+0

Danke für die Antwort. Entschuldigung, meine ursprüngliche Frage war ein wenig mehrdeutig. Ich erwartete, den Fehler im Simulator zu bekommen, aber nicht auf meinem iPhone. Ich bekomme den gleichen Fehler bei beiden. –

+0

Ich bearbeite meine Antwort mit vollem Code. Wenn das nicht hilfreich ist, lass es mich wissen und ich werde es löschen. Vielen Dank. – dfd

+0

@AlanSpark - Ihr Problem sollte gelöst werden, indem Sie einfach Ihre 'info.plist' Datei aktualisieren, genau wie es @dfd vorgeschlagen hat. Wenn Sie eine einfachere Methode benötigen, kopieren Sie die Schlüssel und fügen Sie sie ein. Geben Sie dann den Wert manuell in die Wertspalte ein, wenn Sie eine neue Zeile in die Datei "info.plist" einfügen. Erstellen Sie beispielsweise eine neue Zeile und fügen Sie 'NSCameraUsageDescription' in die Spalte" Key "ein. Xcode wird es automatisch aktualisieren, um etwas wie "Datenschutz - Kamerazugriff" zu sagen, dann einfach die Beschreibung in die Spalte "Wert" eingeben – Pierce