Дар барномаи 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>
Муҳим аст, ки дархости иҷозатҳоро дар вақти мувофиқ, вақте ки функсияе, ки онро талаб мекунад, истифода мешавад, анҷом диҳед, то таҷрибаи манфии корбарон пешгирӣ шавад.