Mobil geliştirmede kişilere erişim izni — nedir, nasıl çalışır ve erişim talebi

Yazar: IT Sectr Yayınlanma: 2026-05-22 Okuma süresi: 8 dk

Kişilere erişim izni, cihazın adres defterini okumadan önce kullanıcının açık rızasını gerektiren bir mobil işletim sistemi mekanizmasıdır. iOS'ta kişilere erişim CNContactStore aracılığıyla yapılırken, Android'de Contacts API ve çalışma zamanı izin sistemi kullanılır. Apple Developer Documentation, 2025'e göre, iOS 18'den itibaren tüm uygulamalar birleşik Contacts Access API'yi kullanmak zorundadır. İzin talebinin doğru uygulanması, uygulama mağazası denetiminden onay alma şansını artırır.

Önemli Noktalar

  • Contacts Permission — iOS ve Android'de kullanıcı kişilerini okumak için gerekli izin.
  • CNContactStore — Contacts framework'ü aracılığıyla adres defterine erişmek için ana iOS sınıfı.
  • Runtime permission — READ_CONTACTS izninin çalışma zamanında talep edildiği Android modeli.
  • Privacy manifest — iOS 18+ için kişilere erişim nedenini açıklayan zorunlu dosya.
  • Tek kişi erişimi — Kullanıcının tüm adres defterini açıklamadan tek bir kişiye erişim izni vermesini sağlayan iOS 17+ modu.

Kişi erişim izni nedir?

Kişi erişim izni, kullanıcının adres defterini üçüncü taraf uygulamalar tarafından yetkisiz okumaya karşı koruyan bir işletim sistemi mekanizmasıdır. Mobil işletim sistemlerinde kişiler, kullanıcının çevresindeki kişilerin adlarını, telefon numaralarını, e-posta adreslerini ve fotoğraflarını içerdiğinden hassas veri olarak kabul edilir.

iOS'ta izin, Contacts framework'ü ve CNContactStore sınıfı tarafından düzenlenir. Kullanıcı ilk erişim talebinde, erişimi vermeyi veya reddetmeyi seçebileceği bir sistem iletişim kutusu görür. Android'de koruma, çalışma zamanı izin sistemine dayanır: uygulama manifest'te READ_CONTACTS bildirir ve ActivityResultLauncher veya sonucu işleyen bir fragment aracılığıyla çalışma zamanında talep eder.

Statista (2025)'ye göre, iOS kullanıcılarının %68'inden fazlası ve Android kullanıcılarının %54'ü ilk talepte kişi erişimini reddeder. Bu, geliştiricinin yalnızca talebi doğru şekilde uygulaması değil, aynı zamanda kullanıcıya erişimin neden gerekli olduğunu açıklaması gerektiği anlamına gelir.

Sektör standardı — ilk başlatmada değil, yalnızca işlevsellik gerçekten gerektiğinde erişim talep edin. Bu yaklaşım reddetme oranını düşürür ve kullanıcı deneyimini iyileştirir.

iOS'ta kişi erişim talebi nasıl çalışır

Apple ekosisteminde kişilere erişim, iOS 9'da tanıtılan Contacts framework'ü tarafından düzenlenir. CNContactStore sınıfı, izin talep etme ve okuma/yazma işlemlerini gerçekleştirme yöntemleri sağlar. requestAccess(for:) ilk çağrıldığında, sistem erişim nedenini açıklayan yerel bir iletişim kutusu görüntüler.

CNContactStore ve tek kişi erişimi

iOS 17'den itibaren Apple, tek kişi erişimi modunu tanıttı. Kullanıcı adres defterinden bir kişi seçebilir ve tüm veritabanını açıklamadan uygulamayla paylaşabilir. Bu mod, CNContactPickerViewController aracılığıyla uygulanır ve requestAccess(for:) çağrısı gerektirmez.

Geliştiricinin anlaması önemlidir: bir uygulama tam erişim talep ediyor ancak işlevsel olarak yalnızca bir kişiye ihtiyaç duyuyorsa, App Store denetçileri yapıyı reddedebilir. Apple App Review Guidelines (2025)'e göre, bölüm 5.1.1 açıkça minimum gerekli veri miktarını talep eder.

iOS 18'de Privacy Manifest

iOS 18'in yayınlanmasıyla Apple, Privacy Manifest (privacy.xcprivacy dosyası) gereksinimlerini sıkılaştırdı. Geliştirici bu dosyada korunan verilere erişim nedenini bildirir. Kişiler için, sistem iletişim kutusunda görüntülenen yerelleştirilmiş metinle birlikte NSContactsUsageDescription anahtarı kullanılır.

