{"id":8669,"date":"2012-03-15T09:50:05","date_gmt":"2012-03-15T08:50:05","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=8669"},"modified":"2012-03-15T09:50:05","modified_gmt":"2012-03-15T08:50:05","slug":"12-objective-c-uiapplication-la-classe-appdelegate-e-la-sua-istanza-a-runtime","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/12-objective-c-uiapplication-la-classe-appdelegate-e-la-sua-istanza-a-runtime\/","title":{"rendered":"12. Objective-C: UIApplication, la classe AppDelegate e la sua istanza a runtime"},"content":{"rendered":"<p>Una delle peculiarita&#8217; piu&#8217; importanti da tenere presente quando si programma per iPhone e&#8217; l&#8217;utilizzo della classe AppDelegate e la sua istanza in memoria. Ogni applicazione per iPhone gira in un ambiente cosidetto sandboxed. In pratica, ha un accesso limitato alle risorse di sistema ed una visione &#8220;inscatolata&#8221;, appunto, dell&#8217;ambiente. In questo contesto, prende posto l&#8217;istanza della classe AppDelegate; quando si avvia un&#8217;applicazione dall&#8217;ambiente <strong>SpringBoard<\/strong>, quello che succede e&#8217; che viene lanciata la funzione main del nostro binario che provvede ad avviare il ciclo di mainloop contenente le inizializzazioni per:<!--more--><\/p>\n<ul>\n<li>Il gestore di memoria<\/li>\n<li>Il gestore dell&#8217;ambiente grafico <\/li>\n<li>Il gestore d&#8217;eventi<\/li>\n<li>L&#8217;istanza della classe AppDelegate<\/li>\n<\/ul>\n<p>Il nome della classe da utilizzare come AppDelegate viene passata come parametro della funzione: <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nint retVal = UIApplicationMain(argc, argv, nil, @\"CoreAnimationAppDelegate\"); \r\n<\/pre>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-01.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-01\" title=\"objective-c-UIApplication-AppDelegate-runtime-01\" width=\"400\" height=\"418\" class=\"aligncenter size-full wp-image-8670\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-01.jpg 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-01-287x300.jpg 287w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><strong>UIApplication<\/strong> risulta essere fondamentale per poter referenziare il delegato principale (l&#8217;istanza di AppDelegate) della nostra applicazione caricata in memoria. La classe UIApplication, infatti, funziona da punto di coordinamento centrale. Ogni applicazione avra&#8217; esattamente una istanza di UIApplication, caricata in fase di startup dalla funzione UIApplicationMain vista sopra. Unitamente ad altri compiti, questa funzione avvia un&#8217;oggetto singleton di tipo UIApplication e, contestualmente, crea un&#8217;istanza della nostra classe delegato <strong>AppDelegate<\/strong>. <\/p>\n<p>Il ruolo fondamentale di UIApplication e&#8217; quello di gestire lo smistamento e consegna degli eventi proveniente dall&#8217;utente. L&#8217;oggetto UIControl, visto nelle precedenti lezioni, invia tutti i messaggi relativi ad eventi dell&#8217;utente all&#8217;istanza di UIApplication. Sara&#8217; quest&#8217;ultima a girarli ai rispettivi destinatari durante l&#8217;esecuzione del <em>mainloop<\/em> della nostra applicazione. <\/p>\n<p>UIApplication mantiene anche una lista di tutte le finestre (UIWindow) attualmente presenti nell&#8217;applicazione, in maniera da poter accedere ad ognuno degli oggetti UIView presenti in esse. <\/p>\n<p>Abbiamo gia&#8217; parlato diverse volte dell&#8217;oggetto UIWindow e degli oggetti ad esso legati (UIScreen, UIViewController, UIView, &#8230;). UIWindow ci permette di ottenere accesso ad una serie di funzioni e caratteristiche strettamente legate alle proprieta&#8217; della &#8220;finestra&#8221; principale della nostra applicazione. Le sue principali funzioni sono: fornire un&#8217;area per mostrare a schermo &#8220;qualcosa&#8221; e distribuire eventi ai sotto oggetti (dispatcher). <\/p>\n<p>Insieme all&#8217;oggetto UIWindow, viene caricato in memoria un&#8217;istanza di un altro oggetto molto importante: UIScreen. Esso si preoccupa di fornire informazioni legate all&#8217;area fisica di schermo disponibile per le nostre applicazioni. Cosi&#8217;, ad esempio, se volessimo conoscere l&#8217;area di schermo disponibile in un determinato istante, ci bastera&#8217; fare accesso all&#8217;istanza di UIScreen allocata per noi dall&#8217;application launcher di iPhone. <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[[UIScreen mainScreen] bounds] \r\n<\/pre>\n<p>Quello che viene ritornato dal messaggio sopra e&#8217; un oggetto di tipo CGRect che potra&#8217; essere usato per svariati scopi come, ad esempio, istruire la dimensione di una UIView all&#8217;interno della nostra finestra principale. <\/p>\n<p>La parte piu&#8217; interessante dei compiti di UIApplication, riguarda l&#8217;assegnazione di un delegato alla classe fornita come paramentro nel main. La classe scelta deve adottare il protocollo UIApplicationDelegate e rispondere (implementare) ad una serie di messaggi (metodi) necessari al corretto funzionamento dell&#8217;applicazione. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-02.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-02\" title=\"objective-c-UIApplication-AppDelegate-runtime-02\" width=\"513\" height=\"80\" class=\"aligncenter size-full wp-image-8671\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-02.jpg 513w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-02-300x46.jpg 300w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>L&#8217;interfaccia estremamente programmabile di UIApplication e del suo protocollo UIApplicationDelegate permettono di gestire il comportamento della propria applicazione. E&#8217; possibile controllare il responso dell&#8217;applicazione per cambiare l&#8217;orientamento dell&#8217;interfaccia attraverso il metodo <strong>setStatusBarOrientation:animated:<\/strong>: <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n... \r\n... \r\n[[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeLeft]; \r\n... \r\n... \r\n<\/pre>\n<p>Come e&#8217; possibile notare dal code snippet sopra, la chiamata al metodo viene effettuata sull&#8217;istanza (sharedApplication) disponibile in memoria. <\/p>\n<p>Un&#8217;altra importante funzionalita&#8217; gestita da UIApplication riguarda l&#8217;uso collaborativo di risorse in formato <strong>openURL<\/strong>. Diverse applicazioni, infatti, possono cooperare nella gestione delle risorse come email, immagini o numeri di telefono attravero l&#8217;uso del metodo openURL:. Ad esempio, un&#8217;applicazione che prova a gestire un&#8217;istruzione come la seguente: <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-03.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-03\" title=\"objective-c-UIApplication-AppDelegate-runtime-03\" width=\"550\" height=\"80\" class=\"aligncenter size-full wp-image-8672\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-03.jpg 574w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-03-300x43.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>causera&#8217; l&#8217;apertura immediata dell&#8217;applicazione Mail. <\/p>\n<p>Allo stesso modo, se vogliamo gestire l&#8217;apparizione\/scomparsa\/stile della top bar, abbiamo bisogno di dialogare con un metodo denominato <strong>setStatusBarHidden<\/strong>:. <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n... \r\n... \r\n[[UIApplication sharedApplication] setStatusBarHidden: YES]; \r\n... \r\n... \r\n<\/pre>\n<p>Attenzione al fatto che dopo aver nascosto la barra in alto, si dovra&#8217; procedere alla nota chiamata: <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n... \r\n... \r\n[[UIScreen mainScreen] bounds]; \r\n... \r\n... \r\n<\/pre>\n<p>per ottenere i nuovi estremi dello schermo disponibili. Effettuando la chiamata prima, infatti, non si otterrebbero i nuovi margini derivati dalla scomparsa della topbar (20 pixels). <\/p>\n<p>Se la nostra applicazione utilizza la rete, e&#8217; necessario notificare l&#8217;utente durante l&#8217;uso della connettivita&#8217;, attraverso un indicatore di network activity posto nella top bar in alto. Per abilitarlo sara&#8217; sufficiente invocare un metodo di istanza presente su UIApplication: <strong>setNetworkActivityIndicatorVisible:<\/strong>. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-04.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-04.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-04\" title=\"objective-c-UIApplication-AppDelegate-runtime-04\" width=\"540\" height=\"105\" class=\"aligncenter size-full wp-image-8673\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-04.jpg 540w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-04-300x58.jpg 300w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Un&#8217;ultima caratteristica che e&#8217; necessario illustrare e&#8217; quella della possibilita&#8217; di ottenere da qualunque parte del nostro codice l&#8217;istanza alla classe AppDelegate di cui sopra. Questo puo&#8217; risultare molto utile, specialmente quando ci troviamo a dover gestire funzionalita&#8217; analoghe da tutte le parti della nostra applicazione e strettamente legate al comportamento della nostra applicazione (eventi previsti o imprevisti, dialogo con la &#8220;scatola&#8221; dell&#8217;applicazione). E&#8217; possibile ottenere l&#8217;istanza della classe attraverso la chiamata al metodo <strong>delegate<\/strong>. <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n... \r\n... \r\n[[UIApplication sharedApplication] delegate]; \r\n... \r\n... \r\n<\/pre>\n<p>Quello che ci viene restituito e&#8217; un puntatore all&#8217;istanza della classe AppDelegate creata per noi da UIApplicationMain. Ovviamente, tutti i metodi e le properties esposti risulteranno visibili anche dalla sua istanza e quindi utilizzabili in tutte le parti del programma. <\/p>\n<p>Esistono molti altri metodi e caratteristiche della classe UIApplication, che possono essere visionati a questo link della documentazione ufficiale. <\/p>\n<h4>AppDelegate e la sua istanza a runtime <\/h4>\n<p>La classe che implementa l&#8217;application delegate deve adottare il protocollo <strong>UIApplicationDelegate<\/strong>. Questo significa che deve\/puo&#8217; implementare alcuni metodi necessari o meno al suo corretto funzionamento. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-05.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-05.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-05\" title=\"objective-c-UIApplication-AppDelegate-runtime-05\" width=\"350\" height=\"303\" class=\"aligncenter size-full wp-image-8674\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-05.jpg 350w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-05-300x259.jpg 300w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come si puo&#8217; notare dal grafico sopra, la sua posizione e&#8217; ideale per tutte quelle funzioni\/messaggi che riguardano l&#8217;intera applicazione e\/o suoi comportamenti globali. Il primo metodo che abbiamo gia&#8217; avuto modo di vedere approfonditamente nelle scorse lezioni riguarda la notifica di fine caricamento dell&#8217;applicazione: <strong>applicationDidFinishLaunching:<\/strong>. <\/p>\n<p>Vale la pena segnalare alcuni metodi che potrebbero risultare molto utili durante la stesura della nostra applicazione. <strong>application:didFinishLaunchingWithOptions:<\/strong> e&#8217; un metodo molto interessante che permette di discernere l&#8217;avvio della nostra applicazione a seconda se l&#8217;applicazione e&#8217; stata aperta da una notifica remota (push notification) oppure per gestire un indirizzo offerto tramite openURL. <\/p>\n<p>Una delle caratteristiche piu&#8217; interessanti della nuovo SDK, risulta essere la possibilita&#8217; di gestire e personalizzare l&#8217;utilizzo della chiamata openURL per lanciare applicazioni di terze parti che riescano a gestire particolari schemi URL. Potremmo, ad esempio, voler creare un nostro protocollo (schema) URL con cui aprire la nostra applicazione: <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nmyApp:\/\/parametri\/a?=seguire \r\n<\/pre>\n<p>Come si puo&#8217; immaginare, questa caratteristica offre innumerevoli possibilita&#8217; per la gestione e visualizzazione di documenti. Per realizzare un&#8217;associazione tra uno schema URL e la nostra applicazione dobbiamo innanzitutto editare il file <strong>info.plist<\/strong>, presente nel nostro progetto. Aggiungiamo una riga al documento: <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-06.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-06.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-06\" title=\"objective-c-UIApplication-AppDelegate-runtime-06\" width=\"500\" height=\"334\" class=\"aligncenter size-full wp-image-8675\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-06.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-06-300x200.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>e selezioniamo <strong>URL types<\/strong> come chiave: <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-07.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-07.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-07\" title=\"objective-c-UIApplication-AppDelegate-runtime-07\" width=\"500\" height=\"334\" class=\"aligncenter size-full wp-image-8676\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-07.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-07-300x200.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Espandiamo l&#8217;elemento appena creato ed aggiungiamo un valore al nuovo campo creato. Puo&#8217; essere un valore alfanumerico qualsiasi ma, tipicamente, viene usato un nome in reverse domain order (qualcosa del tipo: org.myapp). <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-08.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-08.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-08\" title=\"objective-c-UIApplication-AppDelegate-runtime-08\" width=\"500\" height=\"335\" class=\"aligncenter size-full wp-image-8677\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-08.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-08-300x201.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Aggiungiamo un&#8217;altro elemento, questa volta figlio del nuovo elemento appena creato. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-09.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-09.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-09\" title=\"objective-c-UIApplication-AppDelegate-runtime-09\" width=\"500\" height=\"335\" class=\"aligncenter size-full wp-image-8678\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-09.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-09-300x201.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Selezioniamo il tipo URL Schemes come chiave <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-10.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-10.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-10\" title=\"objective-c-UIApplication-AppDelegate-runtime-10\" width=\"500\" height=\"335\" class=\"aligncenter size-full wp-image-8679\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-10.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-10-300x201.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Infine, inseriamo la stringa che diverra&#8217; il nostro schema primario (ad esempio, &#8220;myapp:\/\/&#8221;). <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-11.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-11.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-11\" title=\"objective-c-UIApplication-AppDelegate-runtime-11\" width=\"500\" height=\"335\" class=\"aligncenter size-full wp-image-8680\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-11.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-11-300x201.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>A questo punto, quando l&#8217;iphone trovera&#8217; un openURL formattato secondo il nostro schema, inviera&#8217; un messaggio alla UIApplicationDelegate. Se vogliamo fornire un gestore personalizzato che intervenga all&#8217;apertura dell&#8217;applicazione, possiamo implementare le nostre personalizzazione all&#8217;interno del metodo handleOpenURL:. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-12.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-12.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-12\" title=\"objective-c-UIApplication-AppDelegate-runtime-12\" width=\"533\" height=\"62\" class=\"aligncenter size-full wp-image-8681\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-12.jpg 533w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-12-300x34.jpg 300w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Servizi e stato dell&#8217;applicazione<\/h4>\n<p>Lo stato di un applicazione su iPhone puo&#8217; essere molto piu&#8217; importante di quanto non lo sia su un&#8217;applicazione Desktop. Esistono molti eventi che causano la sospensione o terminazione di un&#8217;applicazione sul dispositivo. Questi stati possono presentarsi quando l&#8217;utente preme il pulsante Home, blocca lo schermo o riceve una chiamata voce. Per quanto detto, e&#8217; importante per un&#8217;applicazione conoscere quando il suo stato sta per cambiare, in maniera da salvare tutti i parametri di stato e di configurazione, sospendere le elaborazioni in corso ed effettuare qualunque altra operazione utile alla sospensione dell&#8217;applicazione. Visto che non c&#8217;e&#8217; molto che possa fare un&#8217;applicazione per evitare di cambiare il suo stato, puo&#8217; almeno prendere tutte le precauzioni perche&#8217; una volta terminata l&#8217;occorrenza dell&#8217;evento che ha causato la sospensione, essa possa ripartire da dove si era bloccata. Questa tecnica si chiama suspend&#038;resume e puo&#8217; essere implementata con poche righe di codice su iPhone. <\/p>\n<p>Quando la periferica viene bloccata oppure arriva una telefonata voce, l&#8217;applicazione in corso viene sospesa. Quando si verifica tale evento, viene invocato il metodo <strong>applicationWillResignActive<\/strong> della nostra classe delegato. Questo metodo puo&#8217; essere riscritto e personalizzato in maniera da tenere in considerazione tutte le variabili e parametri che devono andare salvati allo scopo di sospendere correttamente l&#8217;applicazione. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-13.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-13.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-13\" title=\"objective-c-UIApplication-AppDelegate-runtime-13\" width=\"470\" height=\"88\" class=\"aligncenter size-full wp-image-8682\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-13.jpg 470w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-13-300x56.jpg 300w\" sizes=\"auto, (max-width: 470px) 100vw, 470px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Mentre l&#8217;applicazione e&#8217; sospesa, non gira in background ma viene terminata completamente. Quando viene ripristinata (resume) viene invocato un altro metodo chiamato <strong>applicationDidBecomeActive<\/strong>. In questo metodo e&#8217; possibile aggiungere tutto il codice necessario al ripristino corretto della nostra applicazione. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-14.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-14.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-14\" title=\"objective-c-UIApplication-AppDelegate-runtime-14\" width=\"464\" height=\"92\" class=\"aligncenter size-full wp-image-8683\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-14.jpg 464w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-14-300x59.jpg 300w\" sizes=\"auto, (max-width: 464px) 100vw, 464px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Nota che quando l&#8217;applicazione viene avviata normalmente (no resume), il metodo applicationDidBecomeActive viene invocato ugualmente. E&#8217; compito del programmatore discernere tra i due eventi (lancio semplice e lancio da resume). <\/p>\n<p>Infine, se vogliamo essere notificati circa la chiusura volontaria dell&#8217;applicazione, possiamo implementare il metodo <strong>applicationWillTerminate:<\/strong>. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-15.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-15.jpg\" alt=\"objective-c-UIApplication-AppDelegate-runtime-15\" title=\"objective-c-UIApplication-AppDelegate-runtime-15\" width=\"452\" height=\"87\" class=\"aligncenter size-full wp-image-8684\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-15.jpg 452w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/03\/objective-c-UIApplication-AppDelegate-runtime-15-300x57.jpg 300w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Riferimenti<\/h4>\n<ul>\n<li><a href=\"https:\/\/developer.apple.com\/library\/ios\/#documentation\/UIKit\/Reference\/UIApplication_Class\/Reference\/Reference.html\" target=\"_blank\">iOS Developer Library: UIApplication Class Reference<\/a> <\/li>\n<li><a href=\"https:\/\/developer.apple.com\/library\/ios\/#documentation\/UIKit\/Reference\/UIScreen_Class\/Reference\/UIScreen.html\" target=\"_blank\">iOS Developer Library: UIScreen Class Reference<\/a><\/li>\n<li><a href=\"https:\/\/developer.apple.com\/library\/ios\/#documentation\/UIKit\/Reference\/UIWindow_Class\/UIWindowClassReference\/UIWindowClassReference.html\" target=\"_blank\">iOS Developer Library: UIWindow Class Reference<\/a><\/li>\n<li><a href=\"https:\/\/developer.apple.com\/library\/ios\/#documentation\/UIKit\/Reference\/UIApplicationDelegate_Protocol\/Reference\/Reference.html\" target=\"_blank\">iOS Developer Library: UIApplicationDelegate Protocol Reference<\/a><\/li>\n<\/ul>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/banner-allertasoglie-push-tre.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/banner-allertasoglie-push-tre.jpg\" alt=\"banner-allertasoglie-push-tre\" title=\"banner-allertasoglie-push-tre\" width=\"550\" height=\"293\" class=\"aligncenter size-full wp-image-8150\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/banner-allertasoglie-push-tre.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/banner-allertasoglie-push-tre-300x159.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una delle peculiarita&#8217; piu&#8217; importanti da tenere presente quando si programma per iPhone e&#8217; l&#8217;utilizzo della classe&#8230;<\/p>\n","protected":false},"author":476,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[605],"tags":[935,1069,1067,1068,1070,845,846,160,1066,850],"class_list":["post-8669","post","type-post","status-publish","format-standard","hentry","category-guida-rapida-alla-programmazione-cocoa-touch","tag-appdelegate","tag-applicationdidbecomeactive","tag-applicationdidfinishlaunching","tag-applicationwillresignactive","tag-applicationwillterminate","tag-corso-objective-c","tag-guida-cocoa-touch","tag-uiapplication","tag-uiapplicationdelegate","tag-uiscreen"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/476"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=8669"}],"version-history":[{"count":5,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8669\/revisions"}],"predecessor-version":[{"id":8689,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8669\/revisions\/8689"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=8669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=8669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=8669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}