{"id":4076,"date":"2010-07-22T12:36:23","date_gmt":"2010-07-22T10:36:23","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=4076"},"modified":"2010-07-29T09:16:47","modified_gmt":"2010-07-29T07:16:47","slug":"t065-registrare-le-estensioni-di-file-supportate-da-un-applicazione-iphone","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t065-registrare-le-estensioni-di-file-supportate-da-un-applicazione-iphone\/","title":{"rendered":"T#065 &#8211; Registrare le estensioni di file supportate da un Applicazione iPhone"},"content":{"rendered":"<p>Ciao a tutti, sono Francesco Noya, un nuovo autore di questa community di programmazione iPhone, e come primo articolo ho deciso di parlarvi di &#8220;estensioni di file&#8221;. A partire dalla versione 3.2 dell&#8217;SDK di Apple, infatti, \u00e8 possibile registrare le estensioni di file che un&#8217;applicazione \u00e8 in grado di gestire. Questo permette, ad esempio, di <strong>creare il proprio lettore di pdf<\/strong> da utilizzare quando si apre un allegato in Mail o con Safari. In questo tutorial vedremo come creare una piccola applicazione che apre automaticamente i file pdf e li mostra in una UIWebview.<\/p>\n<p>Per prima cosa creiamo una &#8220;Window-based application&#8221; e diamole un nome (io l&#8217;ho chiamata &#8220;PDFFromSafari&#8221;).<\/p>\n<p>A questo punto modifichiamo il file <em>info.plist<\/em> per registrare le estensioni che la nostra applicazione sar\u00e0 in grado di manipolare. Per farlo impostiamo la visualizzazione del file come &#8220;Source Code File&#8221; in modo da vedere la sua struttura come file xml.<!--more--><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-01.jpg\" alt=\"t065 registrare estensioni file iphone 01\" title=\"t065-registrare-estensioni-file-iphone-01\" width=\"480\" height=\"370\" class=\"aligncenter size-full wp-image-4078\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-01.jpg 960w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-01-300x231.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-01-150x115.jpg 150w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Il file aperto si presenta pi\u00f9 o meno cos\u00ec:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-02.jpg\" alt=\"t065 registrare estensioni file iphone 02\" title=\"t065-registrare-estensioni-file-iphone-02\" width=\"397\" height=\"260\" class=\"aligncenter size-full wp-image-4079\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-02.jpg 793w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-02-300x196.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-02-150x98.jpg 150w\" sizes=\"auto, (max-width: 397px) 100vw, 397px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Andiamo ad aggiungere le seguenti righe:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\t<key>UIApplicationExitsOnSuspend<\/key>\r\n\t<true\/>\r\n\t\r\n\t<key>CFBundleDocumentTypes<\/key>\r\n\t<array>\r\n\t\t<dict>\r\n\t\t\t<key>CFBundleTypeIconFiles<\/key>\r\n\t\t\t<array>\r\n\t\t\t\t<string><\/string>\r\n\t\t\t<\/array>\r\n\t\t\t<key>CFBundleTypeName<\/key>\r\n\t\t\t<string>NSPasteboardTypePDF<\/string>\r\n\t\t\t<key>CFBundleTypeRole<\/key>\r\n\t\t\t<string>Viewer<\/string>\r\n\t\t\t<key>LSHandlerRank<\/key>\r\n\t\t\t<string>Alternate<\/string>\r\n\t\t\t<key>LSItemContentTypes<\/key>\r\n\t\t\t<array>\r\n\t\t\t\t<string>com.adobe.pdf<\/string>\r\n\t\t\t<\/array>\r\n\t\t<\/dict>\r\n\t<\/array>\r\n<\/pre>\n<p>Analizziamo quello che abbiamo scritto:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n<key>UIApplicationExitsOnSuspend<\/key>\r\n<true\/>\r\n<\/pre>\n<p>Questa opzione impone all\u2019applicazione di chiudersi quando si preme il pulsante dell\u2019iPhone anzich\u00e9 entrare in Background. Ovviamente questo si applica solo se il dispositivo su cui lavoriamo \u00e8 al iOS 4, altrimenti questo \u00e8 il comportamento standard.<\/p>\n<p>Le righe successive invece riguardano proprio la registrazione delle estensioni gestite dall\u2019applicazione.<\/p>\n<p>In particolare:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n<key>CFBundleTypeIconFiles<\/key>\r\n<\/pre>\n<p>Contiene un array di stringhe  contenenti il percorso all\u2019icona che viene associata al file nel men\u00f9 contestuale dei programmi che lo possono aprire.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n<key>CFBundleTypeName<\/key>\r\n<\/pre>\n<p>Ha una stringa con il nome del tipo di documento che apre (nel nostro esempio \u201cNSPasteboardTypePDF\u201d).<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n<key>LSHandlerRank<\/key>\r\n<\/pre>\n<p>Raprresenta il ruolo che ha l\u2019applicazione. Nel nostro caso con Alternate specifichiamo che si tratta di un modo alternativo per aprire il file  <\/p>\n<p>Infine:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n<key>LSItemContentTypes<\/key>\r\n<\/pre>\n<p>contiene un Array di Uniform Type Identifiers (UTIs) che l\u2019applicazione \u00e8 in grado d\u2019aprire. Nel nostro esempio i PDF: com.adobe.pdf<\/p>\n<p>Ora che abbiamo modificato il file info.plist salviamolo e andiamo a scrivere il codice dell\u2019 applicazione. In particolar modo quello che facciamo \u00e8 cambiare il metodo <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\r\n<\/pre>\n<p>Dell&#8217;Application Delegate.<\/p>\n<p>Ecco le modifiche da fare:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    \r\n    \r\n\tNSURL *urlFileEsterno = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];\r\n\t\r\n\tif(urlFileEsterno != NULL){\r\n\t\t\/\/carico il pdf in un oggetto NSData\r\n\t\tNSData *pdf = [[NSData alloc] initWithContentsOfURL:urlFileEsterno];\r\n\t\t\r\n\t\tUIWebView *webview = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen]bounds]]; \r\n\t\t[webview loadData:pdf MIMEType:@\"application\/pdf\" textEncodingName:nil baseURL:nil];\r\n\t\t[pdf release];\r\n\t\t\r\n\t\twebview.scalesPageToFit = YES;\r\n\t\t[window addSubview:webview]; \r\n\t\t[webview release]; \t\r\n\t\t\r\n\t\t\/\/elimino il file copiato sul dispositivo\r\n\t\tNSFileManager *filemanager = [NSFileManager defaultManager];\r\n\t\t[filemanager removeItemAtURL:urlFileEsterno error:NULL];\r\n\t\t[filemanager release];\r\n\t\t\r\n\t}else {\r\n\t\t\/\/mostro un alert\r\n\t\tUIAlertView *popUp = [[UIAlertView alloc] initWithTitle:@\"Aprimi da Safari\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmessage:@\"Prova ad aprirmi da Safari o dal programma Mail\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t   delegate:self \r\n\t\t\t\t\t\t\t\t\t\t\t  cancelButtonTitle:@\"OK\" \r\n\t\t\t\t\t\t\t\t\t\t\t  otherButtonTitles:nil];\r\n\t\t[popUp show];\r\n\t\t[popUp release];\r\n\t}\r\n\r\n\t\r\n    [window makeKeyAndVisible];\r\n\t\r\n\treturn YES;\r\n}\r\n<\/pre>\n<p>Vediamo di capire cosa fa:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSURL *urlFileEsterno = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];\r\n<\/pre>\n<p>Questo \u00e8 l\u2019URL del file esterno. Ogni volta che un file viene aperto questi viene memorizzato all\u2019interno della sottocartella inbox dei Documents dell\u2019applicazione. <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nif(urlFileEsterno != NULL){\r\n<\/pre>\n<p>Controllo l\u2019esistenza del file. Se il file esiste allora lo salvo all\u2019interno di un oggetto NSData grazie al metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSData *pdf = [[NSData alloc] initWithContentsOfURL:urlFileEsterno];\r\n<\/pre>\n<p>Questo permette di aprire il file in una UIWebView con il metodo<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[webview loadData:pdf MIMEType:@\"application\/pdf\" textEncodingName:nil baseURL:nil];\r\n<\/pre>\n<p>Per finire istanziamo un oggetto NSFileManager che si occupa di eliminare il file creato (Ovviamente nulla ci vieta di tenerlo):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\tNSFileManager *filemanager = [NSFileManager defaultManager];\r\n\t[filemanager removeItemAtURL:urlFileEsterno error:NULL];\r\n\t[filemanager release];\r\n<\/pre>\n<p>(NB. Il metodo removeItemAtURL \u00e8 stato introdotto dalla SDK 4, per cui se state usando versioni precedenti dovrete usare qualche accorgimento e cambiare il metodo con removeItemAtPath).<\/p>\n<p>Quello che fa il blocco dell\u2019else \u00e8 semplicemente visualizzare un alert quando si apre l\u2019applicazione in maniera \u201cnormale\u201d, senza passare da Safari (o chi per esso).<\/p>\n<p>Salviamo ed eseguiamo\u2026 dal momento che il simulatore non ha Mail, ho testato il funzionamento dell\u2019app aprendo Gmail da Safari ed andando ad aprire una mail con allegato un pdf. <\/p>\n<p>Vediamo il risultato:<\/p>\n<p>se avvio l\u2019applicazione:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-03.png\" alt=\"t065 registrare estensioni file iphone 03\" title=\"t065-registrare-estensioni-file-iphone-03\" width=\"368\" height=\"710\" class=\"aligncenter size-full wp-image-4080\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-03.png 368w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-03-155x300.png 155w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-03-77x150.png 77w\" sizes=\"auto, (max-width: 368px) 100vw, 368px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Quando apro il pdf in Safari compare il menu Apri in:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-04.png\" alt=\"t065 registrare estensioni file iphone 04\" title=\"t065-registrare-estensioni-file-iphone-04\" width=\"365\" height=\"696\" class=\"aligncenter size-full wp-image-4081\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-04.png 365w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-04-157x300.png 157w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-04-78x150.png 78w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Lo stesso pdf aperto nella nostra applicazione:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-05.png\" alt=\"t065 registrare estensioni file iphone 05\" title=\"t065-registrare-estensioni-file-iphone-05\" width=\"366\" height=\"653\" class=\"aligncenter size-full wp-image-4082\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-05.png 366w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-05-168x300.png 168w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/t065-registrare-estensioni-file-iphone-05-84x150.png 84w\" sizes=\"auto, (max-width: 366px) 100vw, 366px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Considerazioni Finali<\/h4>\n<p>Ci\u00f2 che rende molto potente il meccanismo delle UTI \u00e8 che permette di definire anche tipi di file proprietari. Se siete interessati ad un esempio che include la definizione di UTI personali vi rimando a questa discussione su StackOverflow (in Inglese) al <a href=\"http:\/\/stackoverflow.com\/questions\/2774343\/how-do-i-associate-file-types-with-an-iphone-application\" target=\"_blank\">seguente indirizzo<\/a>.<\/p>\n<p>Per avere invece maggiori informazioni, invece, sulla definizione dei CFBundleDocumentTypes questi sono alcuni link alla documentazione Apple:<\/p>\n<p><a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/General\/Conceptual\/iPadProgrammingGuide\/CoreApplication\/CoreApplication.html#\/\/apple_ref\/doc\/uid\/TP40009370-CH6-SW11\" target=\"_blank\">http:\/\/developer.apple.com\/iphone\/library\/documentation\/General\/Conceptual\/iPadProgrammingGuide\/CoreApplication\/CoreApplication.html#\/\/apple_ref\/doc\/uid\/TP40009370-CH6-SW11<\/a><\/p>\n<p><a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/General\/Reference\/InfoPlistKeyReference\/Articles\/CoreFoundationKeys.html#\/\/apple_ref\/doc\/uid\/TP40009249-101685-TPXREF107\" target=\"_blank\">http:\/\/developer.apple.com\/iphone\/library\/documentation\/General\/Reference\/InfoPlistKeyReference\/Articles\/CoreFoundationKeys.html#\/\/apple_ref\/doc\/uid\/TP40009249-101685-TPXREF107<\/a><\/p>\n<p><a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/uikit\/reference\/UIDocumentInteractionController_class\/Reference\/Reference.html\" target=\"_blank\">http:\/\/developer.apple.com\/iphone\/library\/documentation\/uikit\/reference\/UIDocumentInteractionController_class\/Reference\/Reference.html<\/a><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/T065-PDFFromSafari.zip\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"Icona Download\" title=\"download_icon\" width=\"33\" height=\"40\" class=\"alignnone size-full wp-image-3385\" \/><\/a> Se avete problemi con il tutorial, questo \u00e8 il <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/07\/T065-PDFFromSafari.zip\">nostro file di progetto<\/a>.<br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ciao a tutti, sono Francesco Noya, un nuovo autore di questa community di programmazione iPhone, e come&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[347,344,345,343,346,348,319],"class_list":["post-4076","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-cfbundletypename","tag-estensioni-file-iphone","tag-file-iphone","tag-francesco-noya","tag-info-plist","tag-nsdata","tag-nsfilemanager"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4076","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=4076"}],"version-history":[{"count":8,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4076\/revisions"}],"predecessor-version":[{"id":4201,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4076\/revisions\/4201"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=4076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=4076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=4076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}