Cara yang tepat untuk keluar dari aplikasi iPhone?

277

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?

pengguna21293
sumber
34
Hanya ada satu cara yang tepat - Tombol Beranda ..
berilium
5
Satu-satunya situasi yang dapat saya bayangkan ada orang yang mempertimbangkan untuk keluar dari program adalah skenario berikut: Aplikasi dimulai, menampilkan persyaratan penggunaan, menolak untuk menerima kemudian berhenti dari aplikasi. Ini adalah sesuatu yang terkadang ditekan oleh pengembang untuk dilakukan. Tapi itu salah.
Daniel
6
@Daniel Biasanya Anda menempatkan pelepasan tanggung jawab hukum / ketentuan penggunaan (EULA) Anda di iTunes saat Anda mengunggah aplikasi. Jika pengguna mengunduh aplikasi Anda itu berarti mereka telah menerima EULA Anda
Paul de Lange
8
Ada alasan yang benar-benar valid untuk memaksa keluar dari aplikasi ios. Kasus saya adalah saya mendistribusikan versi beta pra-peluncuran aplikasi saya. Versi beta membuka semua IAP secara gratis. Ini memiliki batas waktu dan perlu kedaluwarsa setelah beberapa minggu. Jadi saya menggunakan jawaban di bawah ini untuk mematikan aplikasi setelah periode beta selesai. Saya akan menghapus ini dalam versi LIVE. Tapi tetap saja jawabannya membantu saya dan benar!
badweasel
5
Salah satu alasan yang valid untuk keluar dari aplikasi adalah jika itu adalah aplikasi pengeksekusi latar yang berumur panjang, dan aplikasi tersebut memasuki kondisi di mana ia tidak perlu lagi berjalan di latar belakang. Misalnya, pengguna logout. Dalam hal ini masuk akal untuk keluar sehingga ketika aplikasi berikutnya dimulai itu mulai bersih. Ini akan bertindak sebagai jaring pengaman terhadap kebocoran memori, di antara alasan lainnya. Catatan, dalam hal ini aplikasi akan keluar dari latar belakang , sehingga pengguna tidak akan melihat ada yang salah.
frankodwyer

Jawaban:

217

Sudahkah Anda mencoba exit(0)?

Atau, [[NSThread mainThread] exit]walaupun saya belum mencoba sepertinya solusi yang lebih tepat.

Brett
sumber
85
Karena melakukan ini adalah Apple no-no (dapat menyebabkan aplikasi Anda ditolak di app-store untuk antarmuka non-standar), pertimbangkan jawaban Agustus sebagai "yang tepat." FYI, jawaban ini (Brett's) benar untuk program ALL C, dan NSThread untuk semua program Kakao.
Olie
21
Di Tech Q&A QA1561, Apple sangat tidak menyarankan penggunaan jalan keluar karena itu membuat aplikasi tampak macet. developer.apple.com/iphone/library/qa/qa2008/qa1561.html
progrmr
8
[[NSThread mainThread] exit] menyebabkan aplikasi Anda mogok, karena exit bukan metode instan. exit (0) akan mengirim aplikasi ke latar belakang di iOS 4. Memanggil exit (0) lagi akan membuatnya crash. Setidaknya di dalam simulator.
user123444555621
10
Saya mengerti mengapa begitu banyak orang menyarankan hal ini, tetapi bagaimana dengan memberi kami pengembang kredit? Kami semua orang dewasa di sini, dan kami ingin tahu tentang fitur ini. Saya merasa sangat berguna untuk membangun QA internal dan, ketika saya pertama kali mencarinya, senang melihat jawaban "salah" ini.
evanflash
7
@Kevin "Jangan lakukan itu" tidak pernah merupakan jawaban yang benar. Berikan peringatan dan sanggahan jika Anda suka, tetapi satu-satunya jawaban yang benar untuk "bagaimana saya melakukan ini" adalah "inilah cara melakukannya". Jika saya mencari cara melakukan sesuatu (mungkin saya ingin memaksanya untuk keluar saat debugging), orang-orang dengan benar menyatakan "Anda tidak!" dan mencoba mengubur jawaban yang saya butuhkan adalah buang-buang waktu. Namun banyak orang mungkin memiliki alasan buruk untuk melakukan sesuatu, jawaban StackOverflow yang benar adalah jawaban yang menjawab pertanyaan itu, karena orang-orang dengan alasan yang baik akan mencari jalan mereka juga.
Glenn Maynard
274

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.

Agustus
sumber
13
Seperti yang saya katakan, itu adalah perilaku non-standar dan harus dihindari. Aplikasi iPhone bukan aplikasi desktop. Jangan memperlakukan mereka seperti itu.
Agustus
8
Saya bisa memahami pendapat Apel tapi saya memiliki situasi yang sama, aplikasi saya membutuhkan akses internet, jika tidak tersedia mereka harus mampu meninggalkan app bukan hanya memiliki pesan kesalahan
Anthony Utama
22
Kami memiliki aplikasi yang membantu orang tidur. Mereka ingin aplikasi untuk berhenti setelah periode yang ditentukan untuk mengurangi daya baterai. Saya pikir hal ini dapat diterima - karena pengguna diharapkan tidur dan tidak dapat keluar dari aplikasi secara manual.
JamesSugrue
36
Saya masih tidak setuju. Ketika mereka bangun, aplikasi "hilang" meninggalkan pengguna untuk bertanya-tanya apa yang terjadi. Alih-alih, setel pengatur waktu di aplikasi Anda, lalu ketika waktunya habis, menganggur aplikasi - tidak ada aktivitas. Sebuah aplikasi yang sama sekali tidak melakukan apa pun tidak akan menguras baterai. Springboard adalah sebuah aplikasi juga - itu tidak dimatikan hanya untuk menghemat energi. Sebaliknya, ia hanya menunggu input pengguna.
Agustus 2009
8
Ini tidak benar-benar menjawab pertanyaan. Ini 100% akurat, tetapi saya pikir idealnya adalah komentar baik pada pertanyaan OP atau pada jawaban yang diterima.
Ben Zotto
49

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

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}
MaxEcho
sumber
1
Apakah apel akan menyetujui "keluar (0)" ini? Karena beberapa orang mengatakan apel akan menolak aplikasi Anda saat Anda menggunakan exit 0.
Gajendra K Chauhan
2
@GajendraKChauhan 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.
Eonil
41

Periksa T&J di sini: https://developer.apple.com/library/content/qa/qa1561/_index.html

T: Bagaimana cara saya secara terprogram keluar dari aplikasi iOS?

Tidak ada API yang disediakan untuk menghentikan aplikasi iOS dengan anggun.

Di iOS, pengguna menekan tombol Rumah untuk menutup aplikasi. Jika aplikasi Anda memiliki kondisi di mana ia tidak dapat menyediakan fungsi yang dimaksud, pendekatan yang disarankan adalah menampilkan peringatan untuk pengguna yang menunjukkan sifat masalah dan tindakan yang mungkin dilakukan pengguna - menyalakan WiFi, mengaktifkan Layanan Lokasi, dll. Izinkan pengguna untuk menghentikan aplikasi atas kebijakan mereka sendiri.

PERINGATAN: Jangan panggil exitfungsi. Panggilan aplikasi exitakan tampak bagi pengguna mengalami crash, daripada melakukan penghentian yang anggun dan menghidupkan kembali ke layar Beranda.

Selain itu, data mungkin tidak disimpan, karena -applicationWillTerminate:dan serupaUIApplicationDelegate metode tidak akan dipanggil jika Anda memanggil keluar.

Jika selama pengembangan atau pengujian perlu untuk menghentikan aplikasi Anda, abortfungsi, atau assertmakro direkomendasikan

Wagh
sumber
2
Baru saja menambahkan AlertView tanpa tombol untuk mematuhi ini. Mudah.
Schultz9999
Jawaban bagus, hanya bekerja dengan keluar (0) dan tidak tahu itu milik api pribadi
Alex Cio
39

Ini bukan cara untuk keluar dari program, tetapi cara untuk memaksa orang untuk berhenti.

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];

sumber
2
Paling tidak pada simulator, jika Anda melakukan ini, peringatan akan tetap ada ketika pengguna membuka kembali aplikasi. Jadi, saya sarankan memberi mereka setidaknya satu tombol.
cheshirekow
Gunakan jawaban Kalyan sehingga aplikasi berhenti ketika tombol home ditekan.
Timur Kuchkarov
Masalahnya adalah ia tidak benar-benar keluar dari aplikasi, jadi apa pun yang ingin dicapai pengembang dengan keluar (membuang UI yang tidak valid / lama, menghapus konstanta, dll.) Tidak akan dilakukan kecuali pengguna menggesek aplikasi Tutup.
Ben Leggiero
Ini tidak mematikan aplikasi.
Dustin
38

Buka info.plist Anda dan centang tombol "Aplikasi tidak berjalan di latar belakang". Kali ini ketika pengguna mengklik tombol beranda, aplikasi keluar sepenuhnya.

Kalyan
sumber
1
Namun proses latar belakang juga diberhentikan.
Gajendra K Chauhan
17

Tambahkan UIApplicationExitsOnSuspendproperti application-info.plistke true.

Aman Agarwal
sumber
Bisakah pengaturan ini diubah dalam waktu berjalan? Maksud saya, saya ingin hidup di latar belakang, kecuali ketika aplikasi saya MEMILIH untuk berhenti pada penundaan berikutnya - di mana saat itu saya ingin memperkenalkan UIApplicationExitsOnSuspend. Apakah ini mungkin?
Motti Shneor
13

Setelah beberapa tes, saya dapat mengatakan yang berikut:

  • menggunakan antarmuka pribadi: [UIApplication sharedApplication]akan menyebabkan aplikasi tampak macet, TETAPI itu akan memanggil - (void)applicationWillTerminate:(UIApplication *)applicationsebelum melakukannya;
  • menggunakan 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 *)applicationmetode delegasi.

Saranku:

  1. Panggil - (void)applicationWillTerminate:(UIApplication *)applicationdelegasi secara manual.
  2. Panggil exit(0);.
rchampourlier
sumber
Apple mengatakan untuk tidak menggunakan jalan keluar karena "Aplikasi yang memanggil jalan keluar akan tampak bagi pengguna mengalami gangguan, daripada melakukan penghentian yang anggun dan menghidupkan kembali ke layar Beranda" developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD
8

Delegasi ApplicationAnda akan diberitahukan tentang pengunduran diri yang disengaja oleh pengguna:

- (void)applicationWillResignActive:(UIApplication *)application {

Ketika saya mendapatkan pemberitahuan ini, saya hanya menelepon

        exit(0);

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.

Lg
sumber
1
Ini bukan solusi yang baik karena aplikasi akan berhenti aktif karena alasan lain, seperti panggilan telepon masuk.
frankodwyer
Solusinya adalah dengan menambahkan cek yang keluar hanya jika berguna untuk melakukannya. Misalnya jika pengguna berada di layar mulai. Maka tidak apa-apa bahkan jika ada panggilan telepon masuk. Apple belum menolak ini sejak iOS 2 di aplikasi saya. stackoverflow.com/a/43906936/712124
cat
6

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
6

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)).

AGPX
sumber
3
Mereka melakukannya memanggil tombol Home yang dapat ditemukan di bagian bawah iDevice. Jadi karena ini, tidak perlu lagi membuat tombol berhenti sendiri.
Popeye
4

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.

nanonim
sumber
3

Hm, Anda mungkin 'harus' keluar dari aplikasi jika, katakanlah, aplikasi Anda memerlukan koneksi internet. Anda dapat menampilkan peringatan dan kemudian melakukan sesuatu seperti ini:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
rampok
sumber
9
Tidak, Anda tidak harus menghentikannya. Aplikasi iTunes, misalnya, ketika tidak dapat mendeteksi koneksi yang tepat cukup memasang layar yang mengatakan mereka tidak terhubung. Itu tidak berhenti, itu hanya memberitahu pengguna tentang apa yang terjadi. Pengguna kemudian berhenti dengan mengetuk tombol beranda.
Agustus
1
Aplikasi kompas berhenti jika tidak dapat berfungsi.
Josh Lee
3

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.

Jika selama pengembangan atau pengujian perlu untuk menghentikan aplikasi Anda, fungsi batal, atau menegaskan makro dianjurkan

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.

Aplikasi iOS tidak pernah menampilkan opsi Tutup atau Keluar. Orang-orang berhenti menggunakan aplikasi ketika mereka beralih ke aplikasi lain, kembali ke layar Beranda, atau meletakkan perangkat mereka dalam mode tidur.

Jangan pernah berhenti dari aplikasi iOS secara terprogram. Orang-orang cenderung menafsirkan ini sebagai gangguan. Jika ada sesuatu yang mencegah aplikasi Anda berfungsi sebagaimana dimaksud, Anda harus memberi tahu pengguna tentang situasinya dan menjelaskan apa yang dapat mereka lakukan.

technerd
sumber
2

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.

Chris Jefferson
sumber
Harap modifikasi jawaban Anda dalam skenario iOS4.0 dan UP saat ini: P
rptwsthi
2
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}
Prabhu Natarajan
sumber
1

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.

Michael Long
sumber
Saya tidak bisa melihat apa yang menahan Anda untuk menampilkan satu peringatan duniawi layar penuh, memberi tahu pengguna bahwa aplikasi tidak dapat digunakan untuk alasan "penyematan sertifikat" itu, dan hanya itu. Pengguna akhirnya akan menutup aplikasi. Anda mungkin tidak tahu, tetapi iOS berhak untuk mematikan proses Anda (mempertahankan kondisinya) dan mengembalikannya nanti, dan "siklus hidup" aplikasi iOS tidak benar-benar ada di tangan Anda. Kecelakaan Anda - hanyalah gangguan, dan OS mungkin memilih untuk menghidupkan kembali aplikasi.
Motti Shneor
Wow, posting tiga tahun. Bagaimanapun, arsitektur aplikasi baru cukup banyak melakukannya, dengan tombol coba lagi yang mencoba ulang API dan menjatuhkan layar blok, atau mengembalikannya ke layar blok dengan kesalahan baru.
Michael Long
Struktur aplikasi lama cukup banyak tidak memungkinkan cara yang baik untuk mencoba kembali panggilan API permulaan dan aplikasi berada dalam keadaan tidak konsisten tanpa mereka. Kami bisa menggunakan layar blok permanen, tetapi itu mengharuskan pengguna untuk secara paksa keluar dari aplikasi dan diputuskan bahwa tidak setiap pengguna tahu BAGAIMANA untuk mengklik dua kali dan memaksa berhenti aplikasi. Lebih mudah hari ini, tetapi cukup tersembunyi tiga tahun lalu.
Michael Long
1
[[UIApplication sharedApplication] terminateWithSuccess];

Ini berfungsi dengan baik dan secara otomatis memanggil

- (void)applicationWillTerminateUIApplication *)application delegate.

untuk menghapus kompilasi peringatan waktu tambahkan kode ini

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
Siwa
sumber
5
Ini adalah metode pribadi, Diego Mercado telah menjelaskan di atas bahwa aplikasinya ditolak, lalu mengapa mengambil risiko seperti itu.
RVN
Menggunakan API pribadi akan membuat aplikasi ditolak oleh Apple.
ZYiOS
2
untuk aplikasi enterprise - ini bisa menjadi solusi.
user1140780
- (IBAction) exitApp: (id) pengirim {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self performSelector: selector withObject: [UIApplication sharedApplication]]; }
unom
@ unmircea melakukan itu lulus ulasan?
Hebat-o
1

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

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

Pemakaian:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}
Harimau itu
sumber
0

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).

Binarian
sumber
0

Keluar dari aplikasi selain dari tombol beranda benar-benar non-iOS-esque pendekatan yang .

Saya melakukan bantuan ini, yang tidak menggunakan barang pribadi:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

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.

Geri Borbás
sumber
0

Swift 4.2 (atau lebih tua)

Pustaka yang disebut Darvinbisa digunakan.

import Darwin

exit(0) // Here you go

NB: Ini tidak direkomendasikan dalam aplikasi iOS.

Melakukan ini akan membuat Anda crash log.

Saranjith
sumber
0

Di iPadOS 13 Anda sekarang dapat menutup semua sesi pemandangan seperti ini:

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

Ini akan menelepon applicationWillTerminate(_ application: UIApplication) delegasi aplikasi Anda dan mengakhiri aplikasi pada akhirnya.

Namun waspadalah terhadap dua hal:

Info lebih lanjut tentang adegan di iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes

Klaas
sumber
-1

Keluar dari aplikasi dengan cara lain

Saya melakukan bantuan ini, yang tidak menggunakan barang pribadi:

Keluar (0);

iOS.j
sumber
-1

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:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

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.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

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.html

frankodwyer
sumber