37 votes

L'accès à la photothèque d'iOS11 est possible même si les paramètres sont réglés 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 règle l'accès aux photos dans les paramètres sur "Jamais" avec le code ci-dessus, je peux toujours présenter le sélecteur d'images et afficher les photos. Je vais vérifier si PHPhotoLibrary.authorizationStatus() avant de le montrer, mais j'aimerais savoir si c'est le comportement attendu ?

0 votes

Quelle clé avez-vous ajouté dans info.plist ?

0 votes

Confidentialité - Description de l'utilisation de la photothèque

0 votes

Avez-vous essayé avec un simulateur ou un appareil ?

67voto

rickster Points 19870

Bon, vous pouvez déjà rassembler les éléments des réponses et des commentaires, mais pour essayer de raconter une histoire plus complète...


Dans iOS 11, UIImagePickerController fonctionne comme un processus distinct de votre application. Cela signifie que :

  1. Votre application ne peut pas voir l'ensemble de la bibliothèque Photos de l'utilisateur. Elle obtient un accès en lecture seule pour le ou les éléments choisis par l'utilisateur dans le sélecteur d'images.
  2. En raison de (1), votre application n'a pas besoin de l'autorisation standard de confidentialité pour accéder à la bibliothèque Photos. L'utilisateur choisit explicitement une ressource spécifique (ou plusieurs) pour l'utiliser dans votre application, ce qui signifie que l'utilisateur accorde à votre application la permission de lire la ou les ressources en question.

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

(Au fait, ce modèle correspond à ce que vous avez vu dans le cadre des contacts depuis iOS 9 ; si vous affichez le sélecteur de contacts, votre application ne reçoit qu'un dépôt unique d'informations sur le ou les contacts choisis par l'utilisateur, et non un accès permanent en lecture/écriture à la base de données des contacts, de sorte que le sélecteur de contacts ne nécessite pas d'autorisation spéciale de confidentialité).


PHPhotoLibrary et son statut d'autorisation reflètent l'autorisation globale de lecture/écriture pour l'accès aux photos que les utilisateurs peuvent contrôler dans Paramètres > Confidentialité. (C'est là que votre Info.plist a besoin de NSPhotoLibraryUsageDescription .) Toute utilisation du PHPhotoLibrary requiert cette autorisation, que votre application utilise cette API uniquement en écriture ou uniquement en lecture. Cela est vrai depuis l'introduction de PhotoKit dans iOS 8.

Si vous n'utilisez pas PHPhotoLibrary , PHAsset etc., il existe des options d'autorisation plus restreintes 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 générale des paramètres de confidentialité car chaque utilisation accorde un accès en lecture unique pour les actifs spécifiques choisis.
  • Si vous souhaitez uniquement ajouter de nouvelles ressources à la bibliothèque de photos, utilisez la fonction UIImageWriteToSavedPhotosAlbum ou UISaveVideoAtPathToSavedPhotosAlbum . Avec ceux-ci, vous pouvez mettre NSPhotoLibraryAddUsageDescription dans votre Info.plist - alors les paramètres de confidentialité du système indiqueront clairement à l'utilisateur qu'il ne vous donne pas l'autorisation de voir ou de modifier les ressources existantes, mais seulement d'en ajouter de nouvelles.

    Si l'utilisateur accorde une autorisation d'ajout, elle ne s'applique qu'à ces fonctions UIKit - en essayant d'utiliser PHPhotoLibrary demandera toujours (et exigera la clé Info.plist pour) un accès en lecture/écriture.

    Voir cette partie du discours de la WWDC17 pour en savoir plus sur le paramètre de confidentialité complémentaire.

3 votes

Je suivais le tutoriel "Start developing iOS Apps" en utilisant iOS 11 et je n'ai pas eu d'erreur alors que le tutoriel disait que j'aurais dû en avoir une. Cette réponse explique pourquoi c'est le cas :D

6voto

Gleb A. Points 291

Ce (nouveau) comportement fait me semblent logiques, voici pourquoi. Lorsque vous utilisez UIImagePickerController votre application n'a pas réellement accès à cualquier des photos. L'application ne voit que celle que l'utilisateur a choisie, au moment où il le fait ; et si l'utilisateur clique sur Annuler dans le sélecteur, aucune de ces photos ne devient disponible pour l'application.

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

Donc, si vous utilisez uniquement UIImagePickerController Je suggère pas en mélangeant les photos.

Avertissement : je n'ai pas entendu de déclaration officielle de la part des gens d'Apple. Ce fil du forum semble pertinente, peut-être aurons-nous une réponse là-bas. UPD : c'est là même idée.

De plus, si vous êtes assez diabolique, vous pouvez théoriquement manipuler UIImagePickerController la hiérarchie des vues au moment de l'exécution et examiner ce que l'utilisateur y voit. Mais c'est encore une fois à Apple de s'en occuper, nous devrions juste être gentils :-)

6voto

Tarun Tyagi Points 1581

Est-ce un comportement attendu ? - OUI.

Dans la documentation - https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable

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

Il vous indique si l'appareil 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 le moyen correct de vérifier cela.

3voto

LLIAJLbHOu Points 922

UIImagePickerController et PHPhotoLibrary sont responsables de différents domaines.

Vous devez vérifier les deux : le statut de l'authentification et la disponibilité de la source.

PHAuthorizationStatus

Informations sur l'application autorisation d'accès les photos de l'utilisateur bibliothèque.

isSourceTypeAvailable

Discussion

Parce qu'une source de média peut ne pas être présente ou être indisponible , les appareils ne prennent pas toujours en charge tous les types de sources.

Par exemple si vous tentez de choisir une image dans la bibliothèque de l'utilisateur et que la bibliothèque est vide, cette méthode renvoie false. De même, si l'appareil photo est déjà en cours d'utilisation, cette méthode renvoie un message d'erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X