Ana Sayfa / Blog / iOS Camera ve Photos framework: doğru yetki akışı

iOS Camera ve Photos framework: doğru yetki akışı

Kamera ve fotoğraf izinlerini yanlış istemek uygulamanızı reject ettirir ya da kullanıcıyı kaçırır. Başıma gelenlerle birlikte doğru akışı paylaştım.

App Store reddini yaşadım, sebep kamera iznini gereksiz yere istemekti. Kullanıcı kayıt ekranında profil fotoğrafı için kamera iznini sormuştuk, ama kullanıcı “fotoğraf seçmek istemiyorum” diyerek atladığında da uygulama izin istemeye devam ediyordu. Reviewer reddetti. Haklıydı.

iOS’ta kamera ve fotoğraf izinleri en sık yanlış uygulanan alanlardan biri. Doğru akış ne olmalı, paylaşayım.

Temel kural: “kullanıcı yapmak istiyor ki sor”

İzin, kullanıcının bir aksiyon aldığı anda istenmeli. “Uygulama açıldığında soralım, lazım olursa hazır olsun” diye sormak hem kötü deneyim, hem App Store rehberlerinde açıkça yasak.

Yani:
– Kullanıcı profil fotoğrafına dokunur.
– Bir action sheet çıkar: “Kamera”, “Galeri”, “İptal”.
– Kullanıcı “Kamera”yı seçer.
– İşte o zaman kamera iznini iste.

Info.plist string’leri

Üç string’i doğru yazmak şart, yanlış yazılınca review’da geri dönüyor:

  • NSCameraUsageDescription: “Profil fotoğrafınızı çekebilmek için kameraya erişmemiz gerekiyor.”
  • NSPhotoLibraryUsageDescription: “Seçtiğiniz fotoğrafları ekleyebilmek için galerinize erişmemiz gerekiyor.”
  • NSPhotoLibraryAddUsageDescription: “Oluşturduğunuz içerikleri galerinize kaydedebilmek için izin gerekiyor.”

Üç string’i karıştırmayın. Sadece kaydediyorsanız (add) tam erişim değil, sadece add izni isteyin. Daha az izin hem kullanıcıyı rahatlatır hem review geçer.

Stringler somut ve şeffaf olmalı. “Fonksiyonelliği desteklemek için” gibi belirsiz ifadeler reject sebebi.

Yeni Photos izin modeli (iOS 14+)

Photos için üç durum var:
authorized: tam erişim.
limited: kullanıcı belirli fotoğraflara erişim verdi.
denied / notDetermined: erişim yok.

Limited akıllı kullanılmalı. Kullanıcı bazı fotoğrafları seçtiyse uygulamanız sadece onları görmeli. PHPickerViewController kullanıyorsanız Apple bu konuda sizi kurtarıyor, UI zaten doğru davranıyor. PHPhotoLibrary ile manuel erişiyorsanız:

PHPhotoLibrary.shared().register(observer)
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
  switch status {
  case .authorized, .limited: showPicker()
  case .denied, .restricted: showPermissionDeniedGuide()
  case .notDetermined: break
  @unknown default: break
  }
}

PHPickerViewController: izinsiz çalışan alternatif

iOS 14’ten beri PHPickerViewController varsa hiç Photos izni istemeden fotoğraf seçtirebilirsiniz. Kullanıcı picker içinden fotoğraf seçer, uygulamanız sadece seçileni alır. İzin diyaloğu çıkmaz bile.

Sadece fotoğraf seçtirmek istiyorsanız PHPickerViewController’a geçin. Review deneyiminiz de düzelir çünkü Apple az izin isteyen uygulamaları tercih ediyor.

var config = PHPickerConfiguration()
config.selectionLimit = 1
config.filter = .images
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
present(picker, animated: true)

Kamera izin akışı

Kamera için alternatif yok, AVCaptureDevice.requestAccess(for: .video) gerek. Ama şu noktalara dikkat:

  1. İlk kamera kullanımında iste. Uygulama açılışında isteme.
  2. Kullanıcı reddederse ikinci kez yine reddederse aynı diyalog çıkmaz, iOS sessiz döner. Uygulama bunu tespit etmeli: Settings’e yönlendirme ekranı gösterin. “Ayarlar’dan kamera iznini verebilirsiniz” + UIApplication.openSettingsURLString linki.
  3. Permission sonucu ana thread’de işleyin. requestAccess completion arka thread’de geliyor.

Pre-prompt (yumuşak istek)

Reject’ten sonra tekrar izin isteyemediğiniz için ilk isteği kaybetmeyin. Yumuşak bir pre-prompt gösterebilirsiniz.

  • “Profil fotoğrafı eklemek için kameraya erişmek istiyoruz. Devam edelim mi?”
  • Evet derse sistem diyaloğu çıkar.
  • Hayır derse sistem diyaloğunu hiç açmayız, durumu bozmayız.

Böylece kullanıcı hazır olmadığında “denied” statüsüne kaymıyor, istediğinde yeniden deneyebiliyor.

Review için kontrol listesi

  • Info.plist string’leri somut ve dürüst mü?
  • İzin kullanıcının aksiyonu sırasında mı isteniyor?
  • Minimum izin mi isteniyor (PHPicker gibi)?
  • Reddedildiğinde kullanıcıya yol gösteriliyor mu?
  • Limited mode davranışı test edildi mi?
  • Background ekran kaydı için kamera ışığı (iOS 14’ten itibaren yeşil nokta görünmeli) test edildi mi?

Bir ekstra öneri, simulator’de Camera yok. Kamera akışını fiziksel cihazda test edin. Simulator’de test edenler limited mode’u yakalayamıyor, prod’a buglı gidiyor.

Kamera ve Photos framework’ü detaylıca anlatan Apple dokümanlarını düzenli takip etmek de işe yarıyor, çünkü her iOS versiyonunda ince değişiklikler oluyor. iOS 17’de limited mode daha da konservatif oldu, iOS 18’de Photos picker optimizasyonları geldi. Güncel kalmak gerekiyor.

Bu konuda bir projeniz mi var?

Kısa bir özet bırakın, 24 saat içinde size dönüş yapayım.

İletişime Geç