Saya memprogram aplikasi iPhone, dan saya harus memaksanya untuk keluar karena tindakan pengguna tertentu. Setelah membersihkan memori yang dialokasikan aplikasi, metode apa yang tepat untuk memanggil untuk menghentikan aplikasi?
ios
objective-c
iphone
cocoa-touch
ipad
pengguna21293
sumber
sumber
Jawaban:
Sudahkah Anda mencoba
exit(0)
?Atau,
[[NSThread mainThread] exit]
walaupun saya belum mencoba sepertinya solusi yang lebih tepat.sumber
Di iPhone tidak ada konsep berhenti aplikasi. Satu-satunya tindakan yang menyebabkan aplikasi berhenti adalah menyentuh tombol Beranda di ponsel, dan itu bukan sesuatu yang dapat diakses pengembang.
Menurut Apple, aplikasi Anda seharusnya tidak berhenti dengan sendirinya. Karena pengguna tidak menekan tombol Beranda, setiap pengembalian ke layar Beranda memberi kesan pada pengguna bahwa aplikasi Anda mogok. Ini membingungkan, perilaku tidak standar dan harus dihindari.
sumber
keluar (0) muncul kepada pengguna sebagai macet, jadi tunjukkan pesan konfirmasi kepada pengguna. Setelah konfirmasi ditangguhkan (tombol home tekan secara programatis) dan tunggu 2 detik saat aplikasi berjalan dengan animasi kemudian keluar di belakang tampilan pengguna
sumber
exit(0)
tidak masalah. Intinya aplikasi Anda memiliki "perilaku berhenti". Berhenti perilaku itu sendiri dilarang di AppStore kecuali beberapa aplikasi yang dibuat oleh pihak ketiga yang sangat penting. Selain itu, meniru perilaku tombol beranda juga dapat ditolak.Periksa T&J di sini: https://developer.apple.com/library/content/qa/qa1561/_index.html
sumber
Ini bukan cara untuk keluar dari program, tetapi cara untuk memaksa orang untuk berhenti.
sumber
Buka info.plist Anda dan centang tombol "Aplikasi tidak berjalan di latar belakang". Kali ini ketika pengguna mengklik tombol beranda, aplikasi keluar sepenuhnya.
sumber
Tambahkan
UIApplicationExitsOnSuspend
propertiapplication-info.plist
ketrue
.sumber
Setelah beberapa tes, saya dapat mengatakan yang berikut:
[UIApplication sharedApplication]
akan menyebabkan aplikasi tampak macet, TETAPI itu akan memanggil- (void)applicationWillTerminate:(UIApplication *)application
sebelum melakukannya;exit(0);
juga akan menghentikan aplikasi, tetapi akan terlihat "normal" (ikon loncatan muncul seperti yang diharapkan, dengan efek zoom out), TAPI itu tidak akan memanggil- (void)applicationWillTerminate:(UIApplication *)application
metode delegasi.Saranku:
- (void)applicationWillTerminate:(UIApplication *)application
delegasi secara manual.exit(0);
.sumber
Delegasi ApplicationAnda akan diberitahukan tentang pengunduran diri yang disengaja oleh pengguna:
Ketika saya mendapatkan pemberitahuan ini, saya hanya menelepon
Yang melakukan semua pekerjaan. Dan yang terbaik adalah, itu adalah niat pengguna untuk berhenti, itulah mengapa ini seharusnya tidak menjadi masalah menyebutnya di sana.
Di Audio-App saya perlu untuk berhenti dari aplikasi setelah orang menyinkronkan perangkat mereka saat musik masih diputar. Segera setelah sinkronisasi selesai, saya mendapat pemberitahuan. Tetapi berhenti dari aplikasi setelah itu akan benar-benar terlihat seperti macet.
Jadi alih-alih saya menetapkan bendera untuk BENAR-BENAR keluar dari aplikasi pada tindakan latar belakang berikutnya. Yang oke untuk menyegarkan aplikasi setelah sinkronisasi.
sumber
Aplikasi saya baru-baru ini ditolak. Saya telah menggunakan metode tidak berdokumen. Secara harfiah:
"Sayangnya itu tidak dapat ditambahkan ke App Store karena menggunakan API pribadi. Penggunaan API non-publik, yang sebagaimana diuraikan dalam Perjanjian Lisensi Program Pengembang iPhone bagian 3.3.1 dilarang:
"3.3.1 Aplikasi hanya dapat menggunakan API Terdokumentasi dengan cara yang ditentukan oleh Apple dan tidak boleh menggunakan atau memanggil API pribadi apa pun."
API non-publik yang termasuk dalam aplikasi Anda adalah terminateWithSuccess "
sumber
Apple mengatakan:
"Peringatan: Jangan panggil fungsi keluar. Aplikasi yang memanggil keluar akan tampak bagi pengguna mengalami gangguan, alih-alih melakukan penghentian yang anggun dan menghidupkan kembali ke layar Beranda."
Saya pikir ini anggapan yang buruk. Jika pengguna mengetuk tombol keluar dan muncul pesan yang mengatakan sesuatu seperti: "Aplikasi sekarang akan keluar.", Sepertinya tidak macet. Apple harus menyediakan cara yang valid untuk keluar dari aplikasi (tidak keluar (0)).
sumber
Ini mendapatkan jawaban yang bagus tetapi memutuskan untuk sedikit memperluas:
Anda tidak bisa mendapatkan aplikasi Anda diterima di AppStore tanpa membaca Panduan Antarmuka Manusia iOS Apple dengan baik. (mereka memiliki hak untuk menolak Anda karena melakukan sesuatu yang melawan mereka) Bagian "Jangan Berhenti Secara Programatis" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. html adalah pedoman persis tentang bagaimana Anda harus memperlakukan dalam kasus ini.
Jika Anda pernah memiliki masalah dengan platform Apple yang tidak dapat Anda temukan solusinya dengan mudah, berkonsultasilah dengan HIG. Mungkin saja Apple tidak ingin Anda melakukannya dan mereka biasanya (saya bukan Apple jadi saya tidak bisa selalu menjamin) mengatakannya dalam dokumentasi mereka.
sumber
Hm, Anda mungkin 'harus' keluar dari aplikasi jika, katakanlah, aplikasi Anda memerlukan koneksi internet. Anda dapat menampilkan peringatan dan kemudian melakukan sesuatu seperti ini:
sumber
Kita tidak bisa berhenti aplikasi menggunakan
exit(0)
,abort()
fungsi, seperti Apple sangat tidak menyarankan penggunaan fungsi-fungsi ini. Meskipun Anda dapat menggunakan fungsi ini untuk tujuan pengembangan atau pengujian.Silakan temukan utas T&J Apple ini untuk mendapatkan informasi lebih lanjut.
Seperti penggunaan fungsi ini, membuat kesan seperti aplikasi mogok. Jadi saya mendapat beberapa saran seperti kita dapat menampilkan Peringatan dengan pesan penghentian kepada pengguna yang sadar tentang menutup aplikasi, karena tidak tersedianya fungsi tertentu.
Tetapi Pedoman Antarmuka Manusia iOS untuk Memulai dan Menghentikan Aplikasi , menyarankan agar Jangan pernah menggunakan tombol Keluar atau Tutup untuk mengakhiri Aplikasi. Daripada itu mereka menyarankan untuk menampilkan pesan yang tepat untuk menjelaskan situasi.
sumber
Selain jawaban di atas, bagus, saya hanya ingin menambahkan, pikirkan tentang membersihkan memori Anda.
Setelah aplikasi Anda keluar, iPhone OS akan secara otomatis membersihkan apa pun yang ditinggalkan aplikasi Anda, sehingga membebaskan semua memori secara manual hanya dapat menambah jumlah waktu yang dibutuhkan aplikasi Anda untuk keluar.
sumber
sumber
Saya menggunakan pendekatan addObject: nil] yang disebutkan di atas untuk memaksa keluar (crash) aplikasi tanpa membuat panggilan fungsi keluar (0).
Mengapa? Karena aplikasi saya menggunakan pinning sertifikat pada semua panggilan API jaringan untuk mencegah serangan man-in-the-middle. Ini termasuk panggilan inisialisasi aplikasi finansial saya saat startup.
Jika otentikasi sertifikat gagal, semua panggilan inisialisasi saya salah dan biarkan aplikasi saya dalam keadaan tidak ditentukan. Membiarkan pengguna pulang dan kembali ke aplikasi tidak membantu, karena kecuali aplikasi telah dibersihkan oleh OS itu masih belum diinisialisasi dan tidak dapat dipercaya.
Jadi, dalam kasus ini, kami menganggap yang terbaik untuk mengeluarkan peringatan yang memberi tahu pengguna bahwa aplikasi beroperasi di lingkungan yang tidak aman dan kemudian, ketika mereka menekan "Tutup", paksa keluar dari aplikasi menggunakan metode yang disebutkan di atas.
sumber
Ini berfungsi dengan baik dan secara otomatis memanggil
untuk menghapus kompilasi peringatan waktu tambahkan kode ini
sumber
Anda tidak boleh langsung memanggil fungsi tersebut
exit(0)
karena akan segera keluar dari aplikasi dan akan membuat aplikasi Anda mogok. Jadi lebih baik untuk menunjukkan kepada pengguna peringatan konfirmasi dan biarkan mereka melakukannya sendiri.Cepat 4.2
Pemakaian:
sumber
Pengguna harus memutuskan kapan aplikasi keluar. Saya tidak berpikir itu adalah interaksi pengguna yang baik ketika aplikasi berhenti. Karena itu tidak ada API yang bagus untuk itu, hanya tombol beranda yang memilikinya.
Jika ada kesalahan: Terapkan lebih baik atau Beri tahu pengguna. Jika harus ada restart: Terapkan itu lebih baik dari Beri tahu pengguna.
Kedengarannya bodoh, tapi itu praktik buruk untuk keluar dari aplikasi tanpa membiarkan pengguna memutuskan dan tidak memberi tahu dia. Dan karena ada tombol beranda untuk interaksi pengguna, Apple menyatakan, seharusnya tidak ada 2 hal untuk fungsi yang sama (keluar dari aplikasi).
sumber
Keluar dari aplikasi selain dari tombol beranda benar-benar non-iOS-esque pendekatan yang .
Saya melakukan bantuan ini, yang tidak menggunakan barang pribadi:
Tapi tetap tidak dimaksudkan untuk produksi dalam kasus saya. Ini untuk menguji laporan kerusakan, atau untuk memulai kembali dengan cepat setelah reset Data Inti. Hanya membuatnya aman untuk tidak ditolak jika fungsi dibiarkan dalam kode produksi.
sumber
Swift 4.2 (atau lebih tua)
Pustaka yang disebut
Darvin
bisa digunakan.NB: Ini tidak direkomendasikan dalam aplikasi iOS.
Melakukan ini akan membuat Anda crash log.
sumber
Di iPadOS 13 Anda sekarang dapat menutup semua sesi pemandangan seperti ini:
Ini akan menelepon
applicationWillTerminate(_ application: UIApplication)
delegasi aplikasi Anda dan mengakhiri aplikasi pada akhirnya.Namun waspadalah terhadap dua hal:
Ini tentu saja tidak dimaksudkan untuk digunakan untuk menutup semua adegan. (lihat https://developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/multiple-windows/ )
Ini mengkompilasi dan berjalan dengan baik di iOS 13 pada iPhone, tetapi tampaknya tidak melakukan apa-apa.
Info lebih lanjut tentang adegan di iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes
sumber
Keluar dari aplikasi dengan cara lain
Saya melakukan bantuan ini, yang tidak menggunakan barang pribadi:
Keluar (0);
sumber
Mungkin tepat untuk keluar dari aplikasi jika itu adalah aplikasi berumur panjang yang juga dijalankan di latar belakang, misalnya untuk mendapatkan pembaruan lokasi (menggunakan pembaruan lokasi kemampuan latar belakang untuk itu).
Misalnya, katakanlah pengguna keluar dari aplikasi berbasis lokasi Anda, dan mendorong aplikasi ke latar belakang menggunakan tombol beranda. Dalam hal ini aplikasi Anda mungkin terus berjalan, tetapi masuk akal untuk sepenuhnya keluar. Ini akan baik untuk pengguna (melepaskan memori dan sumber daya lain yang tidak perlu digunakan), dan baik untuk stabilitas aplikasi (yaitu memastikan aplikasi secara berkala dimulai kembali jika memungkinkan adalah jaring pengaman terhadap kebocoran memori dan memori rendah lainnya. masalah).
Ini bisa (walaupun mungkin seharusnya tidak, lihat di bawah :-) dapat dicapai dengan sesuatu seperti:
Karena aplikasi kemudian akan keluar dari latar belakang itu tidak akan terlihat salah bagi pengguna, dan tidak akan menyerupai crash, menyediakan antarmuka pengguna dipulihkan saat mereka menjalankan aplikasi berikutnya. Dengan kata lain, bagi pengguna itu tidak akan terlihat berbeda dengan sistem yang memulai penghentian aplikasi ketika aplikasi berada di latar belakang.
Namun, akan lebih baik menggunakan pendekatan yang lebih standar untuk membuat sistem tahu bahwa aplikasi dapat dihentikan. Misalnya dalam hal ini, dengan memastikan GPS tidak digunakan dengan menghentikan permintaan pembaruan lokasi, termasuk mematikan acara lokasi saat ini pada tampilan peta jika ada. Dengan cara itu sistem akan memberhentikan aplikasi beberapa menit (yaitu
[[UIApplication sharedApplication] backgroundTimeRemaining]
) setelah aplikasi memasuki latar belakang. Ini akan mendapatkan semua manfaat yang sama tanpa harus menggunakan kode untuk menghentikan aplikasi.Dan tentu saja, menggunakan
exit(0)
tidak akan pernah sesuai untuk aplikasi produksi rata-rata yang berjalan di latar depan, seperti jawaban lain yang merujuk http://developer.apple.com/iphone/library/qa/qa2008/qa1561.htmlsumber