טיפול בהרשאות בפלאטר

הרשאות הן חיוניות בבניית אפליקציות ניידות שדורשות גישה לתכונות התקן כמו מיקום, מצלמה, אנשי קשר ועוד. ב-Flutter, טיפול יעיל בהרשאות מבטיח שהאפליקציה תספק חוויית משתמש חלקה תוך עמידה בדרישות הפרטיות והאבטחה. אחד החבילות הפופולריות לניהול הרשאות ב-Flutter היא permission_handler.

מאמר זה ילווה אותך בכיצד לבקש, לבדוק, ולטפל בהרשאות שונות ב-Flutter באמצעות permission_handler, עם דוגמאות מעשיות מבוססות על permission_handler.

ראשית, הוסף את החבילה permission_handler ו־fluttertoast לקובץ ה־pubspec.yaml שלך:

dependencies:
  permission_handler: ^11.3.1 
  fluttertoast: ^8.2.4

לאחר מכן, הרץ:

flutter pub get

חבילת permission_handler מספקת דרך פשוטה לבקש הרשאות ולבדוק את מעמדן. להלן פירוט מלא על טיפול בהרשאות שונות כמו שיחות טלפון, אנשי קשר, מיקום, הודעות SMS, ומצלמה/מיקרופון.

מנהל הרשאות יכול לטפל בכל אחת מהסוגים הבאים של הרשאות: לוח שנה, מצלמה, אנשי קשר, מיקום, ספריית מדיה, מיקרופון, טלפון, תמונות, תזכורות, חיישנים, הודעות SMS, זיהוי קול, אחסון, התעלמות מאופטימיזציות בטרייה, התראות, גישה למיקום במדיה, זיהוי פעילות, הרשאות Bluetooth, ניהול אחסון חיצוני, חלון התראה מערכתי, בקשת התקנת חבילות, שקיפות מעקב אפליקציות, התראות חשובות, גישה למדיניות התראות, מכשירי Wi-Fi סמוכים, שמע, קביעת אזעקה מדויקת, חיישנים תמיד, קריאת לוח שנה וגישה מלאה ללוח שנה אך אנו מתכוונים לכסות מספר חלקם במאמר זה

להלן מדריך מפורט על איך לבקש כל סוג של הרשאה, לטפל בתרחישים כמו סירוב או סירוב קבוע, ומה כל הרשאה מעניקה גישה אליה


  • הרשאות: 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',
    );
  }
}

  • הרשאות: 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',
    );
  }
}

  • הרשאה: 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',
    );
  }
}

  • הרשאה: 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',
    );
  }
}

  • הרשאה: 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',
    );
  }
}

  • הרשאות: 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',
    );
  }
}

  • הרשאה: 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',
    );
  }
}

  • הרשאות: 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',
    );
  }
}

  • הרשאה: sms

  • תרחיש שימוש: גישה לתכונות SMS, כולל קריאה או שליחת הודעות 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',
    );
  }
}

  • הרשאה: 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',
    );
  }
}

  • הרשאות: 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',
    );
  }
}

  • רשות: 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',
    );
  }
}

  • רשות: 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',
    );
  }
}

  • רשות: bluetooth, bluetoothScan, bluetoothAdvertise, bluetoothConnect

  • מקרה שימוש: גישה לתכונות Bluetooth לחיבור או ניהול התקני Bluetooth.

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',
    );
  }
}

  • רשות: appTrackingTransparency

  • Use Case: בקשת הרשאת מעקב מהמשתמש, דרישה עבור מעקב אפליקציה ב- 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 תיאורים של שימוש בהרשאות כדי ליידע את המשתמשים למה נדרשות הרשאות מסוימות.

