Location Permission هو إذن يطلبه التطبيق المحمول من المستخدم للوصول إلى بيانات موقعه الجغرافي. بدون هذا الإذن، لا يمكن للتطبيق تحديد إحداثيات الجهاز، وبالتالي لا يمكنه تقديم خدمات الموقع الجغرافي. وفقًا لـ Apple Developer Documentation, 2024، جميع التطبيقات التي تستخدم خدمات الموقع الجغرافي ملزمة بطلب موافقة صريحة من المستخدم عبر حوار النظام.
الملخص
Location Permission هو آلية نظام تشغيل تنظم وصول التطبيقات إلى بيانات الموقع الجغرافي للجهاز. بدون موافقة صريحة من المستخدم، لا يمكن للتطبيق الحصول على إحداثيات GPS أو بيانات شبكات Wi-Fi أو معلومات أبراج الاتصالات.
تنفذ منصتا Android وiOS نظام الأذونات الخاص بهما، لكن المنطق العام واحد: يعلن التطبيق عن الأذونات المطلوبة في ملف البيان أو التكوين، ثم يطلبها في وقت التشغيل. وفقًا لـ Android Developers, 2024، بدءًا من Android 10، تنتمي جميع أذونات الموقع الجغرافي إلى فئة الأذونات الخطرة وتتطلب طلبًا في وقت التشغيل.
سبب هذا النهج هو حماية خصوصية المستخدمين. تتيح بيانات الموقع بناء مسارات التنقل، وتحديد أماكن العمل والترفيه، وكذلك التعرف على الهوية. لذلك، تتطلب كلتا المنصتين شرحًا شفافًا في حوار الطلب: يجب على التطبيق توضيح سبب حاجته للوصول إلى الموقع الجغرافي.
إذن الموقع الجغرافي ضروري لأي تطبيق تعتمد وظائفه على معرفة الموقع الفعلي للمستخدم. الخرائط والملاحة، تطبيقات التوصيل، خدمات الطقس، شبكات التواصل مع العلامات الجغرافية — كل هذه الفئات من البرامج تتطلب Location Permission.
بدون هذا الإذن، لا يمكن للتطبيق تحديد إحداثيات الجهاز بأي من الطرق المتاحة: لا عبر وحدة GPS، ولا عبر مسح Wi-Fi، ولا عبر تحديد الموقع بواسطة أبراج الاتصالات. يمكن للمستخدم إلغاء الإذن في أي وقت من إعدادات النظام، وبعد ذلك يجب على التطبيق معالجة الرفض بشكل صحيح.
وفقًا لدراسة أجراها Pew Research Center (2024)، حوالي 45% من المستخدمين يلغون الوصول إلى الموقع الجغرافي في التطبيقات التي لا تستخدمه للوظائف الأساسية. وهذا يعني أن المطور يحتاج إلى تبرير الطلب بوضوح وتقديم آليات بديلة لمن رفض Location Permission.
يتطلب GDPR في أوروبا والقانون الاتحادي 152-FZ في روسيا الحصول على موافقة مستنيرة لمعالجة بيانات الموقع. يجب على التطبيق ليس فقط طلب الإذن عبر حوار النظام، بل وأيضًا تقديم إشعار منفصل حول أغراض جمع البيانات. انتهاك هذه المتطلبات يستوجب غرامات تصل إلى 20 مليون يورو أو 4% من الإيرادات السنوية للشركة.
إذا لم يطلب التطبيق Location Permission أو رفض المستخدم الوصول، يجب على المطور توفير سيناريو بديل. لتطبيق الخرائط، قد يكون الإدخال اليدوي للعنوان؛ لتطبيق التوصيل — الاختيار من قائمة العناوين المحفوظة؛ لخدمة الطقس — تحديد المدينة بواسطة عنوان IP. Graceful degradation (التدهور التدريجي) هو ممارسة قياسية موصى بها من Google وApple.
مستويات الوصول إلى الموقع الجغرافي تختلف في Android وiOS، على الرغم من أن الفكرة العامة واحدة: كلما كان الوصول أكثر دقة، كانت المتطلبات أكثر صرامة التي تفرضها المنصة على التطبيق.
| مستوى الوصول | Android | iOS |
|---|---|---|
| أثناء الاستخدام | فقط عندما يكون التطبيق نشطًا | When In Use — فقط في التطبيق |
| الخلفية | Always — باستمرار، حتى في الخلفية | Always — يتطلب مراجعة إضافية من App Store |
| تقريبي | ACCESS_COARSE_LOCATION (دقة تصل إلى 500 م) | مع خيار Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION يوفر الوصول إلى إحداثيات GPS دقيقة بهامش خطأ يصل إلى عدة أمتار. للإعلان عن هذا الإذن في البيان، يتم استخدام الثابت android.permission.ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION، بدوره، يوفر موقعًا تقريبيًا بدقة تصل إلى 500 متر بناءً على بيانات Wi-Fi وأبراج الاتصالات.
When In Use يسمح للتطبيق بتلقي الإحداثيات فقط عندما يكون مفتوحًا على الشاشة. Always يوفر الوصول إلى الموقع الجغرافي حتى في الخلفية، ولكنه يتطلب مراجعة إلزامية من App Store. بدءًا من iOS 14، يمكن للمستخدم تعطيل التحديد الدقيق بشكل منفصل لكل تطبيق عبر مفتاح Precision.
طلب Location Permission في Android يتم على مرحلتين: الإعلان عن الأذونات في البيان والطلب في وقت التشغيل. بدءًا من Android 6.0 (API 23)، يتم طلب جميع الأذونات الخطرة أثناء تشغيل التطبيق، وليس أثناء التثبيت.
الخطوة الأولى هي إضافة الأذونات اللازمة إلى ملف AndroidManifest.xml. يتم استخدام ثوابت مختلفة للتحديد الدقيق والتقريبي.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
بعد الإعلان في البيان، يجب استدعاء حوار النظام لطلب الإذن في كود التطبيق. لنلقِ نظرة على مثال في Kotlin باستخدام Activity Result API.
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// تم منح الإذن
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// الموقع التقريبي فقط
getCoarseLocation()
}
else -> {
// المستخدم رفض
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
إذا رفض المستخدم الوصول، لا يسمح نظام Android بعرض الحوار مرة أخرى تلقائيًا. يحتاج المطور إلى استدعاء shouldShowRequestPermissionRationale لعرض شرح تمهيدي. في حالة الرفض المتكرر مع علامة Never Ask Again، يجب توجيه المستخدم إلى إعدادات النظام.
private fun checkLocationPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED -> {
getLocation()
}
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) -> {
showRationaleDialog {
requestLocationPermission()
}
}
else -> {
openAppSettings()
}
}
}
طلب Location Permission في iOS يتطلب إضافة مفاتيح خاصة إلى ملف Info.plist واستدعاء طرق من فئة CLLocationManager. تولي Apple اهتمامًا خاصًا بالخصوصية، لذلك يجب أن يكون نص الشرح في حوار الطلب محددًا قدر الإمكان.
لطلب الموقع في iOS، تحتاج إلى إضافة مفتاح واحد أو كلا المفتاحين إلى Info.plist: NSLocationWhenInUseUsageDescription للوصول أثناء الاستخدام و NSLocationAlwaysAndWhenInUseUsageDescription للوصول في الخلفية. قيمة كل مفتاح هي نص سيظهر للمستخدم في الحوار.
<key>NSLocationWhenInUseUsageDescription</key>
<string>تطبيقك يحتاج موقعك لعرض النقاط القريبة على الخريطة.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>تطبيقك يحتاج الوصول إلى الموقع الجغرافي في الخلفية لتتبع المسار.</string>
في كود Swift، يتم الطلب من خلال مثيل من CLLocationManager. اعتمادًا على مستوى الوصول المطلوب، يتم استدعاء requestWhenInUseAuthorization أو requestAlwaysAuthorization.
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
func requestLocationAccess() {
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
startLocationUpdates()
case .denied, .restricted:
showSettingsAlert()
case .notDetermined:
break
}
}
}
على عكس Android، لا يوفر iOS للمطور طريقة للتحقق من shouldShowRequestPermissionRationale. النظام نفسه يقرر متى يعرض الشرح. بالإضافة إلى ذلك، في iOS يمكن للمستخدم تغيير الإذن فقط من خلال إعدادات النظام — لا يمكن للتطبيق إعادة عرض حوار النظام بعد أن اتخذ المستخدم قرارًا. RequestAlwaysAuthorization يطلب أولاً When In Use، ثم بعد الحصول على الموافقة الأولى، حوارًا منفصلاً للوصول في الخلفية.
أفضل الممارسات للعمل مع Location Permission تساعد في تقليل رفض المستخدمين والامتثال لمتطلبات متاجر التطبيقات. نشرت Google وApple توصيات يزيد الامتثال لها من احتمالية الموافقة على التطبيق.
لا تظهر حوار طلب Location Permission فور بدء التطبيق. المستخدم الذي فتح التطبيق للتو لا يفهم بعد لماذا يحتاج إلى منح الوصول إلى الموقع الجغرافي. Contextual request يعني أن الحوار يظهر في اللحظة التي يحتاج فيها المستخدم بالفعل إلى وظيفة تتطلب الإذن. على سبيل المثال، عند النقر على زر “البحث عن أقرب متجر”.
قبل حوار النظام، اعرض شاشة الشرح الخاصة بك (pre-permission screen). عليها، اشرح لماذا يحتاج التطبيق إلى الموقع الجغرافي، وما هي البيانات التي يتم جمعها وكيف سيتم استخدامها. بعد أن ينقر المستخدم على “سماح” على شاشتك، اعرض حوار النظام. وفقًا لـ Appsflyer (2024)، يزيد هذا النهج من نسبة الموافقة بنسبة 25-35%.
الوصول في الخلفية إلى الموقع الجغرافي مطلوب فقط للتطبيقات التي تعمل في الخلفية: الملاحين، متتبعي النشاط، تطبيقات التوصيل. إذا كان تطبيقك يحتاج إلى إحداثيات فقط عند فتح الشاشة، اطلب When In Use. سترفض App Store التطبيق إذا لم يكن Always مبررًا وظيفيًا. في Android، يتم تنظيم الوصول في الخلفية بشكل إضافي من خلال إذن ACCESS_BACKGROUND_LOCATION.
الأسئلة الشائعة
يجب على التطبيق معالجة الرفض بشكل صحيح وتقديم سيناريو بديل. على سبيل المثال، الإدخال اليدوي للعنوان أو تحديد المدينة بواسطة عنوان IP. لا يتم عرض حوار النظام مرة أخرى — يجب توجيه المستخدم إلى الإعدادات.
تقنيًا، نعم — يمكن عرض حوار النظام بدون شاشة تمهيدية. ومع ذلك، فإن نسبة الموافقة بدون شرح تبلغ 30-40%، بينما مع شاشة تمهيدية تبلغ 60-75%. توصي Apple وGoogle دائمًا بشرح سبب الطلب.
استخدم ContextCompat.checkSelfPermission مع الثابت Manifest.permission.ACCESS_FINE_LOCATION. تعيد الطريقة PERMISSION_GRANTED أو PERMISSION_DENIED، مما يسمح بتحديد الحالة الحالية دون استدعاء حوار النظام.
ACCESS_FINE_LOCATION يوفر الوصول إلى إحداثيات GPS دقيقة بهامش خطأ 3-10 أمتار. ACCESS_COARSE_LOCATION يوفر موقعًا تقريبيًا بدقة تصل إلى 500 متر بناءً على Wi-Fi وأبراج الاتصالات. في Android 12+، يمكن للمطور طلب كلا الإذنين في وقت واحد.
في Android، لمسح أجهزة BLE يتطلب ACCESS_FINE_LOCATION أو ACCESS_COARSE_LOCATION، لأن إشارات BLE يمكن استخدامها لتثليث الموقع. في iOS، يتطلب BLE فقط إذن Bluetooth — لا حاجة لـ Location Permission.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا