Ini adalah bagian dari dokumentasi CLLocationManager yang menjelaskan perilaku aplikasi dengan startMonitoringSignificantLocationChanges :
Jika Anda memulai layanan ini dan aplikasi Anda kemudian dihentikan, sistem secara otomatis meluncurkan kembali aplikasi ke latar belakang jika acara baru tiba. Dalam kasus seperti itu, kamus opsi diteruskan ke application: didFinishLaunchingWithOptions: metode delegasi aplikasi Anda berisi kunci UIApplicationLaunchOptionsLocationKey untuk menunjukkan bahwa aplikasi Anda diluncurkan karena peristiwa lokasi. Setelah peluncuran ulang, Anda masih harus mengonfigurasi objek pengelola lokasi dan memanggil metode ini untuk terus menerima peristiwa lokasi. Saat Anda memulai ulang layanan lokasi, acara saat ini dikirimkan ke delegasi Anda segera. Selain itu, properti lokasi objek pengelola lokasi Anda diisi dengan objek lokasi terbaru bahkan sebelum Anda memulai layanan lokasi.
Jadi pemahaman saya adalah bahwa jika aplikasi Anda berhenti (dan saya berasumsi jika Anda tidak memanggil stopMonitoringSignificantLocationChanges dari applicationWillTerminate ) Anda akan terbangun dengan parameter UIApplicationLaunchOptionsLocationKey ke application: didFinishLaunchingWithOptions . Kemudian Anda membuat CLLocationManager , panggil startMonitoringSignificantLocationChanges dan lakukan pemrosesan lokasi latar belakang untuk terbatas . Jadi saya baik-baik saja dengan bagian ini.
Paragraf sebelumnya hanya berbicara tentang apa yang terjadi ketika aplikasi dihentikan, tidak menyarankan apa yang Anda lakukan ketika aplikasi ditangguhkan. Dokumentasi untuk didFinishLaunchingWithOptions mengatakan:
Aplikasi melacak pembaruan lokasi di latar belakang, dihapus, dan sekarang telah diluncurkan kembali. Dalam kasus ini, kamus berisi kunci yang menunjukkan bahwa aplikasi diluncurkan kembali karena acara lokasi baru.
Menyarankan bahwa Anda hanya akan menerima panggilan ini saat aplikasi Anda diluncurkan (karena perubahan lokasi) setelah Anda dihentikan.
Namun paragraf di Layanan Perubahan Signifikan dalam Panduan Pemrograman Kesadaran Lokasi mengatakan hal berikut:
Jika Anda membiarkan layanan ini berjalan dan aplikasi Anda kemudian ditangguhkan atau dihentikan, layanan secara otomatis membangunkan aplikasi Anda saat data lokasi baru tiba. Saat bangun, aplikasi Anda diletakkan di latar belakang dan diberi sedikit waktu untuk memproses data lokasi. Karena aplikasi Anda berada di latar belakang, aplikasi tersebut harus melakukan pekerjaan minimal dan menghindari tugas apa pun (seperti membuat kueri jaringan) yang mungkin mencegahnya kembali sebelum waktu yang dialokasikan berakhir. Jika tidak, aplikasi Anda dapat dihentikan.
Ini menunjukkan Anda dibangunkan dengan data lokasi jika aplikasi Anda telah ditangguhkan, tetapi gagal menyebutkan bagaimana Anda dibangunkan:
- Apakah itu UIApplicationDelegate mendapatkan panggilan balik yang memberi tahu saya bahwa saya melanjutkan dari status ditangguhkan ke status latar belakang?
- Apakah pengelola lokasi (yang dibekukan saat aplikasi ditangguhkan) mulai menerima callback locationManager: didUpdateToLocation: fromLocation ?
- Apakah saya hanya perlu menerapkan kode dalam pesan didUpdateToLocation saya yang memeriksa status aplikasi dan melakukan pemrosesan minimal jika dalam mode latar belakang?
Dalam proses penulisan ini, saya pikir saya mungkin baru saja menjawab pertanyaan saya sendiri, tetapi akan sangat bagus jika pemahaman saya tentang ini dikonfirmasi oleh seseorang yang lebih berpengetahuan.
sumber
didExitRegion
panggilan balik tetapi saya tidak dapatstartLocationUpdates
dari sana karena tidak melalui peluncuran aplikasi ...Pemahaman saya adalah sebagai berikut (Saya sedang dalam proses menulis aplikasi yang mengandalkan API ini, tetapi belum menyelesaikan komponen ini cukup untuk memulai pengujian):
Meskipun dimatikan di latar belakang, OS akan meluncurkan kembali aplikasi Anda. Jika aplikasi Anda hanya diluncurkan oleh OS untuk suatu perubahan, Anda akan mendapatkan panggilan ke application didFinishLaunchingWithOptions :
akan membantu Anda menentukan apakah Anda kembali dari perubahan lokasi latar belakang.
Terlepas dari bagaimana hal itu terjadi, saat aplikasi Anda diluncurkan kembali (kecuali jika masih berjalan di latar belakang sebagai akibat dari tugas latar belakang dan tugas tersebut telah mulai memantau perubahan), Anda perlu secara eksplisit memberitahukannya ke startMonitoringSignificantLocationChanges lagi karena callback tidak ada lebih lama dipasang setelah "pengeringan beku". Dan ya, Anda hanya perlu mengimplementasikan kode dalam didUpdateToLocation setelah Anda memasang kembali penangan lokasi setelah kembali dari status ditangguhkan.Inilah yang saya lakukan dengan pengembangan kode saya sekarang. Seperti yang saya sebutkan sebelumnya, saya belum cukup siap untuk menguji ini pada perangkat jadi saya tidak tahu apakah saya telah menafsirkan semuanya dengan benar, jadi pemberi komentar, jangan ragu untuk mengoreksi saya (meskipun saya telah membaca substansial pada tema).
Oh, dan jika karena sedikit kesialan, Anda merilis aplikasi yang melakukan apa yang saya ingin saya lakukan, saya mungkin menangis :)
Semoga berhasil!
sumber
Jika aplikasi muncul dari status ditangguhkan sebagai akibat dari perubahan lokasi, aplikasi akan diluncurkan dalam status latar belakang.
Semua objek akan ditayangkan dan Anda akan menerima pembaruan lokasi pada delegasi yang ada.
sumber