it-swarm-id.com

applicationWillTerminate kapan dipanggil dan kapan tidak

Hai Saya telah membaca beberapa pertanyaan tentang SO tentang applicationWillTerminate dipanggil dan tidak dipanggil.

Saya ingin merangkum apa yang saya pahami karena ada beberapa posting yang berbicara secara berbeda.

  1. Untuk IOS (tanpa multitasking) itu dipanggil selalu ketika tombol home ditekan.

  2. Untuk IOS 4 ke atas

    sebuah. itu bukan dipanggil saat menekan tombol beranda (saat aplikasi bergerak ke latar belakang)

    b. itu disebut ketika menutup aplikasi dari multi-tasking dock dan jika aplikasi memiliki bendera yang tiba-tiba berakhir di info.plist dinonaktifkan jika tidak disebut. (Saya mengatur "Aplikasi harus mendapatkan acara App Died" dan bahkan saat menutup aplikasi dari dermaga multitasking, fungsi terminate tidak dipanggil)

Berdasarkan itu saya punya beberapa pertanyaan

Apakah itu praktik yang baik untuk mengatur Aplikasi yang akan mendapatkan bendera peristiwa Meninggal Aplikasi? (Saya mengatur "Aplikasi harus mendapatkan acara App Died" dan bahkan saat menutup aplikasi dari dermaga multitasking, fungsi terminate tidak dipanggil)

atau

Apakah mendaftar untuk "UIApplicationWillTerminateNotification" adalah hal yang lebih baik untuk dilakukan daripada pengaturan info.plist?

Pada dasarnya saya perlu melakukan beberapa pekerjaan hanya ketika aplikasi berakhir dan BUKAN ketika pindah ke latar belakang.

atau

EDIT (1): Ketika aplikasi dihentikan, yang berikut dikirim ke APP. Bagaimana saya menangkapnya?

Sinyal yang diterima program: “SIGKILL”.

EDIT (2):

Harap dicatat: Ini tidak dipanggil dalam IOS 4 dan lebih tinggi saat melepas dari dock multitasking. Anda mungkin berpikir demikian. Tetapi dalam kasus saya tidak.

Saya bertanya apakah ada yang tahu mengapa? Apakah ada hal lain yang saya lewatkan. 

Juga Catatan saya mengatur "Aplikasi harus mendapatkan peristiwa App Died" dan itupun tidak dipanggil.

EDIT (3):

Jawaban untuk pertanyaan berikut juga tidak berfungsi . applicationWillTerminate tidak dipanggil

Adakah yang menghadapi masalah yang sama dengan saya?

61
Anand

Singkatnya, kecuali Anda memiliki UIApplicationExitsOnSuspend di Info.plist Anda diatur ke YES, di iOS4 dan di atasnya tidak ada jaminan bahwa applicationWillTerminate: akan pernah dipanggil.

Sebagai dokumentasi mengatakan:

Untuk aplikasi yang mendukung eksekusi latar belakang, metode ini adalah umumnya tidak dipanggil ketika pengguna keluar dari aplikasi karena aplikasi hanya bergerak ke latar belakang dalam hal ini. Namun, ini metode dapat dipanggil dalam situasi di mana aplikasi berjalan dalam latar belakang (tidak ditangguhkan) dan sistem harus menghentikannya untuk beberapa alasan

(Penekanan milikku.)

Jika Anda perlu melakukan sesuatu sebelum aplikasi keluar, Anda harus melakukannya di applicationDidEnterBackground:. Tidak ada cara untuk menangkap SIGKILL.

49

Saya melihat -applicationWillTerminate: dipanggil dengan tes berikut. Dalam proyek baru (saya menggunakan templat 'Aplikasi Tampilan Tunggal'), tambahkan berikut ini ke AppDelegate:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"%s", __PRETTY_FUNCTION__);

    __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        for (int i=0; i < 20; i++) {
            NSLog(@"%d", i);
            sleep(1);
        }
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    });
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

Contoh ini akan memulai tugas latar belakang saat aplikasi memasuki latar belakang. Tugas ini hanya berupa penundaan selama 20 detik (dengan mencatat sekali dalam satu detik) yang membuat aplikasi tetap berjalan di latar belakang (perhatikan perbedaan antara menjalankan di latar belakang dan ditangguhkan) cukup lama untuk membuatnya terbunuh dari pengalih aplikasi.

Jadi, untuk mengujinya, jalankan aplikasi, tekan tombol beranda untuk mengirim aplikasi ke latar belakang, lalu sebelum penundaan 20-an berakhir, hapus aplikasi dari pengalih aplikasi. Setelah akhir 20-an, -applicationWillTerminate: disebut. Anda dapat menonton konsol di Xcode untuk memverifikasi bahwa ini masalahnya.

Saya mencoba ini di iOS Simulator untuk iOS 5.1 dan 6.1 (keduanya iPhone) dan melihatnya terjadi dalam kedua kasus. Saya juga menguji iPhone 4S yang menjalankan iOS 6.1.2 dan melihat perilaku yang sama.

28

Seperti yang saya tahu, ada 3 situasi bahwa aplikasi Anda akan mati.

  1. Dihentikan oleh pengguna akhir, Anda dapat melakukan sesuatu dalam -[UIApplication applicationWillEnterBackground:], dalam hal ini, -[UIApplication applicationWillTerminate:] TIDAK akan dipanggil.

  2. Menjatuhkan oleh sistem, seperti memori tidak cukup, Anda dapat melakukan sesuatu dalam -[UIApplication applicationWillTerminate:], dalam hal ini, kami TIDAK tahu apakah applicationWillEnterBackground: telah dipanggil;

  3. Hancur, tidak ada yang bisa dilakukan kecuali menggunakan semacam Alat Pelaporan Kecelakaan. (Diedit: menangkap SIGKILL tidak mungkin)

4
DawnSong

Sumber: http://www.cocos2d-iphone.org/forum/topic/7386

Saya menyalin kode penyimpanan negara saya dari applicationWillTerminate ke applicationDidEnterBackground dan juga menambahkan boolean multitaskingEnabled sehingga saya hanya memanggil penyimpanan negara dalam applicationDidEnterBackground. KARENA, ada satu contoh pada perangkat multitasking di mana applicationWillTerminate disebut: Jika aplikasi berada di latar depan dan Anda mematikan perangkat. Dalam hal ini, baik applicationDidEnterBackground dan applicationWillTerminate dipanggil.

3
Jonathon Hibbard

Seperti yang kita ketahui bahwa Aplikasi hanya memiliki 5 detik ketika -applicationWillTerminate dipanggil. Jadi, jika seseorang ingin memperbarui server pada saat itu. Daripada menggunakan Panggilan sinkron.

[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];

Catatan: - -applicationWillTerminate tidak akan memanggil jika aplikasi terbunuh dari keadaan ditangguhkan. Status ditangguhkan berarti aplikasi tidak berfungsi apa pun di backgroupd. Salah satu solusi untuk ini adalah menggunakan tugas latar belakang.

1
Gagan Joshi