لوحة تحكم الدورة

استراتيجية صلاحيات الإشعارات: كيف تضمن قبول المستخدم؟

تعد خطوة طلب الصلاحيات (Permissions) هي المعركة الأولى والأهم في تجربة المستخدم. تشير الدراسات إلى أن أكثر من 60% من المستخدمين يميلون لرفض طلبات الصلاحية إذا ظهرت في الوقت الخطأ أو بدون سياق واضح. في بيئة Expo، لدينا الأدوات اللازمة لإدارة هذه العملية باحترافية.


تطور صلاحيات الإشعارات

تغيرت قواعد اللعبة بشكل كبير في السنوات الأخيرة:

  • Android 13+: أصبح طلب صلاحية POST_NOTIFICATIONS إلزامياً وصريحاً، تماماً كما في نظام iOS.
  • iOS: كان دائماً يفرض طلب الموافقة الصريحة قبل إرسال أي تنبيه.

كمطور، يجب أن تتعامل مع هذه الصلاحيات برمجياً وتتحقق من حالتها في كل مرة يحتاج فيها التطبيق لإرسال إشعار.


استراتيجية "الطلب الناعم" (Soft Ask)

أكبر خطأ تقني هو طلب الصلاحية فور فتح التطبيق لأول مرة. المستخدم لا يثق بالتطبيق بعد ولا يعرف القيمة التي سيقدمها. بدلاً من ذلك، اتبع استراتيجية الطلب الناعم:

  1. اشرح الفائدة أولاً: اعرض شاشة تشرح لماذا يحتاج التطبيق للإشعارات (مثلاً: "لنرسل لك تذكيرات بمواعيد الدواء").
  2. اربط الطلب بحدث: اطلب الصلاحية عندما يحاول المستخدم تفعيل ميزة تعتمد عليها (مثل الضغط على زر "ذكرني").
  3. جس نبض المستخدم: استخدم زر "تفعيل" مخصص في واجهة تطبيقك قبل إظهار طلب النظام الرسمي.

التنفيذ البرمجي في Expo

نستخدم مكتبة expo-notifications للتعامل مع الصلاحيات. إليك النمط الموصى به:

index.tstypescript
import * as Notifications from 'expo-notifications';
import { Platform } from 'react-native';

async function requestNotificationPermissions() {
  // 1. التحقق من الحالة الحالية
  const { status: existingStatus } = await Notifications.getPermissionsAsync();
  let finalStatus = existingStatus;

  // 2. إذا لم تكن ممنوحة، نطلبها
  if (existingStatus !== 'granted') {
    const { status } = await Notifications.requestPermissionsAsync();
    finalStatus = status;
  }

  // 3. التعامل مع النتيجة
  if (finalStatus !== 'granted') {
    alert('لن نتمكن من إرسال التذكيرات المهمة بدون موافقتك.');
    return false;
  }
  
  return true;
}

ماذا لو رفض المستخدم؟

بمجرد أن يرفض المستخدم الطلب الرسمي للنظام مرتين (في الأندرويد) أو مرة واحدة (في iOS)، لن يظهر مربع الحوار مرة أخرى. في هذه الحالة، يجب توجيه المستخدم لفتح إعدادات النظام يدوياً:

index.tstypescript
import { Linking } from 'react-native';

const openAppSettings = () => {
  if (Platform.OS === 'android') {
    Linking.openSettings();
  } else {
    Linking.openURL('app-settings:');
  }
};

إعدادات Android الذكية

لمشاريع Android 13+، تأكد من إضافة الصلاحية في ملف app.json:

App.jsjson
{
  "expo": {
    "android": {
      "permissions": ["POST_NOTIFICATIONS"]
    }
  }
}

ملخص الدرس

  • لا تطلب الصلاحية فور التشغيل (طلب ناعم فقط).
  • تحقق دائماً من الحالة عبر getPermissionsAsync.
  • وفر وسيلة سهلة للمستخدم للذهاب للإعدادات في حال الرفض.