Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

Info.plist'de verilen izinlerin kontrol edilmesi

0 oy
155 kez görüntülendi
20, Eylül, 2018 ios development kategorisinde sereisoglu tarafından soruldu

Info.plist'den kullanicinin galerisine erisim izni aldiktan sonra kullanici izni kaldirirsa, kullanicinin tekrardan izin vermesi icin nasil ayarlar kismina yonlendirilir? bunun kontrolu nasil saglanir? ve bu kontrolu nerede yapmaliyiz?

1 cevap

0 oy
20, Eylül, 2018 yasin tarafından cevaplandı
23, Eylül, 2018 sereisoglu tarafından seçilmiş
 
En İyi Cevap

Öncelikle Photos library'si ni import edelim.

import Photos

Daha sonra kayıt işlemini yaptırmak istediğin yerde veya dilersen uygulama ilk açıldığında, aşağıdaki şekilde authorization durumunu kontrol edebilir ve bir alert yardımıyla kullanıcının ayarlar sayfasına yönlendirilmesini sağlayabilirsin.
Bu tamamen kullanıcının insiyatifine bırakılması gereken bir durum, kullanıcı bunun için zorlanmamalı.

        // authorization durumunu blok içerisinde alabiliriz. Eğer info.plist'de gerekli key'leri ayarlamadan bu bloğu çağırırsan çökmeye neden olur.
        // O nedenle info.plist içerisinde gerekli camera rulosuna erişim keyleri ve açıklamalarını girmiş olmamız şart.
        PHPhotoLibrary.requestAuthorization { (auth) in
            if auth != PHAuthorizationStatus.authorized { // Eğer durum authorized değilse alert'le kullanıcının ayarlar sayfasına gidebilmesi için bir seçenek sunacağız.
                DispatchQueue.main.async { // ÖNEMLİ. Bu blok mainThread dışında çağrılıyor. Dolayısıyla önce mainThread'a geçiyoruz.
                    // alert'i hazırlayalım
                    let alertController:UIAlertController = UIAlertController(title: "Needs action!", message: "You have to grant permission to access your camera roll to save the images.", preferredStyle: UIAlertController.Style.alert)
                    // Alert penceresinde "Cancel" ve "Go to settings" diye iki buton yer alacak.
                    // "Go to settings" buton aksiyonunda launchSettingsPage fonksiyonunu çağıracağız.
                    let settingsAction:UIAlertAction = UIAlertAction(title: "Go to settings", style: UIAlertAction.Style.default) { (action:UIAlertAction) in
                        self.launchSettingsPage()
                    }
                    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)
                    alertController.addAction(cancelAction)
                    alertController.addAction(settingsAction)
                    self.present(alertController, animated: true, completion: nil)
                }                
            }
        }


    // UIApplication.openSettingsURLString string'i üzerinden uygulamanın cihaz ayarlarında yer alan izinler sayfasının URL string'ini elde ediyoruz.
    // IOS sürümüne göre openURL veya open metotlarını kullanarak kullanıcının uygulamadan çıkartılarak ilgili izinlerin yer aldığı sayfaya yönlendirilmesini sağlıyoruz.
    func launchSettingsPage() {
        guard let url = URL(string : UIApplication.openSettingsURLString) else {
            return
        }
        guard #available(iOS 10, *) else {
            UIApplication.shared.openURL(url)
            return
        }
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
21, Eylül, 2018 sereisoglu tarafından yorumlandı

Izin vermezsek bile galeriye giriyor?

import UIKit

import Photos

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imagePick: UIImageView!

    let imagePicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()

        imagePicker.delegate = self

        // authorization durumunu blok içerisinde alabiliriz. Eğer info.plist'de gerekli key'leri ayarlamadan bu bloğu çağırırsan çökmeye neden olur.
        // O nedenle info.plist içerisinde gerekli camera rulosuna erişim keyleri ve açıklamalarını girmiş olmamız şart.
        PHPhotoLibrary.requestAuthorization { (auth) in
            if auth != PHAuthorizationStatus.authorized { // Eğer durum authorized değilse alert'le kullanıcının ayarlar sayfasına gidebilmesi için bir seçenek sunacağız.
                DispatchQueue.main.async { // ÖNEMLİ. Bu blok mainThread dışında çağrılıyor. Dolayısıyla önce mainThread'a geçiyoruz.
                    // alert'i hazırlayalım
                    let alertController:UIAlertController = UIAlertController(title: "Needs action!", message: "You have to grant permission to access your camera roll to save the images.", preferredStyle: UIAlertController.Style.alert)
                    // Alert penceresinde "Cancel" ve "Go to settings" diye iki buton yer alacak.
                    // "Go to settings" buton aksiyonunda launchSettingsPage fonksiyonunu çağıracağız.
                    let settingsAction:UIAlertAction = UIAlertAction(title: "Go to settings", style: UIAlertAction.Style.default) { (action:UIAlertAction) in
                        self.launchSettingsPage()
                    }
                    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)
                    alertController.addAction(cancelAction)
                    alertController.addAction(settingsAction)
                    self.present(alertController, animated: true, completion: nil)
                }
            }
        }

    }

    // UIApplication.openSettingsURLString string'i üzerinden uygulamanın cihaz ayarlarında yer alan izinler sayfasının URL string'ini elde ediyoruz.
    // IOS sürümüne göre openURL veya open metotlarını kullanarak kullanıcının uygulamadan çıkartılarak ilgili izinlerin yer aldığı sayfaya yönlendirilmesini sağlıyoruz.
    func launchSettingsPage() {
        guard let url = URL(string : UIApplication.openSettingsURLString) else {
            return
        }
        guard #available(iOS 10, *) else {
            UIApplication.shared.openURL(url)
            return
        }
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }

    @IBAction func loadButton(_ sender: Any) {
        imagePicker.allowsEditing = true
        imagePicker.sourceType = .photoLibrary

        present(imagePicker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        if let pickedImage = info[.originalImage] as? UIImage {
            imagePick.image = pickedImage
        }
        dismiss(animated: true, completion: nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }

}
22, Eylül, 2018 yasin tarafından yorumlandı

Müsait değildim ancak bakabildim. Öncelikle cihaz'da mı, yoksa simulator'de mi deniyorsun.
Aynı uygulama için daha önce izin verdiysen ve sonra UIImagePickerController eklediysen daha önce verilen izine istinaden, tekrar bir izin alert'i ile karşılaşmayabilirsin. Uygulamayı silip tekrar yüklemeyi dene. Ayarlar sayfasından uygulamanın galeriye erişme izinlerini bir kontrol et.

22, Eylül, 2018 sereisoglu tarafından yorumlandı

Cihazda deniyorum. Uygulamayi silip yukledim yine farketmedi. Ayarlarda uygulamanin galeriye izni yok olarak gozukuyor. Hatta sizin kodlari silince, galeriye girince izin bile istemiyor.
(Info.plist'den Privacy - Photo Library Usage Description iznini ekledim.)

23, Eylül, 2018 yasin tarafından yorumlandı

Normalde ayarlarda erişim izini verilmemişse ulaşamaman lazım diye biliyorum. Ama tam emin olamadım ben de şimdi. Bir örnek hazırlayıp denemem lazım. İlginç bir durum.

23, Eylül, 2018 yasin tarafından yorumlandı

evet, denedim paylaştığın örneği.
Şöyle ki. IOS 11'den itibaren birşeyler değişmiş ImagePicker kullanımına dair.
Şurada güzel açıklamışlar.
https://stackoverflow.com/questions/46404628/ios11-photo-library-access-is-possible-even-if-settings-are-set-to-never/46594741#46594741
Özet olarak, UIImagePickerController uygulama içerisinde ayrı bir işlem olarak çalıştırılıyor.
Yani kullanıcı interaksiyonu olmaksızın uygulamanın camera roll'a direkt erişimi mümkün değil.
Dolayısıyla UIImagePickerController kullanımı privacy izinlerine tabi olmaktan çıkartılmış.
Ben de şimdi öğrendim.

23, Eylül, 2018 sereisoglu tarafından yorumlandı

Yani ne yapmam gerekiyor?

23, Eylül, 2018 yasin tarafından yorumlandı

Bir şey yapmana gerek yok işte.
Direkt seçebiliyorsun fotoğrafı.
UIImagePickerController kullanıyorsan info.plist'de bir izin açmana gerek yok. Aynı zamanda yukarıda paylaştığım izin verilip verilmediğini kontrol eden kısmı da projenden kaldırabilirsin.

Ama ilerleyen aşamalarda seçtiğin fotoğrafı cihaz kamera rulosuna kaydetmek gibi bir işlem yapacaksan, info.plist iznine ve bu izin kontrol mekanizmasına ihtiyacın olacaktır yine.

23, Eylül, 2018 sereisoglu tarafından yorumlandı

Yani ios 11’den itibaren cihazin galerisine erisebilmek icin kullanicidan izin istememize gerek yok mu? Kullanicidan izin almadan galeriye erismek yanlis bir sey degil mi?

23, Eylül, 2018 yasin tarafından yorumlandı

Erişen biz değiliz ama. Böyle küçük bir detay var.
Kullanıcının kendisi galeriye ulaşıp istediği fotoğrafı seçiyor ve uygulamaya aktarıyor.
Yani biz galeride ki herhangi bir fotoğrafa kafamıza göre ulaşamıyoruz.
Kullanıcının bunu kendi rızasıyla yapması lazım. Yani sorumluluk kendisinde.

23, Eylül, 2018 sereisoglu tarafından yorumlandı

Tamamdir anladim olayi.
Peki yukaridaki paylastiginiz kod hangi izinleri kapsiyor?

23, Eylül, 2018 yasin tarafından yorumlandı

İşte kamer rulosuna fotoğraf/video kaydetmek veya pickerview kullanmadan tüm içeriğe direkt olarak erişmek istersen bu izinlere ve kontrol mekanizmasına ihtiyacın olacaktır.

23, Eylül, 2018 sereisoglu tarafından yorumlandı

Pickerview kullanmadan baska neyle kullanicinin galerisine erisebiliriz?

24, Eylül, 2018 yasin tarafından yorumlandı

Photos framework'u ile direkt erişim sağlayabilirsin.

25, Eylül, 2018 sereisoglu tarafından yorumlandı

tesekkurler.

...