İPhone uygulamasından çıkmanın doğru yolu?


277

Bir iPhone uygulamasını programlıyorum ve belirli kullanıcı işlemleri nedeniyle uygulamayı çıkmaya zorlamam gerekiyor. Uygulamanın ayrılan belleği temizledikten sonra, uygulamayı sonlandırmak için çağrılacak uygun yöntem nedir?


34
Sadece bir uygun yol var - Ana Sayfa düğmesi ..
berilyum

5
Programlı olarak çıkmayı düşünen herkesin hayal edebildiği tek durum şu senaryo: Uygulama başlar, kullanım şartlarını görüntüler, kabul etmeyi reddeder ve uygulamadan çıkar. Bu, markaların bazen geliştiricinin yapması için baskı yaptığı bir şeydir. Ama bu yanlış.
Daniel

6
@Daniel Normalde, uygulamayı yüklediğinizde yasal uyarınızı / kullanım koşullarınızı (EULA) itunes connect'ye koyarsınız. Kullanıcı uygulamanızı indirirse, EULA'nızı kabul ettiği anlamına gelir
Paul de Lange

8
Bir iOS uygulamasından çıkmaya zorlamak için tamamen geçerli nedenler vardır. Benim durumum, uygulamamın lansman öncesi beta sürümlerini dağıtıyorum. Beta sürümleri tüm IAP'leri ücretsiz olarak açar. Bunların bir zaman sınırı vardır ve birkaç hafta sonra sona ermeleri gerekir. Bu yüzden beta süresi bittikten sonra uygulamayı öldürmek için aşağıdaki cevabı kullanıyorum. Bunu LIVE sürümünde kaldıracağım. Ama yine de cevap bana yardımcı oldu ve doğru!
badweasel

5
Bir uygulamadan çıkmanın geçerli bir nedeni, uzun ömürlü bir arka plan yürütme uygulaması olması ve uygulamanın artık arka planda çalışması gerekmediği bir duruma girmesidir. Örneğin, kullanıcı oturumu kapatır. Bu durumda, uygulama bir sonraki başlatıldığında temiz olmaya başlaması için çıkmak mantıklı olacaktır. Bu, diğer nedenlerin yanı sıra bellek sızıntılarına karşı bir güvenlik ağı görevi görür. Bu durumda, uygulama arka plandan çıkacaktır, bu nedenle kullanıcı yanlış bir şey fark etmeyecektir.
frankodwyer

Yanıtlar:


217

Denedin exit(0)mi

Alternatif olarak, [[NSThread mainThread] exit]daha uygun bir çözüm gibi görünsem de denemedim.


85
Bunu yapmak bir Apple no-no olduğundan (uygulamanızın standart dışı arayüz için uygulama mağazasında reddedilmesine neden olabilir), Ağustos'un cevabını "doğru" olarak düşünün. Bilginize, bu cevap (Brett'in) TÜM C programları için ve NSThread tüm Kakao programları için doğrudur.
Olie

21
Tech Q&A QA1561'de Apple, uygulamanın çökmüş görünmesini sağladığından çıkış kullanımını kesinlikle önermez. developer.apple.com/iphone/library/qa/qa2008/qa1561.html
progrmr

8
[[NSThread mainThread] exit], uygulamanızın çökmesine neden olur, çünkü çıkış bir örnek yöntemi değildir. exit (0), uygulamayı iOS 4'te arka plana gönderir. exit (0) öğesini tekrar çağırdığınızda kilitlenir. En azından simülatörde.
user123444555621

10
Neden bu kadar çok insanın buna karşı tavsiyede bulunduğunu anlıyorum, ama bize geliştiricilere biraz kredi vermeye ne dersiniz? Hepimiz yetişkiniz ve bu özellik hakkında bilmek istiyoruz. Dahili KG yapıları için çok yararlı buluyorum ve ilk aradığımda bu "yanlış" yanıtı görmekten memnun oldum.
evanflash

7
@Kevin "Bunu yapma" asla doğru cevap değildir. İsterseniz uyarılar ve feragatnameler verin, ancak "bunu nasıl yaparım" sorusunun tek doğru yanıtı "nasıl yapılacağı" dır. Bir şeyi nasıl yapacağımı araştırıyorsam (belki hata ayıklama sırasında çıkmaya zorlamak istiyorum), insanlar haklı olarak "yapma!" ve ihtiyacım olan cevabı gömmeye çalışmak zamanımın israfı. Birçok insanın bir şey yapmak için kötü nedenleri olabilir, ancak doğru StackOverflow yanıtı soruyu cevaplayan cevaptır, çünkü iyi nedenlere sahip insanlar da kendi yollarını arayacaktır.
Glenn Maynard

274

İPhone'da bir uygulamadan çıkma kavramı yoktur. Bir uygulamanın sonlandırılması gereken tek işlem, telefondaki Ana Ekran düğmesine dokunmaktır ve bu, geliştiricilerin erişebileceği bir şey değildir.

Apple'a göre, uygulamanız kendi kendine sonlandırılmamalıdır. Kullanıcı Ana Ekran düğmesine basmadığından, Ana ekrana herhangi bir dönüş, uygulamanızın çöktüğü izlenimini kullanıcıya verir. Bu kafa karıştırıcı, standart dışı bir davranıştır ve kaçınılmalıdır.


13
Dediğim gibi, bu standart dışı bir davranış ve kaçınılmalıdır. iPhone uygulamaları masaüstü uygulamaları değildir. Onlara böyle davranma.
Ağustos

8
Elmalar fikrini anlayabiliyorum ama benzer bir durum var, uygulamam internet erişimi gerektirir, mevcut değilse, sadece bir hata mesajı yerine uygulamayı terk edebilmelidir
Anthony Main

22
İnsanların uyumasına yardımcı olan uygulamalarımız var. Pil tüketimini azaltmak için uygulamanın belirli bir süre sonra sona ermesini istiyorlar. Bence bu durum kabul edilebilir - kullanıcı umarım uykuda ve uygulamadan manuel olarak çıkamıyor.
JamesSugrue

36
Hala katılmıyorum. Uyandıklarında, uygulama "gitti" kullanıcıyı ne olduğunu merak etmeye bırakıyor. Bunun yerine, uygulamanızda bir zamanlayıcı ayarlayın, ardından zaman dolduğunda uygulamayı boşta tutun - etkinlik yok. Kesinlikle hiçbir şey yapmayan bir uygulama pili tüketmez.The Springboard da bir uygulamadır - sadece enerji tasarrufu için kapanmaz. Bunun yerine, yalnızca kullanıcı girdisini bekler.
Ağustos

8
Bu soruya gerçekten cevap vermiyor. % 100 doğrudur, ancak ideal olarak OP'nin sorusuna veya kabul edilen cevaba bir yorum olurdu.
Ben Zotto

49

çıkış (0) kullanıcıya kilitlenme olarak görünür, bu nedenle kullanıcıya bir onay mesajı gösterin. Onaylandıktan sonra askıya alma (ana sayfa düğmesi programlı olarak basın) ve uygulama animasyonla arka plana giderken 2 saniye bekleyin ve ardından kullanıcının görünümünün arkasından çıkın

-(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);
    }
}

1
Elma bu "çıkışı (0)" onaylar mı? Çünkü bazı insanlar 0 çıkışını kullandığınızda
apple'ın

2
@GajendraKChauhan exit(0)önemli değil. Nokta uygulamanızın "bırakma davranışı" olmasıdır. Çok önemli 3. taraflarca yapılan birkaç uygulama dışında, AppStore'da davranıştan çıkmak yasaktır. Ayrıca, ev düğmesi davranışını taklit etmek de reddedilebilir.
Eonil

41

Soru-Cevap bölümüne buradan bakın: https://developer.apple.com/library/content/qa/qa1561/_index.html

S: iOS uygulamamdan programlı olarak nasıl çıkarım?

Bir iOS uygulamasını zarif bir şekilde sonlandırmak için herhangi bir API sağlanmamıştır.

İOS'ta kullanıcı uygulamaları kapatmak için Ana Ekran düğmesine basar. Uygulamanızın amaçlanan işlevini sağlayamadığı koşullar varsa, önerilen yaklaşım kullanıcı için sorunun doğasını ve kullanıcının yapabileceği olası eylemleri belirten bir uyarı göstermektir - WiFi'yi açma, Konum Servislerini etkinleştirme vb. Kullanıcının kendi takdirine bağlı olarak uygulamayı sonlandırmasına izin ver.

UYARI:exit İşlevi çağırmayın . Arama exityapan uygulamalar, zarif bir sonlandırma yapmak ve Ana ekrana geri animasyon uygulamak yerine kullanıcıya çökmüş gibi görünecektir.

Buna ek olarak, veriler kaydedilemeyebilir, çünkü exit komutunu çağırırsanız -applicationWillTerminate:benzer UIApplicationDelegateyöntemler çağrılmaz.

Geliştirme veya test sırasında uygulamanızı sonlandırmanız gerekiyorsa, abortişlev veya assertmakro önerilir


2
Buna uymak için düğmesiz bir AlertView ekledim. Kolay.
Schultz9999

Harika cevap, sadece çıkış (0) ile çalıştı ve özel api'ye ait olduğunu bilmiyordu
Alex Cio

39

Bu gerçekten programdan çıkmanın bir yolu değil, insanları bırakmaya zorlamanın bir yolu.

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];

2
En azından simülatörde, bunu yaparsanız, kullanıcı uygulamayı yeniden açtığında uyarı yine de orada olacaktır. Bu nedenle, onlara en az bir düğme vermenizi öneririm.
cheshirekow

Ana ekran düğmesine basıldığında uygulamanın kapanması için Kalyan'ın yanıtını kullanın.
Timur Kuchkarov

Bununla ilgili sorun, uygulamadan gerçekten çıkmamasıdır, bu nedenle geliştiricinin çıkarak (geçersiz / eski kullanıcı arayüzü atarak, sabitleri temizleme vb.) Çıkarmak istediği her şey, kullanıcı uygulamayı kaydırmazsa gerçekleştirilmeyecektir. kapalı.
Ben Leggiero

Bu uygulamayı öldürmez.
Dustin

38

İnfo.plist'inize gidin ve "Uygulama arka planda çalışmaz" anahtarını kontrol edin. Bu kez kullanıcı ana sayfa düğmesini tıkladığında uygulama tamamen çıkar.


1
Ancak arka plan süreci de işten çıkarılır.
Gajendra K Chauhan

17

Ekle UIApplicationExitsOnSuspendmülk application-info.plistiçin true.


Bu ayar çalışma zamanında değiştirilebilir mi? Demek istediğim, benim app sonraki askıya çıkmak için SEÇENLER dışında - arka planda yaşamak istiyorum - hangi zamanda UIApplicationExitsOnSuspend tanıtmak isteyeceğim. Mümkün mü?
Motti Shneor

13

Bazı testlerden sonra şunları söyleyebilirim:

  • özel arayüzü kullanarak: [UIApplication sharedApplication]uygulama çöktü gibi görünen neden olur, ama bunu - (void)applicationWillTerminate:(UIApplication *)applicationyapmadan önce arayacaktır ;
  • kullanarak exit(0);da uygulamayı sonlandırmak, ancak (sıçrama tahtası en simgeler görünür etkisi dışarı yakınlaştırma, beklenen sever) "normal" bakacağız, AMA demeyeceksin - (void)applicationWillTerminate:(UIApplication *)applicationtemsilci yöntemi.

Benim tavsiyem:

  1. - (void)applicationWillTerminate:(UIApplication *)applicationTemsilciyi el ile arayın .
  2. Arayın exit(0);.

Apple, "Zarif bir sonlandırma yapmak ve Ana ekrana geri canlandırmak yerine, çıkış çağıran uygulamalar kullanıcıya çökmüş gibi görünüyor" nedeniyle çıkış kullanmamayı söylüyor developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD

8

ApplicationDelegate'iniz, kullanıcı tarafından kasıtlı olarak bırakıldığından haberdar edilir:

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

Bu bildirimi aldığımda sadece

        exit(0);

Hangi tüm işi yapar. Ve en iyi şey, kullanıcıların istifa etmeyi amaçlamasıdır, bu yüzden orada çağırmak için bir sorun olmamalıdır.

Ses Uygulamamda, müzik çalmaya devam ederken insanlar cihazlarını senkronize ettikten sonra uygulamadan çıkmak gerekiyordu. Senkronizasyon tamamlanır tamamlanmaz bir bildirim alırım. Ancak bundan hemen sonra uygulamayı bırakmak aslında bir çökme gibi görünecektir.

Bunun yerine bir sonraki arka plan eyleminde uygulamayı GERÇEKTEN bırakmak için bir bayrak ayarladım. Bir senkronizasyondan sonra uygulamayı yenilemek için iyidir.


1
Uygulama, gelen telefon görüşmesi gibi diğer nedenlerle aktif olarak istifa edeceğinden bu iyi bir çözüm değildir.
frankodwyer

Çözüm, yalnızca yararlı olduğunda çıkan bir çek eklemektir. Örneğin, kullanıcı başlangıç ​​ekranındaysa. Telefon araması geliyor olsa bile sorun değil. Apple, uygulamalarımdaki iOS 2'den bu yana bunu reddetmedi. stackoverflow.com/a/43906936/712124
kedi

6

Uygulamam son zamanlarda reddedildi bc Belgelenmemiş bir yöntem kullandım. Kelimenin tam anlamıyla:

"Maalesef özel bir API kullandığından App Store'a eklenemez. İPhone Geliştirici Programı Lisans Sözleşmesi bölüm 3.3.1'de belirtildiği gibi herkese açık olmayan API'ların kullanılması yasaktır:

"3.3.1 Uygulamalar, Belgeli API'leri yalnızca Apple tarafından belirtilen şekilde kullanabilir ve herhangi bir özel API kullanmamalı veya çağırmamalıdır."

Uygulamanıza dahil edilen herkese açık olmayan API, terminateWithSuccess "


6

Apple diyor ki:

"Uyarı: çıkış işlevini çağırma. Çıkış çağıran uygulamalar, zarif bir sonlandırma yapmak ve Ana ekrana geri animasyon uygulamak yerine kullanıcıya çökmüş gibi görünür."

Bunun kötü bir varsayım olduğunu düşünüyorum. Kullanıcı bir çık düğmesine basarsa ve "Uygulama şimdi sonlandırılır." Apple, bir uygulamadan çıkmak için geçerli bir yol sağlamalıdır (çıkış (0) değil).


3
Herhangi bir iDevice'in alt kısmında bulunabilecek Ana Sayfa düğmesini çağırırlar. Bu nedenle, kendi bırakma düğmenizi oluşturmanıza asla gerek yoktur.
Popeye

4

Bu iyi bir cevap aldı ama biraz genişlemeye karar verdi:

Apple'ın iOS İnsan Arabirim Yönergeleri'ni iyi okumadan uygulamanızın AppStore'a kabul edilmesini sağlayamazsınız. (size karşı herhangi bir şey yaptığınız için reddetme hakkını saklı tutarlar ) "Programlı Olarak Çıkma" bölümü http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. html , bu durumda nasıl davranmanız gerektiği konusunda kesin bir kılavuzdur.

Apple platformunda herhangi bir sorunla karşılaşırsanız, kolayca bir çözüm bulamazsanız, HIG'ye danışın. Apple bunu yapmanızı istemiyor ve genellikle (Apple değilim, bu yüzden her zaman garanti edemiyorum) belgelerinde bunu söylüyorlar.


