A névjegyek elérésének engedélyezése egy mobil operációs rendszerekben működő mechanizmus, amely a felhasználó kifejezett hozzájárulását követeli meg az eszköz címjegyzékének olvasása előtt. iOS-en a névjegyek elérése a CNContactStore-on keresztül történik, Androidon pedig a Contacts API-n és a runtime permissions rendszeren keresztül. A Apple Developer Documentation, 2025 szerint iOS 18-tól kezdve minden alkalmazásnak az egységes Contacts Access API-t kell használnia. A helyes implementáció növeli az alkalmazásboltok moderálása általi jóváhagyás esélyét.
Főbb pontok
A névjegyek elérésének engedélyezése egy operációs rendszer mechanizmus, amely megvédi a felhasználó címjegyzékét a harmadik féltől származó alkalmazások általi jogosulatlan olvasástól. Mobil operációs rendszerekben a névjegyek bizalmas adatoknak minősülnek, mivel neveket, telefonszámokat, e-mail címeket és fényképeket tartalmaznak a felhasználó környezetéből.
iOS-en az engedélyt a Contacts keretrendszer és a CNContactStore osztály szabályozza. A felhasználó az első hozzáférési kérésnél egy rendszer párbeszédablakot lát, ahol kiválaszthatja a hozzáférés megadását vagy a kérés elutasítását. Androidon a védelem a runtime permissions rendszeren alapul: az alkalmazás megadja a READ_CONTACTS-ot a manifestben, és futásidőben kéri le azt az ActivityResultLauncher vagy egy fragment segítségével az eredmény feldolgozásával.
A Statista (2025) adatai szerint az iOS-felhasználók több mint 68%-a és az Android-felhasználók 54%-a elutasítja a névjegyek elérését az első alkalmazáskérésnél. Ez azt jelenti, hogy a fejlesztőnek nemcsak helyesen kell implementálnia a kérést, hanem meg kell magyaráznia a felhasználónak a hozzáférés szükségességének okát is.
Iparági szabvány — csak akkor kérjen hozzáférést, amikor a funkció valóban szükséges, nem az első indításkor. Ez a megközelítés csökkenti az elutasítások arányát és javítja a felhasználói élményt.
Az Apple ökoszisztémájában a névjegyek elérését a Contacts keretrendszer szabályozza, amelyet iOS 9-ben vezettek be. A CNContactStore osztály metódusokat biztosít az engedély kéréséhez és az olvasási/írási műveletek végrehajtásához. Az requestAccess(for:) első meghívásakor a rendszer egy natív párbeszédablakot jelenít meg a hozzáférés okának magyarázatával.
iOS 17-től kezdve az Apple bevezette az egyszeri hozzáférés (single contact access) módot. A felhasználó kiválaszthat egy névjegyet a címjegyzékből, és átadhatja az alkalmazásnak anélkül, hogy felfedné a teljes adatbázist. A mód a CNContactPickerViewController segítségével valósul meg, és nem igényli az requestAccess(for:) meghívását.
A fejlesztőnek meg kell értenie: ha az alkalmazás teljes hozzáférést kér, de funkcionálisan egy névjegy is elegendő, az App Store moderátorai elutasíthatják a buildet. Az Apple App Review Guidelines (2025) 5.1.1 szakasza kifejezetten a minimálisan szükséges adatmennyiséget követeli meg.
Az iOS 18 megjelenésével az Apple szigorította a Privacy Manifest — a privacy.xcprivacy fájl követelményeit, amelyben a fejlesztő deklarálja a védett adatokhoz való hozzáférés okát. A névjegyekhez az NSContactsUsageDescription kulcsot használják lokalizált szöveggel, amely a rendszer párbeszédablakában jelenik meg.
Helyes privacy manifest nélkül az alkalmazás nem megy át az App Store Connect moderálásán. A leírás szövegének konkrétnak kell lennie: nem „A működés javításához”, hanem „Barátok kereséséhez telefonszám alapján”.
Androidon a névjegyek elérését a READ_CONTACTS engedély védi, amely a veszélyes (dangerous) kategóriába tartozik — futásidőben kell kérni, nem csak telepítéskor. A runtime permissions mechanizmust Android 6.0-ban (API 23) vezették be, és ez maradt a bizalmas adatok védelmének fő módja.
A READ_CONTACTS engedélyt a manifestben a uses-permission tag segítségével adják meg, a kódban pedig az ActivityResultLauncher vagy egy fragment segítségével kérik le az onRequestPermissionsResult segítségével. A felhasználó elutasíthatja a kérést, vagy kiválaszthatja a „Ne kérdezze többet” opciót, amely után az alkalmazásnak helyesen kell kezelnie az elutasítást.
Android 14-től (API 34) kezdve a runtime permissions viselkedése megváltozott: két egymást követő kérés elutasításakor az operációs rendszer automatikusan beállítja a neverAskAgain jelzőt. A Google Developer Documentation (2024) szerint a fejlesztőnek ellenőriznie kell az állapotot a shouldShowRequestPermissionRationale segítségével az újbóli kérés előtt.
A névjegyek olvasásához az Android a ContentProvider nevű ContactsContract-ot használja. Ez egy strukturált adatbázis, amely a ContentResolver segítségével érhető el. Az adatok több táblában vannak rendezve: Contacts (névjegyek), RawContacts (nyers rekordok különböző fiókokból), Data (részletes információ: telefonok, e-mail, címek).
A ContactsContract lekérdezése a ContactsContract.Contacts.CONTENT_URI URI-n keresztül történik. A fejlesztőnek minimális oszlopokat kell kérnie és projekciót kell használnia a mezők szűréséhez — ez felgyorsítja a lekérdezés végrehajtását és csökkenti a memória használatot.
A névjegyek elérésének kérésének gyakorlati implementációja eltér iOS-en és Androidon. Az alábbiakban konkrét példákat talál Swift és Kotlin nyelven az engedély összes lehetséges állapotának kezelésével.
iOS-en a kérés a CNContactStore osztály requestAccess metódusán keresztül történik. Az eredmény egy closure-ben kerül visszaadásra egy logikai értékkel és egy opcionális hibával. Az alábbi példa a teljes kérési ciklust mutatja be állapotkezeléssel.
import Contacts
let store = CNContactStore()
store.requestAccess(for: .contacts) { granted, error in
if granted {
print("Hozzáférés a névjegyekhez megtörtént")
// Névjegy műveletek végrehajtása
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("Hozzáférs elutasítva: \(error?.localizedDescription ?? "ismeretlen hiba")")
}
}
Androidon a kérés a ActivityResultLauncher segítségével történik a RequestPermission szerződéssel. Az alábbi példa a ContactsContract.ContentProvider-rel való munkát mutatja be az engedély megszerzése után.
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", "Contact: $name")
}
}
} else {
// A felhasználónak magyarázat a hozzáférés szükségességének okáról
showRationaleDialog()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissionLauncher.launch(android.Manifest.permission.READ_CONTACTS)
}
A tapasztalt mobilalkalmazás-fejlesztők bevált gyakorlatok sorát követik a névjegyek elérésének engedélyezésével való munka során. Ezek a szabályok segítenek átjutni az alkalmazásboltok moderálásán és megőrizni a felhasználók bizalmát. A legjobb gyakorlatok követése jelentősen leegyszerűsíti az alkalmazás közzétételi és karbantartási folyamatát.
Soha ne kérjen hozzáférést a névjegyekhez az alkalmazás első indításakor. Az első kérésnek egy adott funkció kontextusában kell történnie: barátok keresése, résztvevők meghívása, névjegyek importálása. Az a felhasználó, aki megérti a kérés okát, 2-3-szor gyakrabban járul hozzá, amint azt az Apptentive (2024) kutatása mutatja.
Ha a funkció elegendő egy névjegy eléréséhez — használja a CNContactPickerViewController-t iOS-en vagy az implicit intent ACTION_PICK-et Androidon. Ezek a módszerek nem igényelnek előzetes engedélyt, és lehetővé teszik a felhasználó számára, hogy önállóan válasszon rekordot anélkül, hogy a teljes címjegyzéket felfedné az alkalmazásnak.
Az alkalmazásnak helyesen kell kezelnie azt a helyzetet, amikor a felhasználó elutasította a kérést. iOS-en ellenőrizze az állapotot a CNContactStore.authorizationStatus(for:) segítségével, és szükség esetén irányítsa a felhasználót a Beállításokhoz. Androidon használja a shouldShowRequestPermissionRationale-t egy további magyarázat megjelenítéséhez az újbóli kérés előtt.
Soha ne jelenítsen meg ismételt párbeszédablakot közvetlenül az elutasítás után — ez agressziónak minősül, és csökkenti az alkalmazás értékelését. Legjobb gyakorlat: egy idő után jelenítsen meg egy képernyőt magyarázattal és egy „Ugrás a beállításokhoz” gombbal, amely Intent segítségével megnyitja a rendszer engedélyképernyőjét. Tesztelje az elutasítási forgatókönyvet valós eszközökön — a szimulátorok nem mindig reprodukálják helyesen a rendszerengedély-párbeszédablakok viselkedését.
Gyakran ismételt kérdések
Az alkalmazások a névjegyek elérését olyan funkciókhoz kérik, mint a barátok keresése, résztvevők meghívása, űrlapok automatikus kitöltése és a szerverrel való szinkronizálás. Példák: az üzenetküldők telefonszám alapján keresnek névjegyeket, a CRM alkalmazások importálják az ügyfeleket.
Egyszeri hozzáférés (iOS 17+) a CNContactPickerViewController segítségével lehetővé teszi a felhasználónak, hogy egy névjegyet válasszon ki a teljes címjegyzék felfedése nélkül. A teljes hozzáférés lehetővé teszi az alkalmazás számára, hogy a CNContactStore-on keresztül olvassa az eszköz összes névjegyét. Az egyszeri hozzáférés biztonságosabb, és nem igényli az NSContactsUsageDescription megadását a privacy manifest-ben.
iOS-en lépjen a Beállítások — Adatvédelem és biztonság — Névjegyek menüpontba, és kapcsolja ki a hozzáférést az adott alkalmazáshoz. Androidon nyissa meg a Beállítások — Alkalmazások — válassza ki az alkalmazást — Engedélyek — Névjegyek menüpontot, és válassza az „Elutasítás” lehetőséget.
Privacy Manifest (a privacy.xcprivacy fájl) — egy kötelező dokumentum iOS 18+ számára, amelyben a fejlesztő deklarálja a védett adatokhoz, köztük a névjegyekhez való hozzáférés okait. Az NSContactsUsageDescription kulcs tartalmazza a lokalizált leírást, amely az engedélykérés rendszer párbeszédablakában jelenik meg.
Az Android a READ_CONTACTS-ot veszélyes engedélyként (dangerous permission) osztályozza, mivel hozzáférést biztosít a felhasználó személyes adataihoz. Az Android 6.0-ban bevezetett runtime permissions mechanizmus futásidőben kifejezett hozzájárulást követel meg, nem csak az alkalmazás telepítésekor.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is