Mobil inkişafda kontaktlara giriş icazəsi — bu nədir, necə işləyir və giriş sorğusu

Müəllif: IT Sectr Dərc olunub: 2026-05-22 Oxuma vaxtı: 8 dəq

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

  • Contacts Permission — iOS və Android-də istifadəçi kontaktlarını oxumaq üçün məcburi icazə.
  • CNContactStore — Contacts framework vasitəsilə ünvan kitabçasına giriş üçün əsas iOS sinfi.
  • Runtime permission — Android modeli, burada READ_CONTACTS icazəsi icra zamanı sorğulanır.
  • Privacy manifest — iOS 18+ üçün məcburi fayl, kontaktlara giriş səbəbini təsvir edir.
  • Birdəfəlik giriş — iOS 17+ rejimi, istifadəçiyə ünvan kitabçasını tam açmadan bir kontaktı paylaşmağa imkan verir.

Kontaktlara giriş icazəsi nədir?

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.

iOS-da kontaktlara giriş sorğusu necə işləyir

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.

CNContactStore və birdəfəlik giriş

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-də Privacy manifest

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ş sorğusu necə işləyir

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 və runtime permission

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.

ContactsContract və ContentProvider

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.

Kontakt sorğusu üçün kod nümunələri

Kontaktlara giriş sorğusunun praktiki icrası iOS və Android-də fərqlənir. Aşağıda SwiftKotlin 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.

Swift-də giriş sorğusu

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.

swift
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")")
    }
}

Kotlin-də giriş sorğusu

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.

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", "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)
}

Kontaktlarla iş üçün ən yaxşı təcrübələr

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.

Tələb olunan icazələrin minimuma endirilməsi

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.

Girişdən imtinanın işlənməsi

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ətbiqin kontaktlara girişi nə üçün lazımdır?

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.

iOS-da birdəfəlik və tam giriş arasında nə fərq var?

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.

Kontakt icazəsini necə ləğv etmək olar?

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.

iOS 18-də privacy manifest nədir?

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.

Niyə Android READ_CONTACTS-in açıq şəkildə sorğulanmasını tələb 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ə

  • Contacts Permission — iOS və Android-də istifadəçinin ünvan kitabçasını oxumaq üçün məcburi icazə.
  • CNContactStore — Contacts framework vasitəsilə giriş sorğusu və kontakt əməliyyatları üçün əsas iOS sinfi.
  • Runtime permission — Android 6.0+ mexanizmi, icra zamanı READ_CONTACTS-in açıq sorğusunu tələb edir.
  • Privacy manifest — iOS 18+ üçün kontaktlara giriş səbəblərinin bəyannaməsi ilə məcburi fayl.
  • Birdəfəlik giriş — iOS 17+ funksiyası, bazanı tam açmadan bir kontakt seçməyə imkan verir.
  • Məlumatların minimuma endirilməsi — girişi yalnız real ehtiyac anında sorğulamaq, ilk işə salınmada yox.
  • İmtinanın işlənməsi — tətbiq sorğunun rədd edilməsinə çökmədən və ya təkrar təklif etmədən düzgün reaksiya verməlidir.

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.

Layihəni müzakirə et

Həm də oxuyun