Der Zugriff auf das Album wurde in iOS14 überarbeitet. Ersetzen Sie in iOS14 die Anwendung, die Fotos mit dem herkömmlichen UIImagePicker auswählt, durch PHPickerViewController.
Wenn Sie nur Fotos auswählen möchten, müssen Sie der App keinen Fotozugriff gewähren. Dieser nervige Berechtigungsauswahldialog und auf Wiedersehen beim ersten Start.
Dies liegt daran, dass PHPickerViewController in einem separaten Prozess (getrennt von der Host-App) ausgeführt wird, sodass der Fotozugriff von PHPicker erfolgt. Von dort aus wird der App-Erweiterungsmechanismus verwendet, um die ausgewählten Fotoinformationen an die Host-App zu übergeben, sodass kein Zugriff mehr auf das Album erforderlich ist.
PHPickerViewController unterstützt auch die Auswahl mehrerer Fotos.
Stellen Sie sich einen Fall vor, in dem Sie ein Foto auswählen, die Datei unverändert abrufen und an das Backend senden oder in der App speichern möchten. Da loadObject ein UIImage ist, ist es für Personen gedacht, die in Schwierigkeiten sind, wenn die ursprünglichen Metainformationen verloren gehen.
Xcode12 iOS14
import PhotosUI
private func showPhpicker() {
//Wenn Sie es später als PHAsset erhalten möchten, geben Sie das Argument an.
var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
//Anzahl gleichzeitiger Fotoauswahl. Unbegrenzt bei 0
config.selectionLimit = 1
config.filter = PHPickerFilter.images
let pickerViewController = PHPickerViewController(configuration: config)
pickerViewController.delegate = self
self.present(pickerViewController, animated: true, completion: nil)
}
Ist es wie folgt? HEIC extrahiert das darin gespeicherte JPEG. Im Fall eines Bildes rufen Sie es mit der loadDataRepresentation-Methode ab.
Ich habe mir eine Methode ausgedacht, um die URL mit loadItem abzurufen und in Daten zu konvertieren. Da jedoch nur mit PHPickerViewContrller auf das Album zugegriffen werden kann, wird das Album unabhängig von der bekannten URL über die URL aus der Anwendung abgerufen Sie können nicht auf die Ressourcen von zugreifen.
///Methode nach Auswahl
/// - Parameters:
/// - picker: PHPickerVIewController
/// - results:Liste der Auswahlergebnisse
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true, completion: {
// TODO:Die Verarbeitung nach dem Schließen von PHPickerView
})
guard let provider = results.first?.itemProvider else { return }
guard let typeIdentifer = provider.registeredTypeIdentifiers.first else { return }
//Überprüfen Sie, ob die Kennung ermittelt werden kann
if provider.hasItemConformingToTypeIdentifier(typeIdentifer) {
//Verfügbar als Live-Foto
if provider.canLoadObject(ofClass: PHLivePhoto.self) {
//LivePhoto wird mit LoadObject geladen, indem Class angegeben wird
provider.loadObject(ofClass: PHLivePhoto.self) { (livePhotoObject, error) in
do {
if let livePhoto:PHLivePhoto = livePhotoObject as? PHLivePhoto {
//Extrahieren Sie ein Standbild aus den Eigenschaften von Live Photo(HEIC-Format)
if let imageUrl = livePhoto.value(forKey: "imageURL") as? URL {
//Daten aus URL generieren (kann abgerufen werden, da sie sich auf die Daten in HEIC beziehen
let data:Data = try Data(contentsOf: imageUrl)
//Generieren Sie einen Pfad und speichern Sie das Bild
//data.write(to: URL)
}
}
} catch {
}
}
} else if provider.canLoadObject(ofClass: UIImage.self) {
//Allgemeines Bild
//Verwenden Sie im Fall eines Bildes loadObject, um es mit UIImage oder loadData abzurufen.
//Wenn Sie die URL mit loadItem abrufen, benötigen Sie zum Abrufen von UIImage oder Daten von der URL eine Zugriffsberechtigung für das Album.
provider.loadDataRepresentation(forTypeIdentifier: typeIdentifer) { (data, error) in
if let imageData = data {
var ext = ""
switch typeIdentifer{
case "public.jpeg ":
ext = ".jpg "
case "public.png ":
ext = ".png "
default:
break
}
//Bild speichern
//data?.write(to: URL)
}
}
}
}
}
Das Beispielprojekt ist unten. https://github.com/onizine/PHPickerGetDataSample