Kontaktlara giriş icazəsi cihazın ünvan kitabçasını oxumadan əvvəl istifadəçinin açıq razılığını tələb edən mobil ƏS mexanizmidir. iOS-da kontaktlara giriş CNContactStore vasitəsilə, Android-də isə Contacts API və runtime permissions sistemi ilə həyata keçirilir. Apple Developer Documentation, 2025-ə görə, iOS 18-dən etibarən bütün tətbiqlər vahid Contacts Access API-dən istifadə etməlidir. Düzgün icra icazə sorğusu tətbiq mağazalarının moderası tərəfindən təsdiqlənmə şansını artırır.
Əsas məqamlar
Kontaktlara giriş icazəsi istifadəçinin ünvan kitabçasını üçüncü tərəf tətbiqləri tərəfindən icazəsiz oxunmadan qoruyan əməliyyat sistemi mexanizmidir. Mobil ƏS-lərdə kontaktlar məxfi məlumatlar hesab olunur, çünki onlar istifadəçinin ətrafındakı insanların adlarını, telefon nömrələrini, e-poçt ünvanlarını və fotolarını ehtiva edir.
iOS-da icazə Contacts framework və CNContactStore sinfi tərəfindən tənzimlənir. İstifadəçi ilk giriş sorğusunda sistem dialoqunu görür, burada girişi təmin edə və ya sorğunu rədd edə bilər. Android-də qorunma runtime permissions sisteminə əsaslanır: tətbiq manifestdə READ_CONTACTS-i qeyd edir və icra zamanı ActivityResultLauncher və ya nəticənin işlənməsi ilə fraqment vasitəsilə onu sorğulayır.
Statista (2025) məlumatlarına görə, iOS istifadəçilərinin 68%-dən çoxu və Android istifadəçilərinin 54%-i ilk tətbiq sorğusunda kontaktlara girişi rədd edir. Bu o deməkdir ki, tərtibatçı təkcə sorğunu düzgün icra etməməli, həm də istifadəçiyə giriş ehtiyacının səbəbini izah etməlidir.
Sənaye standartı — girişi yalnız funksionallıq həqiqətən tələb olunduqda sorğulamaq, ilk işə salınmada deyil. Bu yanaşma imtina faizini azaldır və istifadəçi təcrübəsini yaxşılaşdırır.
Apple ekosistemində kontaktlara giriş iOS 9-da təqdim edilmiş Contacts framework tərəfindən tənzimlənir. CNContactStore sinfi icazə sorğusu və oxuma/yazma əməliyyatları üçün metodlar təqdim edir. requestAccess(for:) ilk çağırışında sistem giriş səbəbinin izahı ilə native dialoq göstərir.
iOS 17-dən başlayaraq, Apple birdəfəlik giriş (single contact access) rejimini təqdim etdi. İstifadəçi ünvan kitabçasından bir kontakt seçib tətbiqə ötürə bilər, bütün bazanı açıqlamadan. Rejim CNContactPickerViewController vasitəsilə həyata keçirilir və requestAccess(for:) çağırışını tələb etmir.
Tərtibatçı başa düşməlidir: əgər tətbiq tam giriş tələb edirsə, lakin funksional olaraq bir kontakt kifayət edirsə, App Store moderatorları build-i rədd edə bilər. Apple App Review Guidelines (2025), bölmə 5.1.1, açıq şəkildə minimum zəruri məlumat həcmini tələb edir.
iOS 18-in buraxılması ilə Apple Privacy Manifest — privacy.xcprivacy faylına tələbləri sərtləşdirdi, burada tərtibatçı qorunan məlumatlara giriş səbəbini bəyan edir. Kontaktlar üçün sistem dialoqunda göstərilən lokallaşdırılmış mətnlə NSContactsUsageDescription açarı istifadə olunur.
Düzgün privacy manifest olmadan tətbiq App Store Connect moderasından keçmir. Təsvir mətni konkret olmalıdır: “İşin yaxşılaşdırılması üçün” deyil, “Telefon nömrəsi ilə dostların axtarılması üçün”.
Android-də kontaktlara giriş təhlükəli (dangerous) kateqoriyasına aid READ_CONTACTS icazəsi ilə qorunur — onu təkcə quraşdırma zamanı deyil, icra zamanı da sorğulamaq lazımdır. Runtime permissions mexanizmi Android 6.0 (API 23)-də təqdim edilmişdir və məxfi məlumatların qorunmasının əsas üsulu olaraq qalır.
READ_CONTACTS icazəsi manifestdə uses-permission teqi vasitəsilə göstərilir və kodda ActivityResultLauncher və ya onRequestPermissionsResult ilə fraqment vasitəsilə sorğulanır. İstifadəçi sorğunu rədd edə və ya “Bir daha soruşma” seçimini seçə bilər, bundan sonra tətbiq imtinanı düzgün emal etməlidir.
Android 14-dən (API 34) başlayaraq, runtime permissions davranışı dəyişdi: ardıcıl iki sorğu rədd edildikdə, ƏS avtomatik olaraq neverAskAgain bayrağını təyin edir. Google Developer Documentation (2024)-ə görə, tərtibatçı təkrar sorğudan əvvəl shouldShowRequestPermissionRationale vasitəsilə statusu yoxlamalıdır.
Kontaktları oxumaq üçün Android ContactsContract adlı ContentProvider-dən istifadə edir. Bu, ContentResolver vasitəsilə əldə edilə bilən strukturlaşdırılmış verilənlər bazasıdır. Məlumatlar bir neçə cədvəldə təşkil olunub: Contacts (kontaktlar), RawContacts (müxtəlif hesablardan xam qeydlər), Data (ətraflı məlumat: telefonlar, e-poçt, ünvanlar).
ContactsContract sorğusu ContactsContract.Contacts.CONTENT_URI vasitəsilə yerinə yetirilir. Tərtibatçı minimum sütun tələb etməli və sahələri filtrləmək üçün proyeksiyadan istifadə etməlidir — bu sorğunun icrasını sürətləndirir və yaddaş istehlakını azaldır.
Kontaktlara giriş sorğusunun praktiki icrası iOS və Android-də fərqlənir. Aşağıda Swift və Kotlin dillərində icazənin bütün mümkün vəziyyətlərinin işlənməsi ilə konkret nümunələr verilmişdir.
iOS-da sorğu CNContactStore sinfinin requestAccess metodu vasitəsilə yerinə yetirilir. Nəticə boolean dəyəri və isteğe bağlı xəta ilə closure-da qaytarılır. Aşağıdakı nümunə statusun işlənməsi ilə tam sorğu dövrünü nümayiş etdirir.
import Contacts
let store = CNContactStore()
store.requestAccess(for: .contacts) { granted, error in
if granted {
print("Kontaktlara giriş əldə edildi")
// Kontakt əməliyyatlarının yerinə yetirilməsi
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("Giriş rədd edildi: \(error?.localizedDescription ?? "naməlum xəta")")
}
}
Android-də sorğu RequestPermission kontraktı ilə ActivityResultLauncher vasitəsilə yerinə yetirilir. Aşağıdakı nümunədə icazə alındıqdan sonra ContactsContract.ContentProvider ilə iş göstərilir.
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 {
// İstifadəçiyə giriş ehtiyacının səbəbini izah etmək
showRationaleDialog()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissionLauncher.launch(android.Manifest.permission.READ_CONTACTS)
}
Təcrübəli mobil tətbiq tərtibatçıları kontaktlara giriş icazəsi ilə işləyərkən bir sıra sübut edilmiş təcrübələrə əməl edirlər. Bu qaydalar tətbiq mağazalarının moderasından keçməyə və istifadəçilərin etibarını qorumağa kömək edir. Ən yaxşı təcrübələrə riayət etmək nəşr və tətbiqə dəstək prosesini əhəmiyyətli dərəcədə asanlaşdırır.
Heç vaxt tətbiqin ilk işə salınmasında kontaktlara giriş tələb etməyin. İlk sorğu konkret funksiya kontekstində baş verməlidir: dostların axtarışı, iştirakçıların dəvəti, kontaktların idxalı. Sorğunun səbəbini anlayan istifadəçi Apptentive (2024) tədqiqatlarının göstərdiyi kimi 2-3 dəfə daha tez razılaşır.
Funksionallıq bir kontakt üçün kifayət edirsə — iOS-da CNContactPickerViewController və ya Android-də implicit intent ACTION_PICK istifadə edin. Bu üsullar əvvəlcədən icazə tələb etmir və istifadəçiyə tətbiqə bütün ünvan kitabçasını açıqlamadan müstəqil olaraq qeyd seçməyə imkan verir.
Tətbiq istifadəçi sorğunu rədd etdikdə vəziyyəti düzgün emal etməlidir. iOS-da statusu CNContactStore.authorizationStatus(for:) vasitəsilə yoxlayın və lazım gəldikdə istifadəçini Parametrlərə yönləndirin. Android-də təkrar sorğudan əvvəl əlavə izahat göstərmək üçün shouldShowRequestPermissionRationale istifadə edin.
İmtinadan dərhal sonra təkrar dialoq göstərməyin — bu aqressiya kimi qəbul edilir və tətbiqin reytinqini aşağı salır. Ən yaxşı təcrübə: bir müddət sonra izahat və “Parametrlərə keç” düyməsi olan ekran göstərin, bu Intent vasitəsilə sistem icazə ekranını açır. İmtina ssenarisini real cihazlarda test edin — simulyatorlar həmişə sistem icazə dialoqlarının davranışını düzgün əks etdirmir.
Tez-tez verilən suallar
Tətbiqlər dost axtarışı, iştirakçı dəvəti, formaların avtomatik doldurulması və server ilə sinxronizasiya funksiyaları üçün kontaktlara giriş tələb edir. Nümunələr: messencerlər telefon nömrəsi ilə kontakt axtarır, CRM tətbiqləri müştəriləri idxal edir.
Birdəfəlik giriş (iOS 17+) CNContactPickerViewController vasitəsilə istifadəçiyə bütün ünvan kitabçasını açmadan bir kontakt seçməyə imkan verir. Tam giriş tətbiqə CNContactStore vasitəsilə cihazın bütün kontaktlarını oxumağa icazə verir. Birdəfəlik giriş daha təhlükəsizdir və privacy manifest-də NSContactsUsageDescription göstərilməsini tələb etmir.
iOS-da Parametrlər — Məxfilik və təhlükəsizlik — Kontaktlar bölməsinə keçin və konkret tətbiq üçün girişi söndürün. Android-də Parametrlər — Tətbiqlər — tətbiqi seçin — İcazələr — Kontaktlar bölməsini açın və “Rədd et” seçin.
Privacy Manifest (privacy.xcprivacy faylı) — iOS 18+ üçün məcburi sənəddir, burada tərtibatçı kontaktlar da daxil olmaqla qorunan məlumatlara giriş səbəblərini bəyan edir. NSContactsUsageDescription açarı icazə sorğusunun sistem dialoqunda göstərilən lokallaşdırılmış təsviri ehtiva edir.
Android READ_CONTACTS-i təhlükəli icazə (dangerous permission) kimi təsnif edir, çünki o, istifadəçinin şəxsi məlumatlarına giriş verir. Android 6.0-da təqdim edilmiş runtime permissions mexanizmi təkcə tətbiqin quraşdırılması zamanı deyil, icra zamanı da açıq razılıq tələb edir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun