GPS و سرویسهای موقعیتیابی در برنامههای موبایل — API برای تعیین موقعیت فیزیکی دستگاه با استفاده از ماهوارهها، Wi-Fi و شبکههای موبایل است. بر اساس Google Android Location Guide (2025)، بیش از 60٪ از برنامههای موبایل از دادههای موقعیت برای شخصیسازی محتوا استفاده میکنند. Fused Location Provider در Android چندین منبع را برای افزایش دقت و کاهش مصرف انرژی ترکیب میکند.
نکات کلیدی
GPS (Global Positioning System) — یک سیستم ناوبری ماهوارهای شامل 31 ماهواره فعال در مدار با ارتفاع تقریبی 20 200 کیلومتر است. در دستگاههای موبایل، تراشه GPS سیگنالهای ماهوارهها را دریافت کرده و مختصات را بر اساس سهجانبهیابی — اندازهگیری زمان انتشار سیگنال از چندین ماهواره — محاسبه میکند. سرویسهای موقعیتیابی در سیستمعاملهای موبایل دادههای نقاط دسترسی Wi-Fi و دکلهای مخابراتی را به GPS اضافه میکنند تا تعیین مختصات را تسریع کنند (A-GPS) و دقت را در داخل ساختمان بهبود بخشند. طبق دادههای GPS.gov (2024)، دقت GPS غیرنظامی 3-5 متر در آسمان صاف و تا 15 متر در شرایط تراکم ساختمانی است.
دستگاههای موبایل مدرن نه تنها از سیستم GPS آمریکا، بلکه از سایر سیستمهای ناوبری جهانی نیز پشتیبانی میکنند: GLONASS روسیه (24 ماهواره)، Galileo اروپا (28 ماهواره) و BeiDou چین. پشتیبانی همزمان از چندین سیستم، دقت و سرعت تعیین مختصات را افزایش میدهد — دستگاه میتواند از حداکثر 40 ماهواره از سیستمهای مختلف برای محاسبه موقعیت استفاده کند. در iOS و Android انتخاب سیستم ماهوارهای به طور خودکار در سطح تراشه سختافزاری انجام میشود و توسعهدهنده نیازی به مدیریت آن ندارد.
فرآیند تعیین موقعیت در دستگاه موبایل از چند مرحله تشکیل شده است: جمعآوری داده از منابع (ماهوارهها، Wi-Fi، شبکههای موبایل)، فیلتر کردن و تصحیح خطاها، محاسبه مختصات و ارسال نتیجه به برنامه. سیستمعامل این فرآیند را از طریق یک سرویس موقعیتیابی واحد مدیریت میکند که کار همه منابع را برای صرفهجویی در باتری بهینه میسازد. در زیر سه منبع اصلی دادههای موقعیت توضیح داده شده است.
ناوبری ماهوارهای حداکثر دقت (3-5 متر) را فراهم میکند، اما نیاز به دید مستقیم آسمان دارد. در داخل ساختمان یا مناطق شهری متراکم، سیگنال GPS ممکن است ضعیف شده یا کاملاً از بین برود. زمان اولین تعیین موقعیت (TTFF) در شروع سرد 30-60 ثانیه و در شروع گرم 5-10 ثانیه است. A-GPS (Assisted GPS) با بارگذاری اطلاعات مداری ماهوارهها از طریق اینترنت به جای انتظار برای داده از ماهوارهها، شروع کار را تسریع میکند.
Wi-Fi موقعیتیابی از پایگاه داده آدرسهای MAC نقاط دسترسی با مختصات مشخص استفاده میکند. دقت در محدوده پوشش Wi-Fi 10-50 متر است. دکلهای مخابراتی بسته به تراکم دکلها، دقت 100 متر تا چند کیلومتر را ارائه میدهند. ترکیب همه منابع (Fused Location) امکان دریافت مختصات با دقت مناسب با حداقل مصرف انرژی را فراهم میکند — به ویژه زمانی که تراشه GPS خاموش است یا سیگنال ماهواره در دسترس نیست.
در هر دو پلتفرم، سرویسهای موقعیتیابی از طریق APIهای سیستمی با درجات مختلف انتزاع پیادهسازی میشوند. Android از FusedLocationProviderClient از Google Play Services استفاده میکند، iOS از CLLocationManager از Core Location. هر دو API امکان درخواست موقعیت یکباره یا اشتراک در بهروزرسانیهای منظم را فراهم میکنند. در زیر نمونهای از دریافت مختصات در Android با استفاده از Fused Location Provider به زبان Kotlin آورده شده است.
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("موقعیت", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
در مثال، LocationRequest با اولویت HIGH_ACCURACY پیکربندی میشود — این کار GPS را برای حداکثر دقت فعال میکند. setIntervalMillis فاصله بهروزرسانی مطلوب (5 ثانیه) را تعیین میکند، setMinUpdateIntervalMillis — حداقل (2 ثانیه). callback onLocationResult هر بار که سیستم مختصات جدیدی دریافت میکند فراخوانی میشود. بررسی مجوز قبل از فراخوانی requestLocationUpdates مهم است — در غیر این صورت برنامه با SecurityException از کار میافتد.
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// MARK: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
در iOS desiredAccuracy دقت درخواست را تعیین میکند: kCLLocationAccuracyBest از تمام منابع موجود (GPS + Wi-Fi + شبکههای موبایل) استفاده میکند. پس از درخواست مجوز از طریق requestWhenUseAuthorization، سیستم یک دیالوگ به کاربر نشان میدهد. delegate didUpdateLocations آرایهای از اشیاء CLLocation با مختصات، ارتفاع، سرعت و جهت دریافت میکند. برای توقف بهروزرسانیها، stopUpdatingLocation فراخوانی میشود تا در مصرف باتری صرفهجویی شود.
دسترسی به موقعیتیابی نیاز به اجازه صریح کاربر در هر دو پلتفرم دارد. در Android از مجوزهای ACCESS_FINE_LOCATION (GPS) و ACCESS_COARSE_LOCATION (Wi-Fi/شبکههای موبایل) استفاده میشود. از Android 10 به بعد، دسترسی پسزمینه نیاز به مجوز جداگانه ACCESS_BACKGROUND_LOCATION دارد. در iOS سه سطح در دسترس است: requestWhenInUseAuthorization (فقط هنگام استفاده از برنامه)، requestAlwaysAuthorization (در پسزمینه) و برچسبهای زمانی برای موقعیتیابی دقیق. Apple توضیحات اجباری در Info.plist را الزامی میکند: NSLocationWhenInUseUsageDescription یا NSLocationAlwaysAndWhenInUseUsageDescription. بدون این کلیدها، درخواست مجوز نادیده گرفته میشود.
استفاده مداوم از GPS به طور قابل توجهی شارژ باتری را کاهش میدهد — تا 30٪ در یک ساعت کار مداوم با حداکثر دقت. برای بهینهسازی مصرف انرژی، توصیه میشود فقط زمانی که لازم است از موقعیتیابی استفاده کرده و هنگام رفتن برنامه به پسزمینه، بهروزرسانیها را متوقف کنید. در Android، FusedLocationProviderClient به طور خودکار بین GPS و منابع شبکهای بسته به در دسترس بودن و اولویت درخواست جابهجا میشود. در iOS از سرویس تغییر مکان قابل توجه (startMonitoringSignificantLocationChanges) برای بهروزرسانیهای با حداقل مصرف انرژی استفاده کنید — دقت کمتر است (تا 500 متر)، اما باتری تقریباً مصرف نمیشود. همچنین پردازش دستهای را تمرین کنید: مختصات را با فاصله 5-10 دقیقه جمعآوری کرده و با یک درخواست از طریق WorkManager در Android یا BGTaskScheduler در iOS به سرور ارسال کنید. کاهش فرکانس درخواستها از 1 ثانیه به 30 ثانیه مصرف انرژی موقعیتیابی را 85٪ کاهش میدهد.
موقعیتیابی در طیف گستردهای از برنامههای موبایل از مسیریابها گرفته تا خدمات تحویل استفاده میشود. رایجترین سناریوها شامل نمایش کاربر روی نقشه، هدفیابی جغرافیایی تبلیغات، ردیابی پیکها، محدودههای جغرافیایی برای اعلانهای push و ردیابی فعالیتهای تناسب اندام است. هر سناریو رویکرد خاص خود را به دقت و تناوب بهروزرسانی نیاز دارد. در زیر جدولی با توصیههای تنظیمات برای انواع مختلف برنامهها آورده شده است.
| نوع برنامه | دقت | فاصله | حالت پسزمینه |
|---|---|---|---|
| مسیریاب | HIGH (GPS) | 1-2 ثانیه | بله |
| تحویل | BALANCED (GPS+Wi-Fi) | 10-30 ثانیه | بله |
| آب و هوا | LOW (Wi-Fi/شبکههای موبایل) | یکبار | خیر |
| شبکه اجتماعی | BALANCED | هنگام باز شدن | خیر |
| تناسب اندام | HIGH (GPS) | 5-10 ثانیه | بله |
در طراحی قابلیت موقعیتیابی مهم است در نظر بگیرید که کاربران میتوانند در هر لحظه مجوز را از طریق تنظیمات سیستم لغو کنند. برنامه باید شرایطی را که موقعیتیابی در دسترس نیست به درستی مدیریت کرده و توضیح قابل فهمی نشان دهد که چرا قابلیت محدود شده است.
Geofencing — فناوری ایجاد مرزهای مجازی روی نقشه است که با عبور از آنها برنامه اعلان دریافت میکند. در Android، محدودههای جغرافیایی از طریق GeofencingClient از Google Play Services پیادهسازی میشوند، در iOS — از طریق CLCircularRegion از Core Location. هنگام ورود یا خروج از محدوده، سیستم برنامه را بیدار کرده و رویداد را ارسال میکند، حتی اگر برنامه بسته یا کوچک شده باشد. این برای اعلانهای push هنگام نزدیک شدن به فروشگاه، یادآوری وظایف بر اساس موقعیت و خودکارسازی دستگاههای IoT استفاده میشود. حداکثر تعداد محدودههای جغرافیایی محدود است: در Android — 100، در iOS — 20 همزمان. حداقل شعاع محدوده 50 متر در هر دو پلتفرم است، در غیر این صورت سیستم ممکن است به دلیل خطای تعیین موقعیت فعال نشود. هنگام ورود به محدوده، سیستم Intent را در Android راهاندازی میکند یا delegate locationManager:didEnterRegion را در iOS فراخوانی میکند.
سوالات متداول
GPS در گوشی هوشمند یک گیرنده داخلی سیگنالهای سیستم ناوبری ماهوارهای است که مختصات را با دقت 3-5 متر تعیین میکند. در دستگاهها همچنین GLONASS، Galileo و BeiDou برای افزایش دقت و سرعت موقعیتیابی در دسترس هستند.
GPS فقط روش ماهوارهای تعیین مختصات است. سرویسهای موقعیتیابی GPS، موقعیتیابی Wi-Fi و دادههای دکلهای مخابراتی را برای تعیین سریعتر و کممصرفتر موقعیت، به ویژه در داخل ساختمان، ترکیب میکنند.
requestWhenInUseAuthorization() یا requestAlwaysAuthorization() را روی نمونه CLLocationManager فراخوانی کنید. قبلاً NSLocationWhenInUseUsageDescription را با متن قابل فهم دلیل استفاده از موقعیتیابی به Info.plist اضافه کنید.
از FusedLocationProviderClient در Android و سرویس تغییر مکان قابل توجه در iOS استفاده کنید. فاصله بین درخواستها را به 10-30 ثانیه افزایش دهید، هنگام خاموش بودن صفحه بهروزرسانیها را غیرفعال کنید و ارسال دستهای مختصات به سرور را اعمال کنید.
بله، بدون GPS میتوان موقعیت تقریبی را از طریق نقاط دسترسی Wi-Fi (دقت 10-50 متر) یا دکلهای مخابراتی (دقت 100-5000 متر) تعیین کرد. در Android برای این کار از ACCESS_COARSE_LOCATION استفاده میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید