Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.5k kez görüntülendi
ios development kategorisinde tarafından

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
tarafından
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)
    }
tarafından

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)
    }

}
tarafından

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.

tarafından

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.)

tarafından

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.

tarafından

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.

tarafından

Yani ne yapmam gerekiyor?

tarafından

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.

tarafından

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?

tarafından

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.

tarafından

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

tarafından

İş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.

tarafından

Pickerview kullanmadan baska neyle kullanicinin galerisine erisebiliriz?

tarafından

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

tarafından

tesekkurler.

...