L'access à la bibliothèque de photos iOS11 est possible même si les parameters sont définis sur "jamais"

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { let imagePicker = UIImagePickerController() imagePicker.sourceType = .photoLibrary imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: { }) } 

Même si je définis l'access aux photos dans les parameters sur "Jamais" avec le code ci-dessus, je peux toujours présenter le sélecteur d'image et montrer des photos. Je vais vérifier PHPhotoLibrary.authorizationStatus() avant de le montrer, mais je voudrais savoir ce comportement attendu?

D'accord, vous pouvez déjà rassembler les réponses et les commentaires, mais essayer de raconter une histoire plus complète …


Dans iOS 11, UIImagePickerController s'exécute en tant que process distinct de votre application. Cela signifie:

  1. Votre application ne peut pas voir la totalité de la bibliothèque Photos de l'user – elle obtient un access en lecture seule, quel que soit le ou les éléments que l'user choisit dans le sélecteur d'image.
  2. À cause de (1), votre application n'a pas besoin de l'autorisation de confidentialité standard pour accéder à la bibliothèque Photos. L'user choisit explicitement un actif spécifique (ou multiple) à utiliser dans votre application, ce qui signifie que l'user autorise votre application à lire les ressources en question.

Vous pouvez en voir plus à ce sujet dans la conférence WWDC17 sur PhotoKit .

(En passant, ce model correspond à ce que vous avez vu dans le framework Contacts depuis iOS 9. Si vous affichez le sélecteur de contacts, votre application ne reçoit qu'une seule fois les informations de contact pour le (s) contact (s) sélectionné (s) par l'user. access en lecture / écriture en continu à la database Contacts, de sorte que le sélecteur de contacts ne nécessite pas d'autorisation de confidentialité spéciale.)


PHPhotoLibrary et son statut d'autorisation reflètent l'autorisation globale de lecture / écriture pour l'access Photos que les users peuvent contrôler depuis Paramètres> Confidentialité. (C'est celui où votre Info.plist a besoin de NSPhotoLibraryUsageDescription .) Toute utilisation de l'API PHPhotoLibrary requirejs cette permission, que l'utilisation de cette API soit uniquement pour l'écriture ou seulement pour la lecture. Cela a été vrai depuis que PhotoKit a été introduit dans iOS 8.

Si vous n'utilisez pas PHPhotoLibrary , PHAsset , etc., il existe des options d'autorisation plus étroites qui sont nouvelles dans iOS 11 (et qui ne font pas partie de l'API Photos.framework):

  • Comme indiqué ci-dessus, UIImagePickerController n'a pas besoin de l'autorisation globale de parameters de confidentialité, car chaque utilisation accorde un access en lecture unique aux ressources sélectionnées.
  • Si vous n'avez besoin que d'append de nouveaux éléments à la bibliothèque Photos, utilisez UIImageWriteToSavedPhotosAlbum ou UISaveVideoAtPathToSavedPhotosAlbum . Avec ceux-ci, vous pouvez mettre NSPhotoLibraryAddUsageDescription dans votre Info.plist – alors les parameters de confidentialité du système indiqueront clairement à l'user qu'il ne vous autorise pas à voir ou modifier les ressources existantes, mais seulement à en append de nouvelles.

    Si l'user accorde l'autorisation de lecture seule, elle s'applique uniquement à ces fonctions UIKit. PHPhotoLibrary tentez d'utiliser PHPhotoLibrary , l'invite de lecture / écriture (et la key Info.plist nécessaire) s'affiche.

    Consultez cette partie de WWDC17 pour en savoir plus sur le paramètre de confidentialité en lecture seule.

Est-ce que ce comportement est attendu? – OUI.

De la docs – https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable

true si le périphérique prend en charge le type de source spécifié; false si le type de source spécifié n'est pas disponible.

Il vous indique si le périphérique prend en charge le type de source et non si l'application a l'autorisation d'y accéder.

Comme vous l'avez déjà mentionné dans la question, PHPhotoLibrary.authorizationStatus() serait correct de vérifier cela.

UIImagePickerController et PHPhotoLibrary responsables de différents domaines.

Vous devez vérifier à la fois: le statut d'authentification et la disponibilité de la source.

PHAuthorizationStatus

Informations sur l' autorisation de votre application pour accéder à la bibliothèque Photos de l'user.

isSourceTypeAvailable

Discussion

Étant donné qu'une source de média peut ne pas être présente ou être indisponible , les périphériques peuvent ne pas toujours prendre en charge tous les types de source.

Par exemple , si vous tentez de sélectionner une image dans la bibliothèque de l'user et que la bibliothèque est vide, cette méthode renvoie false. De même, si la camera est déjà utilisée, cette méthode renvoie false.

Ce (nouveau) comportement me semble logique, voici pourquoi. Lorsque vous utilisez UIImagePickerController votre application n'a access à aucune photo. Il ne voit que celui que votre user a choisi, quand cela arrive; et si l'user appuie sur Annuler dans le sélecteur, aucun d'entre eux n'est disponible pour l'application.

PHPhotoLibrary fait partie d'un cadre distinct, Photos , où vous pouvez faire beaucoup de choses avec la photothèque de l'user, et donc besoin d'une autorisation.

Donc, si vous n'utilisez que UIImagePickerController je vous suggère de ne pas mélanger les photos.

Disclaimer: N'a pas entendu parler d'une déclaration officielle des gens d'Apple. Ce fil de discussion semble pertinent, peut-être que nous recevrons une réponse ici.

Aussi, si vous êtes assez maléfique, vous pouvez théoriquement UIImagePickerController avec la hiérarchie de la vue UIImagePickerController à l'exécution et examiner tout ce que l'user y voit. Mais c'est encore une fois pour Apple, nous devrions juste être gentils 🙂