Doğru bir privacy manifest olmadan uygulama App Store Connect denetiminden geçemez. Açıklama metni spesifik olmalıdır: “Performansı iyileştirmek için” değil, “Telefon numarasıyla arkadaş bulmak için”.

Android'de kişi erişim talebi nasıl çalışır

Android'de kişilere erişim, tehlikeli kategorisine ait olan READ_CONTACTS izniyle korunur — yalnızca kurulum sırasında değil, çalışma zamanında talep edilmelidir. Çalışma zamanı izin mekanizması Android 6.0 (API 23)'te tanıtılmıştır ve hassas verileri korumanın birincil yolu olmaya devam etmektedir.

READ_CONTACTS ve çalışma zamanı izni

READ_CONTACTS izni manifest'te uses-permission etiketi aracılığıyla bildirilir ve kodda ActivityResultLauncher veya onRequestPermissionsResult içeren bir fragment aracılığıyla talep edilir. Kullanıcı talebi reddedebilir veya “Bir daha sorma” seçeneğini seçebilir, ardından uygulama reddi doğru şekilde işlemelidir.

Android 14 (API 34)'ten itibaren, çalışma zamanı izinlerinin davranışı değişti: art arda iki retten sonra, işletim sistemi otomatik olarak neverAskAgain bayrağını ayarlar. Google Developer Documentation (2024)'e göre, geliştirici yeniden talep etmeden önce shouldShowRequestPermissionRationale aracılığıyla durumu kontrol etmelidir.

ContactsContract ve ContentProvider

Kişileri okumak için Android, ContactsContract adlı bir ContentProvider kullanır. Bu, ContentResolver aracılığıyla erişilebilen yapılandırılmış bir veritabanıdır. Veriler birden çok tabloda düzenlenmiştir: Contacts (kişiler), RawContacts (farklı hesaplardan ham kayıtlar), Data (ayrıntılı bilgiler: telefonlar, e-postalar, adresler).

ContactsContract sorgusu URI ContactsContract.Contacts.CONTENT_URI aracılığıyla yapılır. Geliştirici minimum sütun sayısını talep etmeli ve alanları filtrelemek için projeksiyon kullanmalıdır — bu, sorgu yürütmesini hızlandırır ve bellek tüketimini azaltır.

Kişi talebi için kod örnekleri

Kişi erişim talebinin pratik uygulaması iOS ve Android arasında farklılık gösterir. Aşağıda, tüm olası izin durumlarının işlenmesiyle birlikte Swift ve Kotlin'deki somut örnekler verilmiştir.

Swift'te erişim talebi

iOS'ta talep, CNContactStore sınıfının requestAccess yöntemi aracılığıyla yapılır. Sonuç, bir boole değeri ve isteğe bağlı bir hata ile bir closure'da döndürülür. Aşağıdaki örnek, durum işleme ile birlikte tam talep döngüsünü gösterir.

swift
import Contacts

let store = CNContactStore()

store.requestAccess(for: .contacts) { granted, error in
    if granted {
        print("Kişi erişimi verildi")
        // Kişi işlemlerini yürütme
        let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
        let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
        try? store.enumerateContacts(with: request) { contact, stop in
            print("\(contact.givenName) \(contact.familyName)")
        }
    } else {
        print("Erişim reddedildi: \(error?.localizedDescription ?? "bilinmeyen hata")")
    }
}

Kotlin'de erişim talebi

Android'de talep, RequestPermission sözleşmesiyle ActivityResultLauncher aracılığıyla yapılır. Aşağıdaki örnek, izin alındıktan sonra ContactsContract.ContentProvider ile çalışmayı gösterir.

kotlin
val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            val uri = ContactsContract.Contacts.CONTENT_URI
            val cursor = contentResolver.query(uri, null, null, null, null)
            cursor?.use {
                val nameIndex = it.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)
                while (it.moveToNext()) {
                    val name = it.getString(nameIndex)
                    Log.d("Contacts", "Kişi: $name")
                }
            }
        } else {
            // Kullanıcıya erişim gerekliliğinin nedenini açıklayın
            showRationaleDialog()
        }
    }

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requestPermissionLauncher.launch(android.Manifest.permission.READ_CONTACTS)
}

Kişilerle çalışmak için en iyi uygulamalar

Deneyimli mobil uygulama geliştiricileri, kişi erişim izniyle çalışırken kanıtlanmış bir dizi en iyi uygulamayı takip eder. Bu kurallar, uygulama mağazası denetimini geçmeye ve kullanıcıların güvenini korumaya yardımcı olur. En iyi uygulamaları takip etmek, yayınlama ve bakım sürecini önemli ölçüde basitleştirir.

Talep edilen izinleri en aza indirin

