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)، حدود ۴۵٪ از کاربران دسترسی به موقعیت جغرافیایی را در برنامههایی که از آن برای عملکرد اصلی استفاده نمیکنند، لغو میکنند. این بدان معناست که توسعهدهنده باید درخواست را به وضوح توجیه کرده و مکانیسمهای جایگزین را برای کسانی که از Location Permission امتناع کردهاند، ارائه دهد.
GDPR در اروپا و قانون ۱۵۲ روسیه نیاز به دریافت رضایت آگاهانه برای پردازش دادههای موقعیت مکانی دارند. برنامه نه تنها باید از طریق دیالوگ سیستمی مجوز درخواست کند، بلکه باید اعلان جداگانهای درباره اهداف جمعآوری دادهها ارائه دهد. نقض این الزامات جریمههایی تا ۲۰ میلیون یورو یا ۴٪ از گردش مالی سالانه شرکت را به دنبال دارد.
اگر برنامه Location Permission را درخواست نکند یا کاربر از دسترسی امتناع کند، توسعهدهنده باید سناریوی جایگزینی را پیشبینی کند. برای برنامه نقشه، این میتواند ورود دستی آدرس باشد، برای برنامه تحویل — انتخاب از لیست آدرسهای ذخیرهشده، برای سرویس آب و هوا — تعیین شهر بر اساس آدرس IP. Graceful degradation (تخریب تدریجی) یک رویه استاندارد است که توسط Google و Apple توصیه میشود.
سطوح دسترسی به موقعیت جغرافیایی در Android و iOS متفاوت هستند، اگرچه ایده کلی یکسان است: هرچه دسترسی دقیقتر باشد، پلتفرم الزامات سختگیرانهتری به برنامه تحمیل میکند.
| سطح دسترسی | Android | iOS |
|---|---|---|
| هنگام استفاده | فقط زمانی که برنامه فعال است | When In Use — فقط در برنامه |
| پسزمینه | Always — دائمی، حتی در پسزمینه | Always — نیاز به بررسی اضافی App Store |
| تقریبی | ACCESS_COARSE_LOCATION (دقت تا ۵۰۰ متر) | با گزینه Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION دسترسی به مختصات دقیق GPS با خطای چند متر را فراهم میکند. برای اعلام این مجوز در مانیفست از ثابت android.permission.ACCESS_FINE_LOCATION استفاده میشود. ACCESS_COARSE_LOCATION به نوبه خود موقعیت تقریبی را با دقت تا ۵۰۰ متر بر اساس دادههای 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)، این رویکرد نرخ تبدیل رضایت را ۲۵-۳۵٪ افزایش میدهد.
دسترسی پسزمینه به موقعیت جغرافیایی فقط برای برنامههایی که در پسزمینه کار میکنند لازم است: مسیریابها، ردیابهای فعالیت، برنامههای تحویل. اگر برنامه شما فقط زمانی که صفحه باز است به مختصات نیاز دارد، When In Use را درخواست کنید. App Store برنامه را رد میکند اگر Always از نظر عملکردی توجیه نشده باشد. در Android، دسترسی پسزمینه additionally از طریق مجوز ACCESS_BACKGROUND_LOCATION تنظیم میشود.
سوالات متداول
برنامه باید انصراف را به درستی مدیریت کرده و سناریوی جایگزینی ارائه دهد. مثلاً ورود دستی آدرس یا تعیین شهر با آدرس IP. دیالوگ سیستمی مجدداً نمایش داده نمیشود — باید کاربر را به تنظیمات هدایت کرد.
از نظر فنی بله، دیالوگ سیستمی را میتوان بدون صفحه قبلی فراخوانی کرد. با این حال نرخ تبدیل رضایت بدون توضیح ۳۰-۴۰٪ است، در حالی که با صفحه قبلی ۶۰-۷۵٪ است. Apple و Google توصیه میکنند همیشه دلیل درخواست را توضیح دهید.
از ContextCompat.checkSelfPermission با ثابت Manifest.permission.ACCESS_FINE_LOCATION استفاده کنید. متد PERMISSION_GRANTED یا PERMISSION_DENIED را بازمیگرداند که امکان تعیین وضعیت فعلی را بدون فراخوانی دیالوگ سیستمی فراهم میکند.
ACCESS_FINE_LOCATION دسترسی به مختصات دقیق GPS با خطای ۳-۱۰ متر را فراهم میکند. ACCESS_COARSE_LOCATION موقعیت تقریبی را با دقت تا ۵۰۰ متر بر اساس Wi-Fi و دکلهای مخابراتی ارائه میدهد. در Android 12+، توسعهدهنده میتواند هر دو مجوز را همزمان درخواست کند.
در Android برای اسکن دستگاههای BLE، ACCESS_FINE_LOCATION یا ACCESS_COARSE_LOCATION لازم است، زیرا سیگنالهای BLE میتوانند برای مثلثسازی موقعیت استفاده شوند. در iOS برای BLE مجوز Bluetooth کافی است، Location Permission لازم نیست.
نتیجهگیری
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید