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
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.
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.
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'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ş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 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.
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 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.
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.
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")")
}
}
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.
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)
}
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.
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.
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
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.
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.
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.
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, 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
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.
Ayrıca okuyun