3

Hımm, eğer uygulamanız bir internet bağlantısı gerektiriyorsa, uygulamadan 'çıkmanız gerekebilir'. Bir uyarı görüntüleyebilir ve ardından böyle bir şey yapabilirsiniz:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}

9
Hayır, feshetmenize gerek yok. Örneğin iTunes uygulaması, düzgün bir bağlantı algılayamadığında, bağlı olmadıklarını belirten bir ekran açar. Çıkmaz, sadece neler olup bittiğini kullanıcıya bildirir. Kullanıcı daha sonra ana sayfa düğmesine dokunarak kapanır.
Ağustos

1
Pusula uygulaması, işlevini yerine getiremiyorsa kapanıyor.
Josh Lee

3

Apple, bu işlevlerin kullanımını şiddetle tavsiye etmediğinden exit(0), abort()işlevleri kullanarak uygulamadan çıkamıyoruz. Yine de bu işlevleri geliştirme veya test amacıyla kullanabilirsiniz.

Geliştirme veya test sırasında uygulamanızı sonlandırmak gerekiyorsa, iptal etme işlevi veya iddia makrosu önerilir

Daha fazla bilgi için lütfen bu Apple Soru-Cevap dizisini bulun .

Bu fonksiyonun kullanımı gibi uygulama çöküyor gibi bir izlenim yaratmak. Bu nedenle, bazı işlevlerin kullanılamaması nedeniyle uygulamayı kapatma konusunda farkında kullanıcıya sonlandırma mesajı ile Uyarı görüntüleyebileceğimiz gibi bazı önerilerim var.

Ancak Uygulamayı Başlatma ve Durdurma için iOS İnsan Arayüzü Kılavuzu , Uygulamayı sonlandırmak için Asla Çık veya Kapat düğmesini kullanmamayı önerir . Bunun yerine, durumu açıklamak için uygun mesajı görüntülemeyi önerirler.

Bir iOS uygulaması hiçbir zaman Kapat veya Çık seçeneğini görüntülemez. Kullanıcılar başka bir uygulamaya geçtiklerinde, Ana ekrana döndüklerinde veya cihazlarını uyku moduna aldıklarında uygulamayı kullanmayı bırakırlar.

Bir iOS uygulamasından asla programlı olarak çıkmayın. İnsanlar bunu bir çökme olarak yorumlama eğilimindedir. Bir şey uygulamanızın amaçlandığı gibi çalışmasını engelliyorsa, kullanıcılara durum hakkında bilgi vermeniz ve bu konuda ne yapabileceklerini açıklamanız gerekir.


2

Yukarıdakilere ek olarak, iyi, cevap Sadece eklemek istedim, hafızanızı temizlemeyi düşünün.

Uygulamanız çıktıktan sonra, iPhone OS uygulamanızın geride bıraktığı her şeyi otomatik olarak temizler, böylece tüm belleği manuel olarak boşaltmak uygulamanızın çıkması için gereken süreyi artırabilir.


Lütfen cevabınızı IOS4.0 ve UP'nin mevcut senaryosunda değiştirin ..: 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);
  }
}

1

Yukarıda anlatılan [[NSMutableArray new] addObject: nil] yaklaşımını, bir anlatım çıkışı (0) işlev çağrısı yapmadan uygulamadan çıkmaya (çökmeye) zorlamak için kullandım.

Neden? Uygulamam, ortadaki adam saldırılarını önlemek için tüm ağ API çağrılarında sertifika sabitleme kullandığından. Bunlar, finansal uygulamamın başlangıçta yaptığı başlatma çağrılarını içerir.

Sertifika kimlik doğrulaması başarısız olursa, tüm başlatma çağrılarım hata veriyor ve uygulamamı belirsiz bir durumda bırakıyor. Kullanıcının eve gitmesine ve ardından uygulamaya geri dönmesine izin vermek, uygulamanın işletim sistemi tarafından temizlenmediği sürece hala başlatılmamış ve güvenilmez olduğu için yardımcı olmaz.

Bu nedenle, bu durumda, kullanıcıyı uygulamanın güvenli olmayan bir ortamda çalıştığını bildiren bir uyarı almanın en iyi olduğunu düşündük ve daha sonra "Kapat" a bastıklarında, yukarıda belirtilen yöntemi kullanarak uygulamayı kapatmaya zorlayın.


Tek bir tam ekran sıradan uyarı görüntülemenizi engelleyen şeyi göremiyorum, kullanıcıya uygulamanın bu "sertifika sabitleme" nedenleriyle kullanılamadığını söyler ve hepsi bu kadar. Kullanıcı sonunda uygulamayı kapatacak. Bilmiyor olabilirsiniz, ancak iOS, sürecinizi öldürme (durumunu koruma) ve daha sonra geri yükleme hakkını saklı tutar ve iOS uygulamasının "yaşam döngüsü" gerçekten sizin elinizde değildir. Kilitlenmeniz basitçe bir kilitlenmedir ve işletim sistemi uygulamayı yine de canlandırmayı seçebilir.
Motti Shneor

Vay canına, üç yaşında bir yazı. Her neyse, yeni uygulama mimarisi, API'yi yeniden deneyen ve blok ekranını bırakan veya yeni bir hatayla blok ekranına döndüren bir yeniden deneme düğmesiyle bunu hemen hemen yapar.
Michael Long

Eski uygulama yapısı, başlangıç ​​API çağrılarını yeniden denemek için herhangi bir iyi yola izin vermedi ve uygulama onlarsız tutarsız bir durumdaydı. Kalıcı bir blok ekran kullanmış olabiliriz, ancak bu, kullanıcının uygulamayı kendisinden çıkmak zorunda kalmasını gerektiriyordu ve her kullanıcının uygulamalara çift tıklayıp zorlamayı nasıl bilmediğine karar verildi. Bugün daha kolay, ancak üç yıl önce oldukça gizli.
Michael Long

1
[[UIApplication sharedApplication] terminateWithSuccess];

İyi çalıştı ve otomatik çağrılar

- (void)applicationWillTerminateUIApplication *)application delegate.

derleme zamanı uyarısını kaldırmak için bu kodu ekleyin

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

5
Bu özel bir yöntemdir, Diego Mercado uygulamasının reddedildiğini yukarıda açıkladı, o zaman neden böyle bir risk almalısınız.
RVN

Özel API kullan, uygulamanın Apple tarafından reddedilmesini sağlar.
ZYiOS

2
kurumsal uygulama için - bu bir çözüm olabilir.
user1140780

- (IBAction) exitApp: (id) gönderen {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self performSelector: selector withObject: [UIApplication sharedApplication]]; }
unom

@ unmircea bu incelemeyi geçti mi?
Harika-o

1

exit(0)Hemen uygulamadan çıkacağından ve uygulamanızın çöktüğü gibi görüneceğinden işlevi doğrudan çağırmamalısınız . Kullanıcılara bir onay uyarısı göstermek ve bunu kendileri yapmalarına izin vermek daha iyidir.

Hızlı 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)
}

Kullanımı:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

0

Kullanıcı bir uygulamanın ne zaman çıkacağına karar vermelidir. Bir uygulamadan çıkıldığında bunun iyi bir kullanıcı etkileşimi olduğunu düşünmüyorum. Bu nedenle güzel bir API yok, sadece ev düğmesinin bir tane var.

Bir hata varsa: Daha iyi uygulayın veya kullanıcıyı bilgilendirin. Yeniden başlatma gerekiyorsa: Kullanıcıyı bilgilendirme işlemini daha iyi uygulayın.

Kulağa aptalca geliyor, ancak kullanıcının karar vermesine ve bildirmesine izin vermeden uygulamadan çıkmak kötü bir uygulamadır. Ve Apple, kullanıcı etkileşimi için bir ana sayfa düğmesi olduğundan, aynı işlev için 2 şey olmamalıdır (bir uygulamadan çıkılması).


0

Ana ekran düğmesinden başka bir uygulamadan çıkmak gerçekten iOS-esque olmayan bir yaklaşımdır.

Yine de, özel bir şey kullanmayan bu yardımcıyı yaptım:

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

Ama yine de benim durumumda üretim amaçlı değildi. Çökme raporlarını test etmek veya bir Temel Veri sıfırlandıktan sonra hızlı bir şekilde yeniden başlatmak içindir. Üretim kodunda işlev bırakılırsa reddedilmemeyi güvenli hale getirdi.


0

Swift 4.2 (veya üstü)

Çağrılan kütüphane Darvinkullanılabilir.

import Darwin

exit(0) // Here you go

Not: Bu, iOS uygulamalarında önerilmez.

Bunu yaptığınızda çökme günlüğü elde edersiniz.


0

İPadOS 13'te artık aşağıdaki gibi tüm sahne oturumlarını kapatabilirsiniz:

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

Bu, applicationWillTerminate(_ application: UIApplication)uygulama temsilcinizi arayacak ve sonunda uygulamayı sonlandıracaktır.

Ancak iki şeye dikkat edin:

İOS / iPadOS 13'teki sahneler hakkında daha fazla bilgi: https://developer.apple.com/documentation/uikit/app_and_environment/scenes


-1

Bir uygulamadan başka bir yoldan çıkma

Yine de, özel bir şey kullanmayan bu yardımcıyı yaptım:

Çıkış (0);


-1

Arka planda da çalışan, örneğin konum güncellemelerini almak için (bunun için konum güncellemeleri arka plan özelliğini kullanarak) bir uygulamadan çıkmak uygun olabilir .

Örneğin, kullanıcının konum tabanlı uygulamanızın oturumunu kapattığını ve ana sayfa düğmesini kullanarak uygulamayı arka plana ittiğini varsayalım. Bu durumda uygulamanız çalışmaya devam edebilir, ancak uygulamadan tamamen çıkmak mantıklı olabilir. Kullanıcı için iyi (kullanması gerekmeyen bellek ve diğer kaynakları serbest bırakır) ve uygulama kararlılığı için iyi olur (örneğin, uygulamanın mümkün olduğunda periyodik olarak yeniden başlatılmasını sağlamak bellek sızıntılarına ve diğer düşük belleğe karşı bir güvenlik ağıdır sorunlar).

Bu (muhtemelen olmasa da, aşağıya bakın :-) gibi bir şeyle elde edilebilir:

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

Uygulama daha sonra arka plandan çıkacağından, kullanıcıya yanlış görünmeyecek ve bir sonraki çalıştırışlarında kullanıcı arayüzünün geri yüklenmesi koşuluyla bir çökmeye benzemeyecektir. Diğer bir deyişle, kullanıcı, uygulama arka planda olduğunda uygulamanın sistem tarafından başlatılan sonlandırılmasından farklı görünmez.

Yine de, sistemin uygulamanın sonlandırılabileceğini bilmesini sağlamak için daha standart bir yaklaşım kullanılması tercih edilir. Örneğin, bu durumda, mevcutsa bir harita görünümünde geçerli konumu gösterme de dahil olmak üzere konum güncellemeleri isteğini durdurarak GPS'in kullanılmadığından emin olarak. Bu şekilde sistem [[UIApplication sharedApplication] backgroundTimeRemaining], uygulama arka plana girdikten sonra uygulamayı birkaç dakika (yani ) sonlandırır . Bu, uygulamayı sonlandırmak için kod kullanmak zorunda kalmadan aynı faydaları elde edecektir.

- (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.
    }
}

Ve elbette, http://developer.apple.com/iphone/library/qa/qa2008/qa1561.htmlexit(0) referansını veren diğer yanıtlara göre, kullanım ön planda çalışan ortalama üretim uygulaması için asla uygun olmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.