Saya memicu pengambilan latar belakang dengan menggunakan content-available
bendera pada pemberitahuan push. Saya memiliki fetch
dan remote-notification
UIBackgroundModes
mengaktifkan.
Berikut ini adalah implementasi yang saya gunakan di AppDelegate.m saya:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Ketika aplikasi berjalan di latar belakang, itu berfungsi dengan baik. (Pemberitahuan diterima dan aplikasi memicu pemberitahuan lokal "sepertinya saya mendapat pemberitahuan", seperti yang harus dilakukan kode di atas).
Namun, ketika aplikasi tidak berjalan dan pemberitahuan push diterima dengan content-available
bendera, aplikasi tidak diluncurkan dan didRecieveRemoteNotification
metode delegasi tidak pernah dipanggil.
Video WWDC Whats New With Multitasking (# 204 dari WWDC 2013) menunjukkan ini:
Dikatakan bahwa aplikasi "diluncurkan ke latar belakang" ketika pemberitahuan push diterima dengan content-available
bendera.
Mengapa aplikasi saya tidak diluncurkan ke latar belakang?
Jadi pertanyaan sebenarnya adalah:
Apakah iOS akan melakukan tugas latar belakang setelah pengguna keluar dari aplikasi secara paksa?
sumber
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Jawaban:
UPDATE2:
Anda dapat mencapai ini menggunakan kerangka kerja PushKit baru, diperkenalkan di iOS 8. Meskipun PushKit digunakan untuk VoIP. Jadi penggunaan Anda harus untuk VoIP terkait jika tidak ada risiko penolakan aplikasi. (Lihat jawaban ini ).
UDPDATE1:
Dokumentasi telah diklarifikasi untuk iOS8 . Dokumentasi dapat dibaca di sini . Berikut adalah kutipan yang relevan:
Meskipun ini tidak dibuat jelas oleh video WWDC, pencarian cepat di forum pengembang menemukan ini:
https://devforums.apple.com/message/873265#873265 (wajib masuk)
Posting itu oleh karyawan Apple, jadi saya rasa saya bisa percaya bahwa informasi ini benar.
Jadi sepertinya ketika aplikasi terbunuh dari pengalih aplikasi (dengan menggesekkan ke atas), aplikasi tidak akan pernah diluncurkan, bahkan untuk menjadwalkan latar belakang yang dijadwalkan.
sumber
Anda dapat mengubah pengaturan peluncuran target Anda di "Kelola Skema"
Wait for <app>.app to be launched manually
, yang memungkinkan Anda melakukan debug dengan menetapkan breakpointapplication: didReceiveRemoteNotification: fetchCompletionHandler:
dan mengirimkan pemberitahuan push untuk memicu peluncuran latar belakang.Saya tidak yakin ini akan menyelesaikan masalah, tetapi mungkin membantu Anda dengan debugging untuk saat ini.
sumber
Jawabannya adalah YA, tetapi sebaiknya tidak menggunakan 'Background Fetch' atau 'Notifikasi jarak jauh'. PushKit adalah jawaban yang Anda inginkan.
Singkatnya, PushKit, kerangka kerja baru di ios 8, adalah mekanisme pemberitahuan push baru yang secara diam-diam dapat meluncurkan aplikasi Anda ke latar belakang tanpa pemberitahuan lansiran visual, bahkan aplikasi Anda terbunuh dengan menyapu dari pengalih aplikasi, luar biasa Anda bahkan tidak dapat melihatnya dari pengalih aplikasi.
Referensi PushKit dari Apple:
Untuk menggunakan fitur baru ini, silakan merujuk ke tutorial ini: https://zeropush.com/guide/guide-to-pushkit-and-voip - Saya sudah mengujinya di perangkat saya dan berfungsi seperti yang diharapkan.
sumber
Sebenarnya jika Anda perlu menguji pengambilan latar belakang, Anda harus mengaktifkan satu opsi dalam skema:
Cara lain bagaimana Anda bisa mengujinya:
Berikut ini informasi lengkap tentang fitur baru ini: http://www.objc.io/issue-5/multitasking.html
sumber
Saya telah mencoba berbagai varian dari ini selama berhari-hari, dan saya pikir selama satu hari saya telah meluncurkan kembali aplikasi di latar belakang, bahkan ketika pengguna menggesek untuk membunuh, tetapi tidak, saya tidak dapat meniru perilaku itu.
Sangat disayangkan bahwa perilakunya sangat berbeda dari sebelumnya. Di iOS 6, jika Anda membunuh aplikasi dari ikon jiggling, itu masih akan dibangunkan kembali pada pemicu SLC. Sekarang, jika Anda membunuh dengan menggesekkan, itu tidak terjadi.
Itu perilaku yang berbeda, dan pengguna, yang akan terus mendapatkan informasi yang berguna dari aplikasi kami jika mereka telah membunuhnya di iOS 6, sekarang tidak akan.
Kami perlu mendorong pengguna kami untuk membuka kembali aplikasi sekarang jika mereka telah menggesek untuk membunuhnya dan masih mengharapkan beberapa perilaku pemberitahuan yang kami berikan kepada mereka. Saya khawatir ini tidak akan terlihat jelas bagi pengguna saat mereka menggesek aplikasi. Mereka mungkin, pada dasarnya, pada dasarnya membersihkan atau ingin mengatur ulang aplikasi yang ditampilkan diminimalkan.
sumber
Ini mungkin bisa membantu Anda
Sumber: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
sumber
Tautan video: https://developer.apple.com/videos/play/wwdc2019/707/
sumber