تعتبر الأذونات ضرورية عند بناء تطبيقات الهاتف المحمول التي تتطلب الوصول إلى ميزات الجهاز مثل الموقع والكاميرا وجهات الاتصال والمزيد. في فلاتر، يضمن التعامل الفعال مع هذه الأذونات أن يوفر التطبيق تجربة مستخدم سلسة مع الالتزام بمتطلبات الخصوصية والأمان. إحدى الحزم الشائعة لإدارة الأذونات في فلاتر هي permission_handler
.
ستوجهك هذه المقالة خلال كيفية طلب والتحقق والتعامل مع الأذونات المختلفة في فلاتر باستخدام permission_handler
، مع أمثلة عملية مستندة إلى permission_handler
.
تثبيت permission_handler
وfluttertoast
أولاً، أضف حزمة permission_handler
وfluttertoast
إلى ملف pubspec.yaml
الخاص بك:
dependencies:
permission_handler: ^11.3.1
fluttertoast: ^8.2.4
ثم، قم بتشغيل:
flutter pub get
التعامل مع الأذونات في فلاتر
توفر حزمة permission_handler
طريقة بسيطة لطلب الأذونات والتحقق من حالتها. أدناه هو تحليل كامل للتعامل مع أذونات مختلفة مثل المكالمات الهاتفية وجهات الاتصال والموقع والرسائل القصيرة والكاميرا/الميكروفون.
يمكن لـ معالج الإذن التعامل مع جميع هذه الأنواع من الأذونات: التقويم، الكاميرا، جهات الاتصال، الموقع، مكتبة الوسائط، الميكروفون، الهاتف، الصور، تذكيرات، الاستشعارات، الرسائل النصية، التعرف على الكلام، التخزين، تجاهل تحسينات البطارية، الإشعارات، الوصول إلى موقع الوسائط، التعرف على النشاط، أذونات البلوتوث، إدارة التخزين الخارجي، نافذة تنبيه النظام، طلب حزم التثبيت، شفافية تتبع التطبيقات، تنبيهات حرجة، الوصول إلى سياسة الإشعارات، أجهزة الواي فاي القريبة، الصوت، جدولة تنبيه دقيق، الاستشعارات دائمًا، قراءة فقط للتقويم والوصول الكامل إلى التقويم ولكننا سنغطي بعضها في هذه المقالة
أدناه دليل مفصل حول كيفية طلب كل نوع من الأذونات، التعامل مع سيناريوهات مثل الرفض أو الرفض الدائم، وماذا تمنح كل أذن وصولًا إليه.
١. أذونات التقويم
-
الأذونات:
calendar
,calendarReadOnly
,calendarFullAccess
-
حالة الاستخدام: الوصول إلى تقويم المستخدم لقراءة أو كتابة الأحداث.
Future<void> requestCalendarPermission() async {
var status = await Permission.calendar.request();
if (status.isGranted) {
// Permission granted, proceed with calendar access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Calendar permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Calendar permission denied',
);
}
}
٢. أذونات الكاميرا
-
الإذن:
camera
-
حالة الاستخدام: الوصول إلى كاميرا الجهاز لالتقاط الصور أو مقاطع الفيديو.
Future<void> requestCameraPermission() async {
var status = await Permission.camera.request();
if (status.isGranted) {
// Permission granted, proceed with camera access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Camera permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Camera permission denied',
);
}
}
أذونات الاتصالات
-
الإذن:
contacts
-
حالة الاستخدام: الوصول إلى قائمة جهات اتصال المستخدم لقراءتها أو تعديلها.
Future<void> requestContactsPermission() async {
var status = await Permission.contacts.request();
if (status.isGranted) {
// Permission granted, proceed with contacts access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Contacts permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Contacts permission denied',
);
}
}
4. أذونات الموقع
-
الأذونات:
location
,locationAlways
,locationWhenInUse
,accessMediaLocation
-
حالة الاستخدام: الوصول إلى موقع المستخدم للملاحة، والتحديد الجغرافي، أو الخدمات القريبة.
Future<void> requestLocationPermission() async {
var status = await Permission.location.request();
if (status.isGranted) {
// Permission granted, proceed with location access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Location permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Location permission denied',
);
}
}
5. أذونات مكتبة الوسائط
-
الإذن:
mediaLibrary
-
حالة الاستخدام: الوصول إلى مكتبة الوسائط الخاصة بالمستخدم (فقط على نظام iOS).
Future<void> requestMediaLibraryPermission() async {
var status = await Permission.mediaLibrary.request();
if (status.isGranted) {
// Permission granted, proceed with media library access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Media Library permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Media Library permission denied',
);
}
}
6. أذونات الميكروفون
-
الإذن:
microphone
-
حالة الاستخدام: الوصول إلى ميكروفون الجهاز لتسجيل الصوت.
Future<void> requestMicrophonePermission() async {
var status = await Permission.microphone.request();
if (status.isGranted) {
// Permission granted, proceed with microphone access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Microphone permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Microphone permission denied',
);
}
}
7. أذونات الهاتف
-
الإذن:
phone
-
حالة الاستخدام: إجراء مكالمات هاتفية، قراءة حالة الهاتف، أو الوصول إلى سجل المكالمات.
Future<void> requestPhonePermission() async {
var status = await Permission.phone.request();
if (status.isGranted) {
// Permission granted, proceed with phone access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Phone permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Phone permission denied',
);
}
}
8. أذونات الصور
-
الأذونات:
photos
,photosAddOnly
-
حالة الاستخدام: الوصول إلى مكتبة الصور للقراءة أو إضافة الصور.
Future<void> requestPhotosPermission() async {
var status = await Permission.photos.request();
if (status.isGranted) {
// Permission granted, proceed with photos access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Photos permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Photos permission denied',
);
}
}
9. أذونات التذكيرات
-
الإذن:
reminders
-
حالة الاستخدام: الوصول وإدارة التذكيرات على جهاز المستخدم.
Future<void> requestRemindersPermission() async {
var status = await Permission.reminders.request();
if (status.isGranted) {
// Permission granted, proceed with reminders access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Reminders permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Reminders permission denied',
);
}
}
10. أذونات الحساسات
-
الأذونات:
sensors
,sensorsAlways
-
حالة الاستخدام: الوصول إلى أجهزة الاستشعار في الجهاز مثل مقياس السرعة والجيروسكوب.
Future<void> requestSensorsPermission() async {
var status = await Permission.sensors.request();
if (status.isGranted) {
// Permission granted, proceed with sensors access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Sensors permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Sensors permission denied',
);
}
}
11. أذونات الرسائل النصية
-
الأذن:
sms
-
حالة الاستخدام: الوصول إلى ميزات الرسائل النصية، بما في ذلك قراءة أو إرسال رسائل نصية.
Future<void> requestSmsPermission() async {
var status = await Permission.sms.request();
if (status.isGranted) {
// Permission granted, proceed with SMS access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'SMS permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'SMS permission denied',
);
}
}
12. أذونات التعرف على الكلام
-
الأذن:
speech
-
حالة الاستخدام: الوصول إلى ميزات تحويل الكلام إلى نص.
Future<void> requestSpeechPermission() async {
var status = await Permission.speech.request();
if (status.isGranted) {
// Permission granted, proceed with speech recognition
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Speech recognition permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Speech recognition permission denied',
);
}
}
13. أذونات التخزين
-
الأذونات:
storage
,manageExternalStorage
-
حالة الاستخدام: الوصول إلى تخزين المستخدم الداخلي أو الخارجي لقراءة أو كتابة الملفات.
Future<void> requestStoragePermission() async {
var status = await Permission.storage.request();
if (status.isGranted) {
// Permission granted, proceed with storage access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Storage permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Storage permission denied',
);
}
}
14. تجاهل تحسينات البطارية
-
الإذن:
ignoreBatteryOptimizations
-
حالة الاستخدام: طلب النظام استبعاد التطبيق من تدابير تحسين البطارية.
Future<void> requestIgnoreBatteryOptimizationsPermission() async {
var status = await Permission.ignoreBatteryOptimizations.request();
if (status.isGranted) {
// Permission granted, proceed with ignoring battery optimizations
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Battery optimization permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Battery optimization permission denied',
);
}
}
15. أذونات الإشعارات
-
الإذن:
notification
-
حالة الاستخدام: السماح لتطبيقك بإرسال الإشعارات.
Future<void> requestNotificationPermission() async {
var status = await Permission.notification.request();
if (status.isGranted) {
// Permission granted, proceed with notifications access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Notification permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Notification permission denied',
);
}
}
16. أذونات البلوتوث
-
الأذونات:
bluetooth
,bluetoothScan
,bluetoothAdvertise
,bluetoothConnect
-
حالة الاستخدام: الوصول إلى ميزات البلوتوث للاتصال بأجهزة البلوتوث أو إدارتها.
Future<void> requestBluetoothPermission() async {
var status = await Permission.bluetooth.request();
if (status.isGranted) {
// Permission granted, proceed with Bluetooth access
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'Bluetooth permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'Bluetooth permission denied',
);
}
}
17. شفافية تتبع التطبيقات
-
الإذن:
appTrackingTransparency
-
حالة الاستخدام: طلب إذن التتبع من المستخدم، وهو متطلب لتتبع التطبيق في نظام iOS.
Future<void> requestAppTrackingTransparencyPermission() async {
var status = await Permission.appTrackingTransparency.request();
if (status.isGranted) {
// Permission granted, proceed with app tracking
} else if (status.isPermanentlyDenied) {
ShowToast.showErrorText(
text: 'App tracking permission permanently denied. Please enable it in the app settings.',
);
openAppSettings();
} else {
ShowToast.showErrorText(
text: 'App tracking permission denied',
);
}
}
الأذونات تلعب دورًا حاسمًا في توفير تجربة سلسة للمستخدمين مع احترام خصوصيتهم. من الضروري التعامل مع هذه الأذونات بأناقة وتثقيف المستخدمين حول سبب طلب تطبيقك لها.
من خلال استخدام حزمة permission_handler
، يمكنك طلب الأذونات الضرورية والتحقق منها وإدارتها لتطبيق Flutter الخاص بك عبر منصتي Android و iOS. توفر دائمًا تغذية راجعة معنوية للمستخدمين ونظر في إضافة تدفقات بديلة في حال تم رفض الأذونات أو سحبها.
تكوينات Android و iOS
من الضروري تضمين التكوينات اللازمة لنظامي Android و iOS. بالنسبة لنظام Android، يعني هذا تحديث ملف AndroidManifest.xml
بالإعلانات الصحيحة للأذونات. أما بالنسبة لنظام iOS، فيجب إضافة وصف استخدام الأذونات إلى ملف Info.plist
لإبلاغ المستخدمين عن سبب طلب بعض الأذونات.
تكوين AndroidManifest.xml
لنظام Android
عن كل أذن في الأمثلة الـ17، يجب عليك إضافة الوسم المقابل <uses-permission>
في ملف AndroidManifest.xml
. إليك كيف تتطابق الأذونات مع حزمة permission_handler
:
-
إذن الكاميرا
<uses-permission android:name="android.permission.CAMERA" />
-
إذن الاتصالات
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />
-
أذونات الموقع
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
-
إذن مكتبة الوسائط/التخزين
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
-
إذن الميكروفون
<uses-permission android:name="android.permission.RECORD_AUDIO" />
-
إذن الهاتف
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
-
إذن الصور
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
إذن التذكيرات (لا توجد إذن محدد لنظام Android)
-
إذن الاستشعارات
<uses-permission android:name="android.permission.BODY_SENSORS" />
-
إذن الرسائل النصية
<uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
-
إذن التعرف على الكلام
<uses-permission android:name="android.permission.RECORD_AUDIO" />
-
تجاهل تحسينات البطارية
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
-
إذن الإشعارات (يتم التعامل معه بشكل أساسي في Android 13+)
-
إذن الوصول إلى موقع الوسائط
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
-
إذن التعرف على النشاط
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
-
أذونات البلوتوث
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
-
إذن شفافية تتبع التطبيق (iOS فقط)
تكوين ملف Info.plist
في نظام iOS
يجب عليك في iOS تقديم مفاتيح وصفية في ملف Info.plist
لإبلاغ المستخدمين عن سبب حاجة تطبيقك لأذونات معينة. فيما يلي تكوينات لكل مثال على إذن:
-
إذن الكاميرا
<key>NSCameraUsageDescription</key> <string>نحتاج إلى الوصول إلى كاميراك لالتقاط الصور.</string>
-
إذن الاتصالات
<key>NSContactsUsageDescription</key> <string>نحتاج إلى الوصول إلى جهات الاتصال الخاصة بك لتحسين التواصل.</string>
-
أذونات الموقع
<key>NSLocationWhenInUseUsageDescription</key> <string>نحتاج إلى الوصول إلى موقعك لتوفير خدمات معتمدة على الموقع.</string> <key>NSLocationAlwaysUsageDescription</key> <string>نحتاج إلى الوصول إلى موقعك لتتبع حركتك حتى عندما لا يكون التطبيق نشطاً.</string>
-
مكتبة الوسائط/أذونة التخزين
<key>NSPhotoLibraryUsageDescription</key> <string>نحتاج إلى الوصول إلى صورك لمشاركتها أو رفع الوسائط.</string>
-
إذن الميكروفون
<key>NSMicrophoneUsageDescription</key> <string>نحتاج إلى الوصول إلى ميكروفونك للتسجيل الصوتي.</string>
-
إذن الهاتف
<key>NSPhoneUsageDescription</key> <string>نحتاج إلى الوصول إلى خدمات الهاتف لتمكين المكالمات.</string>
-
إذن الوصول إلى الصور
<key>NSPhotoLibraryAddUsageDescription</key> <string>نحتاج إلى إذن لإضافة الصور إلى مكتبتك.</string>
-
إذن الوصول إلى التذكيرات
<key>NSRemindersUsageDescription</key> <string>نحتاج إلى الوصول إلى التذكيرات الخاصة بك لإدارة المهام.</string>
-
إذن الاستشعارات
<key>NSSensorsUsageDescription</key> <string>نحتاج إلى الوصول إلى الاستشعارات الخاصة بك لتتبع اللياقة البدنية.</string>
-
إذن الرسائل النصية (يتم التعامل معه تلقائيًا بواسطة نظام iOS إذا تم طلب خدمات الرسائل النصية)
-
إذن التعرف على الكلام
<key>NSSpeechRecognitionUsageDescription</key>
<string>We need access to speech recognition for voice commands.</string>
-
تجاهل تحسينات البطارية (لا ينطبق على نظام iOS)
-
إذن الإشعارات
<key>NSUserNotificationUsageDescription</key>
<string>We need permission to send notifications.</string>
-
إذن الوصول إلى الموقع الوسائطي (يتم التعامل معه تلقائيًا على نظام iOS)
-
إذن التعرف على النشاط
<key>NSMotionUsageDescription</key>
<string>We need access to motion data for fitness tracking.</string>
- أذونات البلوتوث
<key>NSBluetoothPeripheralUsageDescription</key>
<string>We need access to Bluetooth for device connectivity.</string>
- شفافية تتبع التطبيقات
<key>NSUserTrackingUsageDescription</key>
<string>We need permission to track your activity across apps and websites for personalized ads.</string>
لجعل تطبيقك متكامل الوظائف ومتوافق مع أحدث التشريعات الخصوصية، من الضروري إدارة الأذونات بشكل سليم. من خلال تحديث كل من AndroidManifest.xml
و Info.plist
، بالإضافة إلى تنفيذ المنطق الصحيح لمعالجة الأذونات في تطبيق Flutter الخاص بك، توفر تجربة سلسة وشفافة للمستخدمين أثناء طلب الوصول إلى الميزات الحساسة.
تأكد دائمًا من اختبار الأذونات على كلتا النظامين وتقديم تفسيرات معنونة للمستخدمين حول سبب الحاجة إلى الأذونات لتجنب الرفض أثناء مراجعات متاجر التطبيقات.
للحصول على بحث أكثر عمقًا، يُنصح بالاطلاع على الوثائق الرسمية لمعالجة الأذونات لاستكشاف أنواع أذونات أخرى. تأكد أيضًا من تحديث ملفاتك الخاصة بالنظام (مثل AndroidManifest.xml
و Info.plist
) بالإعلانات اللازمة لكل نوع من أنواع الأذونات.
Source:
https://atuoha.hashnode.dev/permission-handling-in-flutter