Durante lo sviluppo di una app iOS non è insolito che si presenti la necessità di effettuare la chiusura forzata - in inglese, lo shutdown - dell'applicazione: parliamo, per intenderci, del classico pulsante Exit, presente nella maggior parte delle App Android ma generalmente non utilizzato in ambiente iOS, dove si preferisce mandare la App in background e lasciare che sia poi il sistema a gestirne il carico a livello di risorse.
In effetti il sistema iOS non sembra prevedere una funzione che consenta di ottenere in modo programmatico quello che in termine tecnico è noto come graceful shutdown, ovvero una chiusura che non provochi - o rischi di provocare - un vero e proprio crash dell'applicazione: il modo preferibile per "chiudere" una App è simulare la pressione del tasto Home, che provoca per l'appunto l'invio della stessa in background.
Se vogliamo rispettare questa filosofia, possiamo limitarci a utilizzare la seguente istruzione, che emula la pressione del tasto Home in modo programmatico:
1 2 |
// programmatically emulate home button press [[UIApplication sharedApplication] performSelector:@selector(suspend)]; |
Nel caso in cui invece volessimo provocare una chiusura forzata della App, possiamo usare il seguente comando:
1 2 |
// force shutdown exit(0); |
Attenzione, però: il comando exit provoca l'interruzione immediata dell'applicazione con tanto di errorlevel (il numero tra parentesi)... in altre parole, un vero e proprio crash: nulla di più dissimile dal graceful shutdown di cui sopra! Per questo motivo la Apple scoraggia fortemente l'utilizzo del comando exit, il quale peraltro rischia di provocare effetti collaterali a livello di esperienza utente.
Tutto ciò premesso, nei casi in cui il semplice invio in background non è sufficiente è possibile coniugare i due metodi nel seguente modo per rendere il tutto leggermente più fluido agli occhi dell'utilizzatore finale:
1 2 3 4 5 6 7 8 |
// send the app in background [[UIApplication sharedApplication] performSelector:@selector(suspend)]; // wait 3 seconds to ensure it disappeared [NSThread sleepForTimeInterval:3.0]; // force a "hidden" shutdown while in background exit(0); |
In questo modo verranno compiute in sequenza le seguenti operazioni:
- L'App verrà inviata in background, simulando la pressione del tasto Home da parte dell'utente.
- Il sistema attenderà 3 secondi, sufficienti a completare la procedura di invio in background e a concludere eventuali attività ancora in corso.
- Il sistema arresterà l'app, provocando una uscita forzata con errorlevel 0.
Questo un esempio di implementazione del metodo appena descritto all'interno di un classico bottone, con tanto di confirmation alert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
-(void)forceShutdown_Click:(id)btn { [UIAlertView showWithTitle:@"Force Shutdown" message:@"Are you really sure?" cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK" tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) { if (buttonIndex != 0) { // send the app in background [[UIApplication sharedApplication] performSelector:@selector(suspend)]; // wait 3 seconds to ensure it disappeared [NSThread sleepForTimeInterval:3.0]; // force a "hidden" shutdown while in background exit(0); } }]; } |
Per il momento è tutto: felice shutdown!