Location Permission در توسعه موبایل: چیست، سطوح دسترسی و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-05-21 زمان مطالعه: 8 دقیقه

Location Permission مجوزی است که برنامه موبایل از کاربر برای دسترسی به داده‌های موقعیت جغرافیایی او درخواست می‌کند. بدون این مجوز، برنامه نمی‌تواند مختصات دستگاه را تعیین کند و بنابراین نمی‌تواند عملکردهای موقعیت‌یابی را ارائه دهد. طبق Apple Developer Documentation, 2024، همه برنامه‌هایی که از سرویس‌های موقعیت‌یابی استفاده می‌کنند، موظف به درخواست رضایت صریح کاربر از طریق دیالوگ سیستمی هستند.

نکات اصلی

  • Location Permission — مجوز اجباری برای دسترسی به موقعیت جغرافیایی دستگاه در برنامه‌های موبایل.
  • سطوح دسترسی به دو نوع پس‌زمینه و هنگام استفاده از برنامه در هر دو پلتفرم تقسیم می‌شوند.
  • Android از ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION برای تعیین دقیق و تقریبی مختصات استفاده می‌کند.
  • iOS نیاز به افزودن کلیدهای NSLocationWhenInUseUsageDescription و NSLocationAlwaysUsageDescription در Info.plist دارد.
  • درخواست مجوز باید حاوی توضیح قابل فهمی باشد که چرا برنامه به داده‌های موقعیت مکانی نیاز دارد.

Location Permission چیست؟

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 متفاوت هستند، اگرچه ایده کلی یکسان است: هرچه دسترسی دقیق‌تر باشد، پلتفرم الزامات سخت‌گیرانه‌تری به برنامه تحمیل می‌کند.

سطح دسترسیAndroidiOS
هنگام استفادهفقط زمانی که برنامه فعال استWhen In Use — فقط در برنامه
پس‌زمینهAlways — دائمی، حتی در پس‌زمینهAlways — نیاز به بررسی اضافی App Store
تقریبیACCESS_COARSE_LOCATION (دقت تا ۵۰۰ متر)با گزینه Precision = Off (iOS 14+)

ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION در Android

ACCESS_FINE_LOCATION دسترسی به مختصات دقیق GPS با خطای چند متر را فراهم می‌کند. برای اعلام این مجوز در مانیفست از ثابت android.permission.ACCESS_FINE_LOCATION استفاده می‌شود. ACCESS_COARSE_LOCATION به نوبه خود موقعیت تقریبی را با دقت تا ۵۰۰ متر بر اساس داده‌های Wi-Fi و دکل‌های مخابراتی ارائه می‌دهد.

When In Use و Always در iOS

When In Use (هنگام استفاده) به برنامه اجازه می‌دهد مختصات را فقط زمانی که روی صفحه باز است دریافت کند. Always (همیشه) حتی در حالت پس‌زمینه به موقعیت جغرافیایی دسترسی می‌دهد، اما نیاز به بررسی اجباری در App Store دارد. از iOS 14 به بعد، کاربر می‌تواند موقعیت‌یابی دقیق را برای هر برنامه از طریق کلید Precision جداگانه خاموش کند.

درخواست Location Permission در Android

درخواست Location Permission در Android در دو مرحله انجام می‌شود: اعلام مجوزها در مانیفست و درخواست زمان اجرا در کد. از Android 6.0 (API 23) به بعد، همه مجوزهای خطرناک در حین کار برنامه درخواست می‌شوند، نه هنگام نصب.

اعلام در مانیفست

اولین قدم افزودن مجوزهای لازم به فایل AndroidManifest.xml است. برای موقعیت‌یابی دقیق و تقریبی از ثابت‌های مختلفی استفاده می‌شود.

xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

درخواست زمان اجرا در Kotlin

پس از اعلام در مانیفست، باید دیالوگ سیستمی درخواست مجوز را در کد برنامه فراخوانی کرد. بیایید مثالی در Kotlin با استفاده از Activity Result API را بررسی کنیم.

kotlin
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، باید کاربر را به تنظیمات سیستم هدایت کرد.

kotlin
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

درخواست Location Permission در iOS نیاز به افزودن کلیدهای ویژه به فایل Info.plist و فراخوانی متد کلاس CLLocationManager دارد. Apple توجه ویژه‌ای به حریم خصوصی دارد، بنابراین متن توضیح در دیالوگ درخواست باید تا حد امکان مشخص باشد.

پیکربندی Info.plist

برای درخواست موقعیت در iOS، باید یک یا هر دو کلید را به Info.plist اضافه کرد: NSLocationWhenInUseUsageDescription برای دسترسی هنگام استفاده و NSLocationAlwaysAndWhenInUseUsageDescription برای دسترسی پس‌زمینه. مقدار هر کلید رشته‌ای است که به کاربر در دیالوگ نمایش داده می‌شود.

xml
<key>NSLocationWhenInUseUsageDescription</key>
<string>برنامه به موقعیت مکانی شما برای نمایش نزدیک‌ترین نقاط روی نقشه نیاز دارد.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>برنامه برای ردیابی مسیر به دسترسی به موقعیت جغرافیایی در پس‌زمینه نیاز دارد.</string>

درخواست در Swift

در کد Swift، درخواست از طریق نمونه CLLocationManager انجام می‌شود. بسته به سطح دسترسی مورد نیاز، requestWhenInUseAuthorization یا requestAlwaysAuthorization فراخوانی می‌شود.

swift
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)، این رویکرد نرخ تبدیل رضایت را ۲۵-۳۵٪ افزایش می‌دهد.

Always را بدون نیاز درخواست نکنید

دسترسی پس‌زمینه به موقعیت جغرافیایی فقط برای برنامه‌هایی که در پس‌زمینه کار می‌کنند لازم است: مسیریاب‌ها، ردیاب‌های فعالیت، برنامه‌های تحویل. اگر برنامه شما فقط زمانی که صفحه باز است به مختصات نیاز دارد، When In Use را درخواست کنید. App Store برنامه را رد می‌کند اگر Always از نظر عملکردی توجیه نشده باشد. در Android، دسترسی پس‌زمینه additionally از طریق مجوز ACCESS_BACKGROUND_LOCATION تنظیم می‌شود.

سوالات متداول

اگر کاربر Location Permission را رد کند چه اتفاقی می‌افتد؟

برنامه باید انصراف را به درستی مدیریت کرده و سناریوی جایگزینی ارائه دهد. مثلاً ورود دستی آدرس یا تعیین شهر با آدرس IP. دیالوگ سیستمی مجدداً نمایش داده نمی‌شود — باید کاربر را به تنظیمات هدایت کرد.

آیا می‌توان Location Permission را بدون توضیح درخواست کرد؟

از نظر فنی بله، دیالوگ سیستمی را می‌توان بدون صفحه قبلی فراخوانی کرد. با این حال نرخ تبدیل رضایت بدون توضیح ۳۰-۴۰٪ است، در حالی که با صفحه قبلی ۶۰-۷۵٪ است. Apple و Google توصیه می‌کنند همیشه دلیل درخواست را توضیح دهید.

چگونه وضعیت Location Permission را در Android بررسی کنیم؟

از ContextCompat.checkSelfPermission با ثابت Manifest.permission.ACCESS_FINE_LOCATION استفاده کنید. متد PERMISSION_GRANTED یا PERMISSION_DENIED را بازمی‌گرداند که امکان تعیین وضعیت فعلی را بدون فراخوانی دیالوگ سیستمی فراهم می‌کند.

تفاوت ACCESS_FINE_LOCATION با ACCESS_COARSE_LOCATION چیست؟

ACCESS_FINE_LOCATION دسترسی به مختصات دقیق GPS با خطای ۳-۱۰ متر را فراهم می‌کند. ACCESS_COARSE_LOCATION موقعیت تقریبی را با دقت تا ۵۰۰ متر بر اساس Wi-Fi و دکل‌های مخابراتی ارائه می‌دهد. در Android 12+، توسعه‌دهنده می‌تواند هر دو مجوز را همزمان درخواست کند.

آیا برای اسکنرهای BLE به Location Permission نیاز است؟

در Android برای اسکن دستگاه‌های BLE، ACCESS_FINE_LOCATION یا ACCESS_COARSE_LOCATION لازم است، زیرا سیگنال‌های BLE می‌توانند برای مثلث‌سازی موقعیت استفاده شوند. در iOS برای BLE مجوز Bluetooth کافی است، Location Permission لازم نیست.

نتیجه‌گیری

  • Location Permission — مکانیزم اصلی حفاظت از حریم خصوصی که دسترسی برنامه‌ها به موقعیت جغرافیایی دستگاه را تنظیم می‌کند.
  • سطوح دسترسی شامل هنگام استفاده (When In Use) و پس‌زمینه (Always) در iOS، و همچنین دقیق (ACCESS_FINE_LOCATION) و تقریبی (ACCESS_COARSE_LOCATION) در Android است.
  • Android نیاز به اعلام مجوزها در مانیفست و درخواست زمان اجرا از طریق Activity Result API از API 23 دارد.
  • iOS نیاز به افزودن کلیدها در Info.plist و فراخوانی متدهای CLLocationManager با ذکر اجباری دلیل در متن درخواست دارد.
  • Contextual request — بهترین روش که در آن دیالوگ در لحظه نیاز ظاهر می‌شود، نه هنگام راه‌اندازی برنامه.
  • Pre-permission screen نرخ تبدیل رضایت را ۲۵-۳۵٪ طبق داده‌های Appsflyer (2024) افزایش می‌دهد.
  • امتناع کاربر نیاز به graceful degradation — سناریوی جایگزین بدون استفاده از موقعیت جغرافیایی دارد.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید