L'accès à l'album a été révisé dans iOS14. Dans iOS14, veuillez remplacer l'application qui sélectionne les photos à l'aide du UIImagePicker conventionnel par PHPickerViewController.
Si vous souhaitez simplement sélectionner des photos, vous n'avez pas besoin d'accorder l'accès aux photos à l'application. Cette boîte de dialogue de sélection d'autorisation ennuyeuse et au revoir au premier démarrage.
En effet, PHPickerViewController s'exécute dans un processus séparé (distinct de l'application hôte), l'accès aux photos est donc effectué par PHPicker. À partir de là, le mécanisme d'extension d'application est utilisé pour transmettre les informations de photo sélectionnées à l'application hôte, de sorte que l'accès à l'album n'est plus nécessaire.
PHPickerViewController prend également en charge la sélection de photos multiples.
Supposons que vous souhaitiez sélectionner une photo, récupérer le fichier tel quel et l'envoyer au backend, ou l'enregistrer dans l'application. Puisque loadObject est une UIImage, il est destiné aux personnes qui ont des problèmes si les méta-informations d'origine sont perdues.
Xcode12 iOS14
import PhotosUI
private func showPhpicker() {
//Si vous souhaitez l'obtenir en tant que PHAsset ultérieurement, spécifiez l'argument.
var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
//Nombre de sélections de photos simultanées. Illimité à 0
config.selectionLimit = 1
config.filter = PHPickerFilter.images
let pickerViewController = PHPickerViewController(configuration: config)
pickerViewController.delegate = self
self.present(pickerViewController, animated: true, completion: nil)
}
Est-ce que c'est comme ça? HEIC extrait le JPEG stocké à l'intérieur. Dans le cas d'une image, récupérez-la avec la méthode loadDataRepresentation.
J'ai proposé une méthode pour obtenir l'URL avec loadItem et la convertir en données, mais comme l'album n'est accessible que sur le processus de PHPickerViewContrller, peu importe combien l'URL est connue, l'album via l'URL de l'application Vous ne pouvez pas accéder aux ressources de.
///Méthode après sélection
/// - Parameters:
/// - picker: PHPickerVIewController
/// - results:Liste des résultats de la sélection
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true, completion: {
// TODO:Traitement après la fermeture de PHPickerView
})
guard let provider = results.first?.itemProvider else { return }
guard let typeIdentifer = provider.registeredTypeIdentifiers.first else { return }
//Vérifiez si l'identifiant peut être déterminé
if provider.hasItemConformingToTypeIdentifier(typeIdentifer) {
//Disponible en Live Photo
if provider.canLoadObject(ofClass: PHLivePhoto.self) {
//LivePhoto est chargé avec LoadObject en spécifiant Class
provider.loadObject(ofClass: PHLivePhoto.self) { (livePhotoObject, error) in
do {
if let livePhoto:PHLivePhoto = livePhotoObject as? PHLivePhoto {
//Extraire une image fixe des propriétés de Live Photo(Format HEIC)
if let imageUrl = livePhoto.value(forKey: "imageURL") as? URL {
//Générer des données à partir de l'URL (peut être obtenu car il fait référence aux données dans HEIC
let data:Data = try Data(contentsOf: imageUrl)
//Générer un chemin et enregistrer l'image
//data.write(to: URL)
}
}
} catch {
}
}
} else if provider.canLoadObject(ofClass: UIImage.self) {
//Image générale
//Dans le cas d'une image, utilisez loadObject pour l'obtenir avec UIImage ou loadData.
//Lors de l'obtention de l'URL avec loadItem, l'obtention de l'IUImage ou des données à partir de l'URL nécessite une autorisation d'accès à l'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
}
//Enregistrer l'image
//data?.write(to: URL)
}
}
}
}
}
L'exemple de projet est ci-dessous. https://github.com/onizine/PHPickerGetDataSample