Significant Location Change (SLC) سرویسی در iOS برای نظارت بر جابجاییهای بزرگ دستگاه است که تنها هنگام تغییرات قابل توجه در مختصات جغرافیایی به برنامه اعلان میدهد. برخلاف ردیابی GPS در زمان واقعی، SLC از دکلهای مخابراتی برای تعیین موقعیت مکانی استفاده میکند که حداقل مصرف انرژی را تضمین میکند. طبق مستندات Apple Developer, 2025، Significant Location Change به برنامه اجازه میدهد بدون کارکرد دائمی GPS بهروزرسانیهای موقعیت مکانی را دریافت کند و تا ۹۰٪ در مصرف باتری نسبت به ردیابی مداوم صرفهجویی نماید.
نکات اصلی
Significant Location Change (SLC) یک سرویس مکان کممصرف در iOS است که در فریمورک Core Location تعبیه شده است. این سرویس برای برنامههایی طراحی شده که نیاز به ردیابی جابجاییهای بزرگ کاربر بدون استفاده مداوم از ماژول GPS دارند. SLC به طور خودکار هنگام تغییر بین دکلهای مخابراتی فعال میشود و از طریق متد didUpdateLocations در پروتکل CLLocationManagerDelegate به برنامه اعلان میدهد.
برخلاف ردیابی GPS (استاندارد startUpdatingLocation)، SLC نیاز به فعالیت مداوم پردازنده و چیپ GPS ندارد. iOS از سیگنالهای دکلهای مخابراتی برای تعیین موقعیت تقریبی استفاده میکند و برنامه را تنها هنگام تشخیص تفاوت قابل توجه در مختصات راهاندازی میکند. این به برنامه اجازه میدهد بین بهروزرسانیها «خواب» باشد و حداقل انرژی مصرف کند.
SLC در تمام دستگاههای دارای ماژول مخابراتی از iOS 5 در دسترس است. در iPod Touch و iPad Wi-Only این سرویس در دسترس نیست، زیرا برای تعیین مختصات از دکلهای مخابراتی استفاده میشود. Core Location به طور خودکار تصمیم میگیرد کدام رویدادها قابل توجه هستند — توسعهدهنده نمیتواند حساسیت SLC را تنظیم کند یا حداقل فاصله را برای فعالسازی مشخص نماید.
SLC برای برنامههایی که نیاز به دقت بالای موقعیت مکانی ندارند ایدهآل است: ردیابهای آب و هوا، سرویسهای تحویل، برنامههای جستجوی مکانهای نزدیک، تحلیل مکانهای بازدید شده. SLC همچنین توسط سیستم iOS برای فعالسازی ژئوفنسینگ (Geofencing) در حالت صرفهجویی انرژی استفاده میشود. برنامههای ناوبری به ردیابی GPS دقیقتری نیاز دارند.
Significant Location Change بر اساس تحلیل شناسههای دکلهای مخابراتی (Cell ID) کار میکند که دستگاه هنگام اتصال به شبکه دریافت میکند. iOS پایگاه دادهای از مختصات دکلها را نگهداری میکند و میتواند موقعیت تقریبی را بدون فعالسازی GPS تعیین کند. هنگامی که دستگاه به دکل جدیدی متصل میشود، سیستم موقعیت جدید و قبلی را مقایسه میکند و اگر تفاوت قابل توجه باشد، برنامه را برای پردازش رویداد راهاندازی میکند.
سیستم از رویکرد خوشهای استفاده میکند: فضای جغرافیایی به خوشههایی با شعاع مشخص تقسیم میشود. SLC تنها هنگام عبور از مرز خوشه رویداد تولید میکند، نه در هر جابجایی کوچک درون آن. این کار از فراخوانیهای مکرر برنامه در حین حرکت در یک منطقه تحت پوشش (مثلاً در یک ساختمان یا محله) جلوگیری میکند. دقت SLC از ۵۰۰ متر تا چند کیلومتر بسته به تراکم دکلهای مخابراتی متغیر است.
هنگامی که iOS یک تغییر قابل توجه تشخیص میدهد، برنامه را از حالت پسزمینه بیدار میکند (اگر در حال اجرا نباشد) و رویداد را به پروتکل Core Location ارسال میکند. برنامه زمان کوتاهی برای پردازش دارد (حدود ۱۰–۳۰ ثانیه زمان پسزمینه) — در این مدت باید مختصات را پردازش کرده و در صورت لزوم، بهروزرسانی دقیقتری از طریق GPS برنامهریزی کند.
SLC دارای امتیاز بیدار کردن برنامه از حالت Suspended یا Background است. اگر برنامه توسط سیستم به دلیل کمبود حافظه بسته شده باشد، SLC آن را در پسزمینه مجدداً راهاندازی میکند (relaunch). برای این کار، برنامه باید در متد didFinishLaunchingWithOptions برای UIApplication.LaunchOptionsKey.location ثبت نام کرده باشد. پس از پردازش رویداد، سیستم میتواند دوباره برنامه را به حالت Suspended برگرداند.
محرکهای SLC منحصراً توسط سیستم iOS تعیین میشوند — توسعهدهنده نمیتواند به صورت برنامهنویسی بر این که چه تغییری در مختصات «قابل توجه» محسوب شود تأثیر بگذارد. با این حال، سناریوهای مستندی وجود دارند که در آنها SLC به طور تضمینی رویداد تولید میکند. درک این محرکها به توسعهدهنده در طراحی رفتار صحیح برنامه کمک میکند.
تغییر دکل مخابراتی (Cell tower change) — محرک اصلی SLC. هنگامی که دستگاه بین دکلهای مخابراتی جابجا میشود (در حین حرکت در شهر، جاده)، سیستم بررسی میکند که آیا مختصات بین دکل قدیم و جدید به اندازه کافی تغییر کرده است. اگر بله — رویداد تولید میشود. در شرایط شهری با شبکه متراکم دکلها، SLC ممکن است هر ۱–۳ کیلومتر فعال شود.
اگر هر برنامه دیگری یا سرویس سیستمی (مثلاً «Find My iPhone»، ناوبری) ماژول GPS را فعال کند، SLC نیز ممکن است بهروزرسانی مختصات دقیق دریافت کند. این یک اثر جانبی است: GPS موقعیت دقیق را تعیین میکند و iOS آن را به تمام برنامههای ثبت شده برای SLC ارسال میکند. با این حال، نباید به این محرک تکیه کرد — تضمینشده نیست.
اگرچه SLC مستقیماً از Wi-Fi استفاده نمیکند، تغییر شبکه Wi-Fi ممکن است به طور غیرمستقیم باعث رویداد شود اگر دستگاه مختصات جدیدی را از طریق Apple Location Service دریافت کند (موقعیت بر اساس پایگاه داده Wi-Fi). iOS مختصات نقاط دسترسی Wi-Fi را هش میکند و از آنها برای بهبود موقعیت بین تغییرات دکلها استفاده میکند.
| محرک | تضمین | تأخیر | دقت |
|---|---|---|---|
| تغییر دکل مخابراتی | زیاد | ۱–۳۰ ثانیه | ۵۰۰ متر – ۳ کیلومتر |
| GPS برنامههای دیگر | کم | فوری | تا ۱۰ متر |
| تغییر Wi-Fi | متوسط | تا ۵ دقیقه | ۱۰۰–۵۰۰ متر |
iOS چندین مکانیزم برای دریافت موقعیت مکانی ارائه میدهد که هر یک دقت، مصرف انرژی و سناریوهای استفاده خاص خود را دارند. Significant Location Change در جایگاهی بین تقریب درشت بر اساس دکلها و ردیابی دقیق GPS قرار دارد و تعادل بهینهای را برای برنامههایی که نیاز به دقت بالا در زمان واقعی ندارند فراهم میکند.
Standard Location Service (startUpdatingLocation()) از GPS، Wi-Fi و دکلهای مخابراتی برای تعیین مختصات با حداکثر دقت استفاده میکند. دقت تا ۱۰ متر است، اما مصرف انرژی بالا است — ماژول GPS دائماً فعال است. مناسب برای ناوبری، ردیابهای تناسب اندام، برنامههای AR. SLC در مقابل، از GPS به طور مداوم استفاده نمیکند و دقت ۵۰۰ متر و پایینتر دارد.
Region Monitoring ورود و خروج از مناطق جغرافیایی مشخص را ردیابی میکند. برخلاف SLC، توسعهدهنده خود مرزهای مناطق را تعیین میکند (شعاع از ۱۰۰ متر). Geofencing از SLC به عنوان مکانیزم کمکی استفاده میکند — سیستم ابتدا موقعیت تقریبی را از طریق SLC تعیین میکند و سپس GPS را برای تشخیص دقیق ورود/خروج از منطقه فعال میکند. حداکثر تعداد مناطق قابل ردیابی — ۲۰ عدد.
Visit Monitoring یک سرویس تخصصی iOS 8+ است که بازدید از مکانها (ورود و خروج) را ردیابی میکند. این سرویس از ترکیب SLC و سایر سیگنالها برای تشخیص زمانی که کاربر در مکانی توقف کرده و زمانی که آن را ترک کرده استفاده میکند. Visit Monitoring نسبت به SLC کممصرفتر است، زیرا رویدادهای کمتری تولید میکند و از یادگیری ماشین روی دستگاه استفاده میکند.
| سرویس | دقت | مصرف انرژی | پسزمینه |
|---|---|---|---|
| SLC | ۵۰۰ متر – ۳ کیلومتر | بسیار کم | بله |
| Standard GPS | تا ۱۰ متر | زیاد | نیاز به مجوز دارد |
| Geofencing | از ۱۰۰ متر | کم | بله |
| Visit Monitoring | تا ۱۰۰ متر | بسیار کم | بله |
SLC — کممصرفترین روش دریافت موقعیت مکانی در iOS است، به جز Visit Monitoring. طبق دادههای Apple، SLC حدود ۰٫۱–۰٫۵٪ شارژ باتری در ساعت در سناریوی استفاده معمولی مصرف میکند، در حالی که ردیابی مداوم GPS ممکن است ۵–۱۰٪ در ساعت مصرف کند. صرفهجویی به این دلیل حاصل میشود که ماژول GPS فقط برای مدت کوتاهی برای تأیید مختصات در هر رویداد روشن میشود.
iOS مصرف انرژی SLC را از طریق بهینهسازی باتری مدیریت میکند. اگر سیستم متوجه شود که برنامه بیش از حد مکرر رویدادهای SLC را پردازش میکند (مثلاً دستگاه در قطار در حال حرکت است و تغییر مکرر دکلها رویدادهای زیادی تولید میکند)، iOS ممکن است به طور موقت فرکانس اعلانها را کاهش دهد. این یک مکانیزم خودکار است — توسعهدهنده نمیتواند آن را غیرفعال کند.
با هر نسخه اصلی iOS، Apple سیاست دسترسی پسزمینه به مکان را سختگیرانهتر میکند. از iOS 13، دیالوگ سیستمی درخواست مجوز برای استفاده پسزمینه از مکان تغییر کرده است: کاربر باید صریحاً «همیشه» (Always) را انتخاب کند، نه فقط «هنگام استفاده از برنامه» (While Using). بدون مجوز Always، SLC در زمانی که برنامه در پسزمینه است یا توسط سیستم بسته شده کار نخواهد کرد.
بیایید یک پیادهسازی کامل از Significant Location Change در Swift را بررسی کنیم. مثال شامل راهاندازی CLLocationManager، درخواست مجوز Always، شروع مانیتورینگ، پردازش رویدادها و پشتیبانی از راهاندازی مجدد برنامه پس از بسته شدن توسط سیستم است. کد از Swift مدرن با async/await برای پردازش مختصات و وظایف پسزمینه از طریق BGTaskScheduler استفاده میکند.
import CoreLocation
import UIKit
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.pausesLocationUpdatesAutomatically = true
manager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
}
func requestAlwaysAuthorization() {
manager.requestAlwaysAuthorization()
}
func startSignificantLocationUpdates() {
manager.startMonitoringSignificantLocationChanges()
}
func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
Task.detached {
await LocationProcessor.handleLocationUpdate(location)
}
}
func locationManager(_ manager: CLLocationManager,
didFailWithError error: Error) {
Logger.log("SLC error: \(error.localizedDescription)")
}
}
اگر برنامه توسط سیستم بسته شده باشد، SLC به طور خودکار آن را با وقوع رویداد جدید مجدداً راهاندازی میکند. در AppDelegate باید بررسی برای راهاندازی بر اساس رویداد مکان از طریق UIApplication.LaunchOptionsKey.location اضافه شود. پس از راهاندازی مجدد، برنامه باید CLLocationManager را مقداردهی اولیه کرده و برای ادامه مانیتورینگ startMonitoringSignificantLocationChanges() را فراخوانی کند.
class AppDelegate: NSObject, UIApplicationDelegate {
private let manager = LocationManager()
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if launchOptions?.keys.contains(.location) == true {
Logger.log("App relaunched by SLC event")
}
manager.requestAlwaysAuthorization()
manager.startSignificantLocationUpdates()
return true
}
}
استفاده صحیح از Significant Location Change نیاز به تعادل بین عملکرد و بهرهوری انرژی دارد. Apple به شدت دسترسی پسزمینه به مکان را کنترل میکند و برنامههایی که از SLC سوءاستفاده میکنند یا بدون نیاز آشکار از آن استفاده میکنند، خطر رد شدن در هنگام انتشار در App Store را دارند.
در Info.plist باید رشتههای توضیحی اضافه کنید: NSLocationAlwaysAndWhenInUseUsageDescription و NSLocationWhenInUseUsageDescription. توضیح باید به وضوح دلیل نیاز برنامه به دسترسی پسزمینه به مکان را بیان کند. App Review این رشتهها را میخواند و ممکن است برنامه را رد کند اگر توضیح کافی نباشد یا عبارات مبهم باشند. مثال: «این برنامه از SLC برای بهروزرسانی پیشبینی آب و هوا هنگام جابجایی شما استفاده میکند.»
در هر رویداد SLC عملیات سنگین (موقعیت GPS، درخواستهای شبکه) را اجرا نکنید. SLC ممکن است دهها رویداد در ساعت هنگام حرکت در وسیله نقلیه تولید کند. از Debouncing استفاده کنید: زمان آخرین بهروزرسانی کامل را ذخیره کرده و پردازش را رد کنید اگر از بهروزرسانی قبلی کمتر از ۵–۱۰ دقیقه گذشته باشد. این کار باتری و ترافیک شبکه را حفظ میکند.
برای پردازش طولانی پس از رویداد SLC از BGTaskScheduler استفاده کنید. هنگامی که برنامه رویداد SLC را دریافت میکند، میتواند یک وظیفه پسزمینه را از طریق BGProcessingTaskRequest یا BGAppRefreshTaskRequest برنامهریزی کند. این امکان تأخیر عملیات منابعی (همگامسازی با سرور، تحلیل مسیر) را تا نزدیکترین پنجره اجرای پسزمینه فراهم میکند بدون اینکه رشته اصلی پاسخ به SLC مسدود شود.
سؤالات متداول
Significant Location Change (SLC) یک سرویس کممصرف iOS برای نظارت بر جابجاییهای بزرگ دستگاه بر اساس دکلهای مخابراتی است. این سرویس تا ۹۰٪ انرژی کمتری نسبت به ردیابی مداوم GPS مصرف میکند و برای برنامههایی که نیاز به دقت بالای موقعیت مکانی ندارند مناسب است.
دقت SLC از ۵۰۰ متر تا ۳ کیلومتر بسته به تراکم دکلهای مخابراتی متغیر است. در شرایط شهری دقت بالاتر است (نزدیک به ۵۰۰ متر)، در مناطق روستایی — پایینتر (تا چند کیلومتر). SLC برای تعیین دقیق مختصات طراحی نشده است — این یک منبع برای نظارت تقریبی جابجاییها است.
پس از اضافه کردن رشته NSLocationAlwaysAndWhenInUseUsageDescription در Info.plist، CLLocationManager.requestAlwaysAuthorization() را فراخوانی کنید. از iOS 13، کاربر باید صریحاً «همیشه» (Always) را در دیالوگ سیستمی انتخاب کند. بدون این مجوز SLC در پسزمینه کار نمیکند.
بله، SLC میتواند برنامهای را که توسط سیستم به دلیل کمبود حافظه بسته شده مجدداً راهاندازی کند. در هنگام راهاندازی، UIApplication.LaunchOptionsKey.location را در متد didFinishLaunchingWithOptions بررسی کنید و برای ادامه مانیتورینگ startMonitoringSignificantLocationChanges() را فراخوانی کنید.
SLC فقط از دکلهای مخابراتی استفاده میکند و GPS را دائماً فعال نمیکند که تا ۹۰٪ صرفهجویی در باتری دارد. دقت — از ۵۰۰ متر تا ۳ کیلومتر. Standard Location Service از GPS، Wi-Fi و دکلها استفاده میکند، دقت تا ۱۰ متر دارد اما انرژی بسیار بیشتری مصرف میکند. SLC برای مانیتورینگ پسزمینه مناسب است، GPS — برای ناوبری.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید