{"id":7604,"date":"2011-09-13T12:02:07","date_gmt":"2011-09-13T10:02:07","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=7604"},"modified":"2011-09-13T12:02:07","modified_gmt":"2011-09-13T10:02:07","slug":"t101-integrare-airprint-per-stampare-dalle-applicazioni-iphone-e-ipad","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t101-integrare-airprint-per-stampare-dalle-applicazioni-iphone-e-ipad\/","title":{"rendered":"T#101 &#8211; Integrare AirPrint per stampare dalle applicazioni iPhone e iPad"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/09\/icona-airprint-iphone-ipad-devapp.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/09\/icona-airprint-iphone-ipad-devapp.jpg\" alt=\"icona-airprint-iphone-ipad-devapp\" title=\"icona-airprint-iphone-ipad-devapp\" width=\"72\" height=\"89\" class=\"alignleft size-full wp-image-7608\" \/><\/a> Cari lettori, quello che vi presento oggi \u00e8 un breve ed efficace tutorial per l&#8217;utilizzo della funzione <strong>AirPrint<\/strong> all&#8217;interno delle applicazioni iOS. CocoaTouch ci mette a disposizione un controllore per l&#8217;interazione con le stampanti supportate da AirPrint, chiamato <em>UIPrintInteractionController<\/em>. Questo controllore, che invocheremo sempre sulla sua istanza shared <em>sharedPrintController<\/em>, ci permette di interagire con un&#8217;interfaccia utente per la gestione e la stampa dei documenti in formato PDF, immagini ed altri contenuti disponibili su iOS. <strong>sharedPrintController<\/strong>, rappresenta un job di stampa. Esso include il contenuto da stampare e le informazioni relative alla stampa stessa (nome job, tip di stampa, pagine da stampare, etc.).<!--more--><\/p>\n<h4>Stampare un PDF dalla nostra applicazione iPhone o iPad<\/h4>\n<p>L&#8217;utilizzo del controllore \u00e8 quando di pi\u00f9 semplice possa esserci. Proviamo a vedere come istanziare ed istruire il nostro codice per stampare un PDF.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)printdoc:(NSData *)myData {\r\n\tUIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];\r\n\t\r\n\tif(pic && [UIPrintInteractionController canPrintData: myData] ) {\r\n\t\tpic.delegate = self;\r\n\t\tUIPrintInfo *printInfo = [UIPrintInfo printInfo];\r\n\t\tprintInfo.outputType = UIPrintInfoOutputGeneral;\r\n\t\tprintInfo.jobName = @\"AllertaSoglie\";\r\n\t\tprintInfo.duplex = UIPrintInfoDuplexLongEdge;\r\n\t\tpic.printInfo = printInfo;\r\n\t\tpic.showsPageRange = YES;\r\n\t\tpic.printingItem = myData;\r\n\t\t\r\n\t\tvoid (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {\r\n\t\t\tif (!completed && error) {\r\n\t\t\t\tUIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@\"Attenzione\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  message:@\"Si \u00e8 verificato un errore durante la stampa.\\nControlla le impostazioni di AirPrint e riprova.\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t delegate:nil \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcancelButtonTitle:@\"OK\" \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\totherButtonTitles:nil];\r\n\t\t\t\t[anAlert show];\r\n\t\t\t\t[anAlert release];\r\n\t\t\t} \r\n\t\t};\r\n\t\t[pic presentAnimated:YES completionHandler:completionHandler];\r\n\t}\t\r\n}\r\n<\/pre>\n<p>Come funziona? La prima cosa da fare \u00e8 ottenere un riferimento all&#8217;istanza shared di UIPrintInteractionController. <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n   UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];\r\n<\/pre>\n<p>Se il risultato \u00e8 un valore non NULL, allora possiamo procedere con le successive operazioni di configurazione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n   pic.delegate = self;\r\n   UIPrintInfo *printInfo = [UIPrintInfo printInfo];\r\n   printInfo.outputType = UIPrintInfoOutputGeneral;\r\n   printInfo.jobName = @\"AllertaSoglie\";\r\n<\/pre>\n<p>Assegnamo come delegato della nostra istanza shared la classe stessa, che implementa il metodo sopra (tipicamente un UIViewController) avendo cura di aggiungere nella sua dichiarazione di classe, la conformit\u00e0 al protocollo UIPrintInteractionControllerDelegate.<\/p>\n<p>Successivamente invochiamo sull&#8217;istanza shared, il metodo printInfo che ci ritorna un oggetto che incapsula al suo interno informazioni circa il job che stiamo per eseguire.<\/p>\n<p>Una volta ottenuta questa informazione, possiamo customizzare il job con alcune informazioni personali del job in essere, quali il tipo di output (nel nostro caso UIPrintInfoOutputGeneral, specifica che ci troviamo di fronte ad un documento misto immagini, testo, etc.), il nome del job e la modalit\u00e0 di stampa duplex.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n   pic.printInfo = printInfo;\r\n   pic.showsPageRange = YES;\r\n   pic.printingItem = myData;\r\n<\/pre>\n<p>Riassegniamo l&#8217;oggetto cos\u00ec modificato all&#8217;istanza shared ed aggiungiamo due ulteriori informazioni. showsPageRange ci permette di mostrare il range di pagine da stampare e pic.printingItem assegna l&#8217;oggetto NSData (il nostro PDF) da stampare.<\/p>\n<p>A questo punto, siamo quasi pronti per invocare la stampa, o meglio mostrare il controllore modale che lancer\u00e0 la stampa. Prima, per\u00f2, abbiamo bisogno di creare un blocco che gestisca le eccezioni di stampa (ad esempio, se qualcosa v\u00e0 male, la stampante non \u00e8 in linea, etc.).<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n   void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {\r\n      if (!completed && error) {\r\n         UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@\"Attenzione\" \r\n         message:@\"Si \u00e8 verificato un errore durante la stampa.\\nControlla le impostazioni di AirPrint e riprova.\" \r\n\t            delegate:nil \r\n\t            cancelButtonTitle:@\"OK\" \r\n\t            otherButtonTitles:nil];\r\n         [anAlert show];\r\n         [anAlert release];\r\n      } \r\n};\r\n<\/pre>\n<p>Il blocco sopra, serve proprio a questo. In pratica, quello che facciamo \u00e8 creare una funzione (o blocco) di nome <em>completionHandler<\/em> che verr\u00e0 eseguita SOLO in caso di non completamento o altri errori. Se vogliamo customizzare il messaggio, possiamo utilizzare i parametri passati come argomento alla funzione (pic, completed ed error).<\/p>\n<p>In queto caso, giusto per rendere le cose pi\u00f9 semplici, mostreremo un generico messaggio di errore, che ci notifica che qualcosa \u00e8 andato storto.<\/p>\n<p>Adesso, possiamo mostrare il nostro controllore modale, con l&#8217;istruzione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n   [pic presentAnimated:YES completionHandler:completionHandler];\r\n<\/pre>\n<p>Il controllo della nostra applicazione, passer\u00e0 alla finestra modale che ci mostra cosa stiamo per stampare, come da figura. Se siamo in prossimit\u00e0 di una stampante che supporta AirPrint, avremo la possibilit\u00e0 di stampare il documento.<\/p>\n<h4>Abilitare qualsiasi stampante con AirPrint<\/h4>\n<p>Un&#8217;ultima cosa. Per testare il sistema \u00e8 possibile utilizzare un simpatico hack che trovate in rete (<a href=\"http:\/\/netputing.com\/airprintactivator\/airprint-activator-v2-0\/\" target=\"_blank\">http:\/\/netputing.com\/airprintactivator\/airprint-activator-v2-0\/<\/a>). In questo modo potrete rendere compatibile una stampante generica con il protocollo AirPrint, attraverso l&#8217;uso di un computer Mac\/Windows.<\/p>\n<h4>Supportaci<\/h4>\n<p>Questa funzione, insieme a tante altre caratteristiche, \u00e8 stata aggiunta alla nuova versione di <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/allertasoglie-tre\/id393552998?mt=8&#038;partnerId=2003\" target=\"_blank\">AllertaSoglie<\/a>. Se vi \u00e8 piaciuto quest&#8217;articolo (ed avete bisogno di AllertaSoglie) vi invito a <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/allertasoglie-tre\/id393552998?mt=8&#038;partnerId=2003\" target=\"_blank\">scaricarlo da AppStore<\/a>. Questo servir\u00e0 a supportarmi e a far si che possa proporvi sempre nuovi ed interessanti articoli.<\/p>\n<p>Grazie per l&#8217;attenzione.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/allertasoglie-tre\/id393552998?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner_allertasoglie-push-tre-iphone-devapp.jpg\" alt=\"banner-allertasoglie-push-tre-iphone-devapp\" title=\"banner-allertasoglie-push-tre-iphone-devapp\" width=\"500\" height=\"267\" class=\"aligncenter size-full wp-image-5768\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner_allertasoglie-push-tre-iphone-devapp.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner_allertasoglie-push-tre-iphone-devapp-300x160.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner_allertasoglie-push-tre-iphone-devapp-150x80.jpg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cari lettori, quello che vi presento oggi \u00e8 un breve ed efficace tutorial per l&#8217;utilizzo della funzione&#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":[1],"tags":[907,903,908,906,660,909,905,904,242],"class_list":["post-7604","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-aggiungere-airprint-xcode","tag-airprint","tag-airprint-con-tutte-le-stampanti","tag-airprint-xcode","tag-programmare-ios","tag-sharedprintcontroller","tag-stampare-da-applicazioni-ipad","tag-stampare-da-applicazioni-iphone","tag-tutorial-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7604","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=7604"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7604\/revisions"}],"predecessor-version":[{"id":7616,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7604\/revisions\/7616"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=7604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=7604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=7604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}