Apakah iOS akan meluncurkan aplikasi saya ke latar belakang jika itu dihentikan secara paksa oleh pengguna?

219

Saya memicu pengambilan latar belakang dengan menggunakan content-availablebendera pada pemberitahuan push. Saya memiliki fetchdan remote-notification UIBackgroundModesmengaktifkan.

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-availablebendera, aplikasi tidak diluncurkan dan didRecieveRemoteNotificationmetode delegasi tidak pernah dipanggil.

Video WWDC Whats New With Multitasking (# 204 dari WWDC 2013) menunjukkan ini:masukkan deskripsi gambar di sini

Dikatakan bahwa aplikasi "diluncurkan ke latar belakang" ketika pemberitahuan push diterima dengan content-availablebendera.

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?

Sinterklas
sumber
Bagaimana Anda memeriksa apakah aplikasi diluncurkan di latar belakang?
runmad
1
@runmad Saya mencatat banyak omong kosong- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Santa Claus
Bagaimana cara Anda login, hanya NSLog? Anda harus mengatur Peluncuran ke manual dalam pengaturan skema aplikasi Anda (lihat jawaban)
runmad
@ runmad lihat komentar pada jawaban
Santa Claus
@HaimBenchimol. Apakah Anda mendapat respons terhadap laporan bug Anda? Saya belum sempat melaporkan laporan bug saya sendiri.
Santa Claus

Jawaban:

215

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:

Gunakan metode ini untuk memproses notifikasi jarak jauh yang masuk untuk aplikasi Anda. Berbeda dengan application:didReceiveRemoteNotification:metode, yang dipanggil hanya ketika aplikasi Anda berjalan di latar depan, sistem memanggil metode ini ketika aplikasi Anda berjalan di latar depan atau latar belakang. Selain itu, jika Anda mengaktifkan mode latar belakang notifikasi jarak jauh, sistem meluncurkan aplikasi Anda (atau membangunkannya dari status ditangguhkan) dan meletakkannya di status latar belakang ketika pemberitahuan push datang. Namun, sistem tidak secara otomatis meluncurkan aplikasi Anda jika pengguna telah menghentikannya secara paksa. Dalam situasi itu, pengguna harus meluncurkan kembali aplikasi Anda atau me-restart perangkat sebelum sistem mencoba untuk meluncurkan aplikasi Anda secara otomatis lagi.


Meskipun ini tidak dibuat jelas oleh video WWDC, pencarian cepat di forum pengembang menemukan ini:

https://devforums.apple.com/message/873265#873265 (wajib masuk)

Juga perlu diingat bahwa jika Anda mematikan aplikasi Anda dari pengalih aplikasi (yaitu menggesekkan untuk membunuh aplikasi) maka OS tidak akan pernah meluncurkan kembali aplikasi terlepas dari pemberitahuan push atau pengambilan latar belakang. Dalam hal ini pengguna harus meluncurkan ulang aplikasi secara manual sekali dan kemudian sejak saat itu kegiatan latar belakang akan dipanggil. - pmarcos

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.

Sinterklas
sumber
2
Bagi saya menambahkan tindakan di "didFinishLaunchingWithOptions" ketika meluncurkan opsi tidak nihil berhasil. Saya memiliki metode yang sama di sini seperti pada "didreceiveRemoteNotification"
harsh.prasad
@ harsh.prasad itu menarik. Masalahnya adalah aplikasi tidak diluncurkan ketika aplikasi telah terbunuh dari pengalih aplikasi.
Santa Claus
3
Aplikasi tidak perlu ditampilkan di pengalih aplikasi jika dorongan diam diterima. Itu bisa diluncurkan di latar belakang tanpa menambahkannya ke pengalih aplikasi, dan diizinkan untuk menjalankan dan "melakukan hal itu" dan kemudian keluar. Aplikasi yang tetap aktif terlalu lama akan terbunuh dengan cara yang sama seperti sebelumnya.
MindJuice
1
@chrizstone Solusinya adalah perilaku ini dimaksudkan, dan Anda tidak bisa berbuat apa-apa.
Sinterklas
1
@ JPK Eh, pemberitahuan push sendiri tidak terpengaruh. Itu hanya melakukan tugas-tugas latar belakang yang tidak akan berfungsi setelah dipaksa berhenti.
Sinterklas
70

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 breakpoint application: 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.

tangkapan layar

runmad
sumber
jadi ini membantu tetapi masalahnya masih ada
Santa Claus
Aneh. Saya berasumsi Anda telah memeriksa ulang semua flash di plist Anda, dll.
runmad
Juga, saya tahu semuanya sudah beres karena ketika aplikasi di latar belakang, semuanya bekerja dengan sempurna. Hanya ketika aplikasi tidak berjalan sama sekali, itu tidak berjalan.
Santa Claus
Saya ingin tahu apakah pemicu peluncuran pemberitahuan push ditentukan oleh sistem. Misalnya, jika iOS menentukan ini bukan waktu yang tepat untuk meluncurkan aplikasi sekarang, mungkin akan menunda sampai nanti. Mungkin coba dan tutup semua aplikasi yang berjalan / latar dan lihat apa yang terjadi? Saya hanya menebak pada titik ini: - /
runmad
baru saja mencobanya. Tidak ada yang terjadi, seperti biasanya. Saya mungkin bertanya di forum dev.
Santa Claus
37

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:

Kerangka kerja PushKit menyediakan kelas untuk aplikasi iOS Anda untuk menerima dorongan dari server jarak jauh. Push dapat terdiri dari satu dari dua jenis: standar dan VoIP. Dorongan standar dapat mengirimkan pemberitahuan seperti pada versi iOS sebelumnya. Dorongan VoIP menyediakan fungsionalitas tambahan di atas dorongan standar yang diperlukan untuk aplikasi VoIP untuk melakukan pemrosesan dorongan berdasarkan permintaan sebelum menampilkan pemberitahuan kepada pengguna.

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.

superZhen
sumber
9
Sepertinya saya Anda harus mengatur aplikasi Anda menggunakan VoIP. Jika aplikasi Anda sebenarnya bukan aplikasi VoIP, bukankah hanya ditolak saat ditinjau?
duncanc4
6
Sayangnya, mengetahui proses validasi oleh Apple, masuk akal jika aplikasi itu ditolak.
Kepa Santos
3
Digunakan untuk VoIP. Jika tidak menggunakan VoIP untuk pengguna, ini akan sangat meningkatkan risiko penolakan ulasan.
Chris
Sepertinya penyedia besar menggunakan fasilitas ini sebagai alasan untuk menjalankan hal-hal di latar belakang dan Apple menutup mata. Menjadi Android satu fitur pada saat itu.
TCB13
PushKit disediakan untuk VoIP, Penyedia File, dan Komplikasi Tonton. Tidak tersedia untuk kasus penggunaan yang dijelaskan oleh jawaban ini.
quellish
15

Sebenarnya jika Anda perlu menguji pengambilan latar belakang, Anda harus mengaktifkan satu opsi dalam skema:

mengaktifkan bg fetch

Cara lain bagaimana Anda bisa mengujinya: mensimulasikan bg fetch

Berikut ini informasi lengkap tentang fitur baru ini: http://www.objc.io/issue-5/multitasking.html

Danil
sumber
4

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.

snarshad
sumber
2
Itulah tepatnya yang kami lakukan (applicationWillTerminate), tapi saya tidak percaya itu memberikan notifikasi selama pembersihan memori, setidaknya tidak pada iOS 7. Saya memang melihat bahwa itu menunjukkan notifikasi tepat sebelum reboot untuk upgrade OS, tapi begitu jarang rasanya tidak terlalu buruk.
snarshad
"Di iOS 6, jika kamu membunuh aplikasi dari ikon jiggling, itu akan tetap dibangun kembali pada pemicu SLC. Sekarang, jika kamu membunuh dengan menggesekkan, itu tidak terjadi." Ini sekarang terjadi, itu adalah kemunduran sementara dalam versi awal iOS 7.
funkybro
3

Ini mungkin bisa membantu Anda

Dalam kebanyakan kasus, sistem tidak meluncurkan kembali aplikasi setelah mereka dipaksa keluar oleh pengguna. Satu pengecualian adalah aplikasi lokasi, yang di iOS 8 dan yang lebih baru diluncurkan kembali setelah dipaksa keluar oleh pengguna. Namun dalam kasus lain, pengguna harus meluncurkan aplikasi secara eksplisit atau me-reboot perangkat sebelum aplikasi dapat diluncurkan secara otomatis ke latar belakang oleh sistem. Ketika proteksi kata sandi diaktifkan pada perangkat, sistem tidak meluncurkan aplikasi di latar belakang sebelum pengguna membuka kunci perangkat terlebih dahulu.

Sumber: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Stanislav S.
sumber
3
For **iOS13**

For background PUSHES in iOS13 you must set below parameters
apns-priority = 5
apns-push-type = background
Required for WatchOS
Highly recommended for Other platforms 

Latar Belakang PUSHES Tautan video: https://developer.apple.com/videos/play/wwdc2019/707/

CrazyPro007
sumber
Bisakah Anda membagikan tautan video kepada saya?
guhan0