Sobes.tech
Junior

Дар барномаи Flutter кадом намудҳои иҷозат вуҷуд доранд?

sobes.tech AI

Ҷавоб аз AI

Иҷозатҳо дар барномаҳои Flutter аз ҷониби системаи оператсионӣ (Android ё iOS) идора мешаванд. Flutter дастрасӣ ба API-ҳои мувофиқро барои дархост ва санҷиши ин иҷозатҳоро медиҳад.

Типҳои асосии иҷозатҳо:

  • Иҷозатҳо дар вақти насб (Install-time permissions): Автоматӣ дар вақти насб дода мешаванд. Дар вақти кор дар барнома талаб намекунад. Дар Android ба категорияҳои normal ва signature мансубанд.
  • Иҷозатҳо дар вақти иҷро (Runtime permissions): Иҷозатҳои муҳим ва ҳассос, монанди дастрасӣ ба ҷойгиршавӣ, камера, микрофон, тамосҳо ва файлҳо. Дар вақти кор дар барнома талаб карда мешаванд. Корбар метавонад чунин иҷозатро диҳад ё рад кунад. Дар Android ба категорияи dangerous мансубанд.
  • Иҷозатҳои махсус (Special permissions): Иҷозатҳое, ки барои додан ба онҳо муносибати махсус бо корбар талаб мешавад, масалан, иҷозат барои расмкашӣ болои дигар тирезаҳо (ACTION_MANAGE_OVERLAY_PERMISSION) ё навишт ба танзимоти системӣ (WRITE_SETTINGS).

Flutter аз плагинҳо барои муошират бо API-ҳои платформа ва идоракунии иҷозатҳо истифода мебарад. Плагинҳои маъмул permission_handler мебошанд.

Дар истифодаи permission_handler ҳолатҳои иҷозатҳо чунинанд:

  • granted: Иҷозат дода шудааст.
  • denied: Иҷозат рад карда шудааст (мумкин аст боз такрор шавад).
  • restricted: Иҷозат аз ҷониби платформа маҳдуд шудааст.
  • permanentlyDenied: Иҷозат ба таври доим рад карда шудааст, лозим аст корбарро ба танзимоти барнома равон кардан.
  • limited: Иҷозат қисман дода шудааст (масалан, танҳо ба суратҳояи интихобшуда дар iOS).

Масалан, дархости иҷозат барои дастрасӣ ба камера:

import 'package:permission_handler/permission_handler.dart';

// Функсияи асинхронӣ барои дархости иҷозат
Future<void> requestCameraPermission() async {
  // Дарёфти статуси иҷозат
  var status = await Permission.camera.status;
  // Агар иҷозат ҳанӯз дода нашуда бошад
  if (status.isDenied) {
    // Дархост барои иҷозат
    status = await Permission.camera.request();
    // Санҷиши статус пас аз дархост
    if (status.isGranted) {
      // Иҷозат дода шуд, метавон камераро истифода бурд
      print('Иҷозат барои камера дода шуд');
    } else if (status.isPermanentlyDenied) {
      // Иҷозат ба таври доим рад шуд, корбарро ба танзимотҳо мебарем
      print('Иҷозат барои камера ба таври доим рад шуд, бояд танзимотҳоро кушоед');
      openAppSettings(); // Функсияи permission_handler
    } else {
      // Иҷозат рад шуд, аммо метавон боз такрор кард
      print('Иҷозат барои камера рад шуд');
    }
  } else if (status.isGranted) {
    // Иҷозат аллакай дода шудааст
    print('Иҷозат барои камера аллакай дода шудааст');
  }
}

Мо бояд иҷозатҳоро дар файлҳои манифест барои Android (android/app/src/main/AndroidManifest.xml) ва Info.plist барои iOS (ios/Runner/Info.plist) илова кунем.

Масалан, илова кардани иҷозат дар AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Иҷозат барои дастрасӣ ба камера -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Фаъолиятҳои шумо -->
    </application>
</manifest>

Масалан, илова кардани тавсифи истифодаи иҷозат дар Info.plist (барои iOS, талаб мешавад барои иҷозатҳои вақти иҷро):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	...
	<!-- Тавсифи сабаби истифодаи камера -->
	<key>NSCameraUsageDescription</key>
	<string>Ин барнома камераи шуморо барои гирифтани акс истифода мебарад.</string>
	...
</dict>
</plist>

Муҳим аст, ки дархости иҷозатҳоро дар вақти мувофиқ, вақте ки функсияе, ки онро талаб мекунад, истифода мешавад, анҷом диҳед, то таҷрибаи манфии корбарон пешгирӣ шавад.