Uygulamanın ilk başlatılmasında asla kişi erişimi talep etmeyin. İlk talep, belirli bir işlev bağlamında gerçekleşmelidir: arkadaş bulma, katılımcı davet etme, kişi içe aktarma. Talebin nedenini anlayan bir kullanıcı, Apptentive (2024) araştırmasına göre 2–3 kat daha sık onay verir.

İşlev yalnızca tek bir kişiye erişim gerektiriyorsa, iOS'ta CNContactPickerViewController veya Android'de örtük intent ACTION_PICK kullanın. Bu yöntemler önceden izin gerektirmez ve kullanıcının uygulamaya tüm adres defterini açıklamadan kendi kaydını seçmesine olanak tanır.

Erişim reddini işleme

Uygulama, kullanıcının erişimi reddettiği durumları doğru şekilde işlemelidir. iOS'ta, CNContactStore.authorizationStatus(for:) aracılığıyla durumu kontrol edin ve gerekirse kullanıcıyı Ayarlar'a yönlendirin. Android'de, yeniden talep etmeden önce ek açıklama göstermek için shouldShowRequestPermissionRationale kullanın.

Bir retten hemen sonra ikinci bir iletişim kutusu asla göstermeyin — bu saldırgan olarak algılanır ve uygulama puanını düşürür. En iyi uygulama: bir süre sonra, bir Intent aracılığıyla sistem izin ekranını açan bir açıklama ve “Ayarlar'a Git” düğmesi olan bir ekran gösterin. Reddetme senaryosunu gerçek cihazlarda test edin — simülatörler sistem izin iletişim kutularının davranışını her zaman doğru şekilde yeniden üretmez.

Sıkça Sorulan Sorular

Bir uygulamanın neden kişilere erişmesi gerekir?

Uygulamalar, arkadaş bulma, katılımcı davet etme, formları otomatik doldurma ve sunucu ile senkronizasyon gibi işlevler için kişi erişimi talep eder. Örnekler: mesajlaşma uygulamaları telefon numarasına göre kişi arar, CRM uygulamaları müşteri içe aktarır.

iOS'ta tek erişim ile tam erişim arasındaki fark nedir?

Tek kişi erişimi (iOS 17+), CNContactPickerViewController aracılığıyla kullanıcının tüm adres defterini açıklamadan bir kişi seçmesine olanak tanır. Tam erişim, uygulamanın CNContactStore aracılığıyla tüm cihaz kişilerini okumasına izin verir. Tek kişi erişimi daha güvenlidir ve privacy manifest'te NSContactsUsageDescription belirtmeyi gerektirmez.

Kişi izni nasıl iptal edilir?

iOS'ta Ayarlar — Gizlilik ve Güvenlik — Kişiler'e gidin ve belirli uygulama için erişimi kapatın. Android'de Ayarlar — Uygulamalar — uygulamayı seçin — İzinler — Kişiler'i açın ve “Reddet” seçeneğini seçin.

iOS 18'de privacy manifest nedir?

Privacy Manifest (privacy.xcprivacy dosyası), geliştiricinin kişiler dahil korunan verilere erişim nedenlerini bildirdiği iOS 18+ için zorunlu bir belgedir. NSContactsUsageDescription anahtarı, sistem izin talebi iletişim kutusunda görüntülenen yerelleştirilmiş bir açıklama içerir.

Android neden açık READ_CONTACTS talebi gerektiriyor?

Android, READ_CONTACTS'ı tehlikeli izin olarak sınıflandırır çünkü kullanıcının kişisel verilerine erişim sağlar. Android 6.0'da tanıtılan çalışma zamanı izin mekanizması, yalnızca uygulama kurulumu sırasında değil, çalışma zamanında açık rıza gerektirir.

Özet

  • Contacts Permission — iOS ve Android'de kullanıcının adres defterini okumak için gerekli izin.
  • CNContactStore — Contacts framework'ü aracılığıyla erişim talebi ve kişi işlemleri için ana iOS sınıfı.
  • Runtime permission — çalışma zamanında açık READ_CONTACTS talebi gerektiren Android 6.0+ mekanizması.
  • Privacy manifest — iOS 18+ için kişi erişim nedenlerini bildiren zorunlu dosya.
  • Tek kişi erişimi — kullanıcının veritabanını tamamen açıklamadan bir kişi seçmesini sağlayan iOS 17+ özelliği.
  • Veri minimizasyonu — ilk başlatmada değil, yalnızca gerçekten ihtiyaç duyulduğunda erişim talep edin.
  • Reddetme işleme — uygulama, çökmeden veya tekrar tekrar sormadan izin reddine uygun şekilde yanıt vermelidir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun