Ruxsatlar — so'rash, rad etilganda nima qilish

~12 daq · React Native · Qurilma imkoniyatlari

Muammodan boshlaylik

Ilova ochilishi bilan ketma-ket uchta oyna: "Kameraga ruxsat bering", "Joylashuvga ruxsat bering", "Bildirishnomalarga ruxsat bering". Foydalanuvchi hali ilova nima qilishini ham bilmaydi — va hammasiga "Ruxsat bermaslik" ni bosadi.

Endi u QR kod skanerlamoqchi — kamera ishlamaydi. Ilova esa qayta so'ray olmaydi: iOS ruxsatni faqat bir marta so'rashga imkon beradi.

Kamera, galereya, joylashuv, mikrofon, kontaktlar, bildirishnomalar — hammasi foydalanuvchi ruxsatini talab qiladi. Ruxsatni qachon va qanday so'rash — ilovaning muvaffaqiyatiga bevosita ta'sir qiladi.


Ruxsat holatlari

Holat Ma'nosi
undetermined Hali so'ralmagan
granted Ruxsat berilgan
denied Rad etilgan

Va muhim xususiyat — canAskAgain: yana so'rash mumkinmi?

  • iOS: rad etilgandan keyin — yo'q. Faqat Sozlamalar orqali
  • Android: bir-ikki marta rad etilgandan keyin — tizim so'rov oynasini ko'rsatmay qo'yadi

Expo dagi umumiy naqsh

Har bir Expo moduli bir xil API ga ega:

import * as Location from 'expo-location';

const { status, canAskAgain } = await Location.getForegroundPermissionsAsync();   // tekshirish
const natija = await Location.requestForegroundPermissionsAsync();                // so'rash

Hook variantlari:

import { useCameraPermissions } from 'expo-camera';

const [ruxsat, soraRuxsat] = useCameraPermissions();
// ruxsat?.granted, ruxsat?.canAskAgain, ruxsat?.status

To'g'ri so'rash: kontekstda va tushuntirib

Qoida 1 — kerak bo'lganda so'rang. Ilova ochilganda emas — foydalanuvchi "QR skanerlash" tugmasini bosganda. U nima uchun kamera kerakligini o'zi tushunadi.

Qoida 2 — avval o'zingiz tushuntiring. Tizim oynasidan oldin ilovaning o'z ekrani:

import { useCameraPermissions } from 'expo-camera';
import { Linking, View, Text } from 'react-native';

export default function Skaner() {
  const [ruxsat, soraRuxsat] = useCameraPermissions();

  if (!ruxsat) return null;                      // holat hali yuklanmoqda

  if (!ruxsat.granted) {
    return (
      <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 32, gap: 16 }}>
        <Ionicons name="camera-outline" size={64} color="#0284c7" />
        <Text style={{ fontSize: 20, fontWeight: '700', textAlign: 'center' }}>Kameraga ruxsat kerak</Text>
        <Text style={{ textAlign: 'center', color: '#475569' }}>
          Mahsulot ustidagi QR kodni skanerlash uchun kameradan foydalanamiz. Rasmlar saqlanmaydi.
        </Text>

        {ruxsat.canAskAgain ? (
          <Tugma matn="Ruxsat berish" onPress={soraRuxsat} />
        ) : (
          <Tugma matn="Sozlamalarni ochish" onPress={() => Linking.openSettings()} />
        )}
      </View>
    );
  }

  return <KameraKorinishi />;
}

Uch holat:

  1. So'ralmagan / qayta so'rash mumkin — tushuntirish + "Ruxsat berish" → tizim oynasi
  2. Butunlay rad etilgan — "Sozlamalarni ochish" → Linking.openSettings() ilovaning tizim sozlamalariga olib boradi
  3. Ruxsat berilgan — asosiy funksiya

Foydalanuvchi hech qachon "o'lik" holatda qolmaydi.


app.json — tizim oynasidagi matn

iOS talab qiladi: har bir ruxsat uchun tizim oynasida ko'rinadigan tushuntirish. Busiz — ilova so'rov paytida yopiladi, App Store esa uni rad etadi.

{
  "expo": {
    "plugins": [
      ["expo-camera", {
        "cameraPermission": "Mahsulot QR kodini skanerlash uchun kamera kerak."
      }],
      ["expo-location", {
        "locationWhenInUsePermission": "Eng yaqin do'konni va yetkazib berish manzilini aniqlash uchun."
      }],
      ["expo-image-picker", {
        "photosPermission": "Profil rasmini tanlash uchun galereyaga kirish kerak."
      }]
    ]
  }
}

Matn — aniq va foydalanuvchi foydasini tushuntirsin. "Ilova kameradan foydalanadi" — yomon. "Mahsulot QR kodini skanerlash uchun" — yaxshi. Apple ko'rib chiqishda noaniq matnlarni rad etadi.

Plagin qo'shilgandan keyin — Expo Go da ishlaydi, lekin to'liq sinov va production uchun yangi build kerak (48-dars).


Android ruxsatlari

Android da ruxsatlar app.json dagi android.permissions ro'yxatida. Expo plaginlari kerakli ruxsatlarni o'zi qo'shadi. Keraksizlarini olib tashlash:

"android": {
  "blockedPermissions": ["android.permission.RECORD_AUDIO"]
}

Google Play ilovadagi har bir ruxsatni ko'rsatadi va ba'zilari (fon joylashuvi, SMS) uchun alohida asoslash talab qiladi. Faqat kerakli ruxsatlarni so'rang.


Rad etishni hurmat qiling

  • Rad etilsa — ilova ishlashda davom etsin. Kamera rad etildi — QR kodni qo'lda kiritish imkoniyati
  • Har safar qayta-qayta so'ramang — bezovta qiladi
  • Joylashuv rad etildi — shaharni ro'yxatdan tanlash
  • Bildirishnomalar rad etildi — muhim xabarlar ilova ichida baribir ko'rinsin

Nima uchun shunday?

Nima uchun iOS ruxsatni faqat bir marta so'rashga imkon beradi?

Foydalanuvchini himoya qilish uchun. Agar ilovalar cheksiz so'ray olsa — ular foydalanuvchi "charchab", rozilik berguncha so'raverardi. Bir marta so'rash qoidasi ilovalarni to'g'ri vaqtda va asosli so'rashga majbur qiladi. Natijada foydalanuvchi ruxsatni ongli ravishda beradi va ilovaga ko'proq ishonadi. Shuning uchun "avval o'z ekraningizda tushuntiring" usuli shunchalik muhim — tizim oynasi yagona imkoniyat.


Xulosa

Eslab qoling:

  • Holatlar: undetermined, granted, denied; canAskAgain — yana so'rash mumkinmi
  • Kerak bo'lganda so'rang, ilova ochilganda emas
  • Avval o'z ekraningizda tushuntiring, keyin tizim oynasi
  • Butunlay rad etilgan — Linking.openSettings()
  • app.json plaginlarida aniq tushuntirish matnlari — iOS uchun majburiy
  • Faqat kerakli ruxsatlar; rad etilsa ham ilova ishlasin

Keyingi dars

39-dars: Kamera — expo-camera, QR kod skaner