עבור כל ההרשאה ב- 17 דוגמאות, עליך להוסיף את התג <uses-permission> התואם בקובץ ה- AndroidManifest.xml. הנה איך ההרשאות מתאימות לחבילת permission_handler:

  1. רשות מצלמה

     <uses-permission android:name="android.permission.CAMERA" />
    
  2. רשות אנשי קשר

     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    
  3. הרשאות מיקום

     <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" />
    
  4. רשות ספריית המדיה/אחסון

     <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" />
    
  5. רשות מיקרופון

     <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  6. רשות טלפון

     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
  7. רשות תמונות

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  8. רשות תזכורות (לא רשות Android ספציפית)

  9. רשות חיישנים

     <uses-permission android:name="android.permission.BODY_SENSORS" />
    
  10. רשות SMS

    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    
  11. רשות זיהוי קולי

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  12. התעלמות מאופטימיזציות בטרייה

    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    
  13. רשות התראות (טופל באופן טבעי ב-Android 13+)

  14. הרשאת גישה למיקום מדיה

    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    
  15. הרשאת זיהוי פעילות

    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    
  16. הרשאות Bluetooth

    <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" />
    
  17. הרשאות שלמידת אפליקציות (רק ל-iOS)


ב-iOS, עליך לספק מפתחות תיאוריים בקובץ Info.plist כדי ליידע את המשתמשים למה האפליקציה שלך זקוקה להרשאויות מסוימות. להלן הגדרות עבור דוגמאות כל הרשאה:

  1. רשות מצלמה

     <key>NSCameraUsageDescription</key>
     <string>אנו זקוקים לגישה למצלמה שלך לצורך צילום תמונות</string>
    
  2. רשות אנשי קשר

     <key>NSContactsUsageDescription</key>
     <string>אנו זקוקים לגישה לאנשי הקשר שלך לצורך תקשורת טובה יותר</string>
    
  3. הרשאות מיקום

     <key>NSLocationWhenInUseUsageDescription</key>
     <string>אנו זקוקים לגישה למיקומך כדי לספק שירותים המבוססים על מיקום.</string>
     <key>NSLocationAlwaysUsageDescription</key>
     <string>אנו זקוקים לגישה למיקומך כדי לעקוב אחר התנועה שלך גם כאשר האפליקציה אינה פעילה.</string>
    
  4. ספריית מדיה/אחסון הרשאה

     <key>NSPhotoLibraryUsageDescription</key>
     <string>אנו זקוקים לגישה לתמונות שלך לשיתוף או העלאת מדיה.</string>
    
  5. הרשאת מיקרופון

     <key>NSMicrophoneUsageDescription</key>
     <string>אנו זקוקים לגישה למיקרופון שלך להקלטת קול.</string>
    
  6. הרשאת טלפון

     <key>NSPhoneUsageDescription</key>
     <string>אנו זקוקים לגישה לשירותי טלפון כדי לאפשר שיחות.</string>
    
  7. הרשאת תמונות

     <key>NSPhotoLibraryAddUsageDescription</key>
     <string>אנו זקוקים להרשאה להוספת תמונות לספרייתך.</string>
    
  8. הרשאת תזכורות

     <key>NSRemindersUsageDescription</key>
     <string>אנו זקוקים לגישה לתזכורות שלך לניהול משימות.</string>
    
  9. הרשאת חיישנים

     <key>NSSensorsUsageDescription</key>
     <string>אנו זקוקים לגישה לחיישנים שלך למעקב אחר הכושר.</string>
    
  10. הרשאת SMS (ניהול אוטומטי על ידי iOS אם שירותי SMS מבוקשים)

  11. הרשאת זיהוי קול

<key>NSSpeechRecognitionUsageDescription</key>
<string>We need access to speech recognition for voice commands.</string>
  1. התעלמות מאופטימיזציות של הסוללה (לא רלוונטי על iOS)

  2. הרשאת התראות

<key>NSUserNotificationUsageDescription</key>
<string>We need permission to send notifications.</string>
  1. הרשאת גישה למיקום במדיה (ניהול אוטומטי ב- iOS)

  2. הרשאת זיהוי פעילות

<key>NSMotionUsageDescription</key>
<string>We need access to motion data for fitness tracking.</string>
  1. הרשאות Bluetooth
<key>NSBluetoothPeripheralUsageDescription</key>
<string>We need access to Bluetooth for device connectivity.</string>
  1. שקיפות מעקב באפליקציות
<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