{"id":2942,"date":"2010-04-07T09:50:29","date_gmt":"2010-04-07T07:50:29","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=2942"},"modified":"2011-08-16T10:36:07","modified_gmt":"2011-08-16T08:36:07","slug":"t030-aggiungiamo-facebook-alle-nostre-applicazioni","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t030-aggiungiamo-facebook-alle-nostre-applicazioni\/","title":{"rendered":"T#030 -Integrare facebook nelle applicazioni iPhone e iPad [AGGIORNATO]"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/FacebookConnect_logoFB.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/FacebookConnect_logoFB.jpg\" alt=\"Logo facebook\" title=\"FacebookConnect_logoFB\" width=\"150\" height=\"60\" class=\"alignleft size-full wp-image-2943\" \/><\/a> La condivisione sui Social Network di informazioni, pensieri, fotografie e non solo \u00e8 divenuto ormai un fattore di primaria importanza, che certo non possiamo trascurare neanche durante lo sviluppo di applicazioni iPhone e iPad. Facebook, Twitter, YouTube e recentemente Google + sono divenute, infatti, parole di uso comune, conosciute in tutto il mondo. Oggi, con una revisione completa di questo nostro tutorial di programmazione iOS, vedremo come integrare facebook nell nostre applicazioni iPhone e iPad, sfruttando le Graph API di facebook, molto pi\u00f9 versatili e facili da utilizzare una volta capite le dinamiche rispetto al vecchio metodo di integrazione ormai superato, in modo tale da permettere agli utenti delle nostre app di condividere alcune informazioni direttamente dall&#8217;applicazione stessa alla propria bacheca personale.<!--more--><\/p>\n<h4>Creare una nuova applicazione su Facebook<\/h4>\n<p>La prima cosa da fare \u00e8 quella di creare la una nuova applicazione su Facebook che verr\u00e0 associata alla nostra applicazione in via di sviluppo. Per far ci\u00f2 accediamo semplicemente al <a href=\"https:\/\/developers.facebook.com\/apps\/\" target=\"_blank\">pannello applicazioni<\/a> dell&#8217;area developer di Apple (\u00e8 richiesta la registrazione gratuita come developer su facebook):<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455773-alle-19.42.16.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455773-alle-19.42.16-300x192.png\" alt=\"\" title=\"Schermata 07-2455773 alle 19.42.16\" width=\"300\" height=\"192\" class=\"aligncenter size-medium wp-image-7354\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455773-alle-19.42.16-300x192.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455773-alle-19.42.16-1024x656.png 1024w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455773-alle-19.42.16-150x96.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455773-alle-19.42.16.png 1032w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Clicchiamo quindi su &#8220;+ Crea applicazione&#8221; e inseriamo il nome della nostra applicazione. Selezioniamo ora la lingua e accettiamo i termini di utilizzo. Inseriamo il codice captcha e le informazioni di base, infine salviamo.<\/p>\n<p>L&#8217;applicazione su Facebook \u00e8 pronta, l&#8217;unica cosa che ci servir\u00e0 \u00e8 la &#8220;chiave API&#8221; generata, che troviamo nel pannello delle nostre app.<\/p>\n<h4>Scaricare l&#8217;SDK facebook &#8211; Documentazione e progetto di esempio<\/h4>\n<p>Bene, abbiamo appena creato l&#8217;applicazione sul nostro account facebook, ora dobbiamo procedere con il download dell&#8217;SDK di facebook.<\/p>\n<p>Per fare questo andiamo sulla sezione <a href=\"https:\/\/developers.facebook.com\/docs\/guides\/mobile\/#ios\" target=\"_blank\">Mobile Apps<\/a> del sito developer di facebook e cerchiamo la riga (poco dopo l&#8217;inizio del documento) con scritto &#8220;Clone the GitHub repository: git clone git:\/\/github.com\/facebook\/facebook-ios-sdk.git&#8221;, quindi clicchiamo sul link &#8220;GitHub repository&#8221; al suo interno. Si aprir\u00e0 <a href=\"https:\/\/github.com\/facebook\/facebook-ios-sdk\" target=\"_blank\">la pagina di GitHub<\/a> con il progetto. <\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.01.12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.01.12-300x147.png\" alt=\"\" title=\"Schermata 07-2455774 alle 10.01.12\" width=\"300\" height=\"147\" class=\"aligncenter size-medium wp-image-7356\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.01.12-300x147.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.01.12-150x73.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.01.12.png 939w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Clicchiamo su &#8220;downloads&#8221; e scarichiamo il progetto in formato .zip. Scompattiamolo ed entriamo nella cartella.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.10.01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.10.01-242x300.png\" alt=\"\" title=\"Schermata 07-2455774 alle 10.10.01\" width=\"242\" height=\"300\" class=\"aligncenter size-medium wp-image-7357\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.10.01-242x300.png 242w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.10.01-121x150.png 121w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.10.01.png 325w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Al suo interno troveremo:<\/p>\n<ul>\n<li>una cartella &#8220;sample&#8221;, contenente un esempio di applicazione;<\/li>\n<li>la cartella &#8220;src&#8221;, ovvero l&#8217;SDK facebook vero e proprio;<\/li>\n<li>una cartella &#8220;test&#8221; contenente i test case dell&#8217;SDK (che al momento a noi non interessa)<\/li>\n<\/ul>\n<p>Per quanto riguarda la documentazione sul link precedente troverete anche una piccola guida su come utilizzare ed implementare le API. Questa guida ufficiale, a mio parere, pecca un po&#8217; nell&#8217;importazione del progetto, parte che andremo a vedere insieme fra pochissimo.<\/p>\n<h4>Creare un nuovo progetto ed importare l&#8217;SDK facebook al suo interno<\/h4>\n<p>Finalmente iniziamo a mettere le mani sul nostro progetto. Per prima cosa creiamo una cartella sulla scrivania e diamole un nome, la nostra l&#8217;abbiamo chiamata &#8220;devAPPFacebook&#8221;. Questa cartella sar\u00e0 il contenitore del nostro progetto da qui in avanti.<\/p>\n<p>Apriamo Xcode, creiamo un nuovo progetto di tipo view-based e andiamo a salvarlo dentro la cartella appena creata.<\/p>\n<p>Ritorniamo alla cartella &#8220;Facebook-ios-sdk&#8221; scaricata precedentemente da GitHub, apriamola e trasciniamo tutta la cartella &#8220;src&#8221; dentro la cartella principale del nostro progetto (devAPPFacebook). Dovremmo aver ottenuto, a questo punto, una cartella con un contenuto simile a quello mostrato in figura:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.45.28.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.45.28-246x300.png\" alt=\"\" title=\"Schermata 07-2455774 alle 10.45.28\" width=\"246\" height=\"300\" class=\"aligncenter size-medium wp-image-7358\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.45.28-246x300.png 246w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.45.28-123x150.png 123w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.45.28.png 298w\" sizes=\"auto, (max-width: 246px) 100vw, 246px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Perfetto, torniamo ad Xcode e tenendo aperta la finestra del finder con la cartella &#8220;src&#8221; trasciniamo all&#8217;interno del nostro progetto tutti i file tranne &#8220;facebook-ios-sdk.xcodeproj&#8221; e &#8220;facebook-ios_sdk_Prefix.pch&#8221;. Quando ci verr\u00e0 chiesto se vogliamo copiare i file diciamo di no (niente spunta su &#8220;copy items into destination folder..&#8221;), clicchiamo quindi su finish e dovremmo ottenere una gerarchia simile alla seguente:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.54.49.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.54.49-174x300.png\" alt=\"\" title=\"Schermata 07-2455774 alle 10.54.49\" width=\"174\" height=\"300\" class=\"aligncenter size-medium wp-image-7359\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.54.49-174x300.png 174w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.54.49-87x150.png 87w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.54.49.png 252w\" sizes=\"auto, (max-width: 174px) 100vw, 174px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Portiamoci ora su &#8220;Build setting&#8221; del nostro progetto e cerchiamo la sezione &#8220;Search Path&#8221;. Facciamo doppio click su &#8220;Header Search Path&#8221;, quindi clicchiamo sul &#8220;+&#8221; e aggiungiamo questa stringa:<\/p>\n<p><strong>..\/src<\/strong><\/p>\n<p>Spuntiamo la voce &#8220;recursive&#8221; e proseguiamo.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.59.00.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.59.00-300x67.png\" alt=\"\" title=\"Schermata 07-2455774 alle 10.59.00\" width=\"300\" height=\"67\" class=\"aligncenter size-medium wp-image-7360\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.59.00-300x67.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.59.00-150x33.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-10.59.00.png 565w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Questo far\u00e0 si che il nostro progetto sappia che dovr\u00e0 cercare eventuali file di importazione della cartella &#8220;src&#8221; ricorsivamente.<\/p>\n<p>Esistono molti modi di importare librerie e classi nei nostri progetti, noi ne abbiamo visto uno qui sopra, che \u00e8 quello consigliato da facebook. Potreste provare a trascinare direttamente i file all&#8217;interno del progetto, senza creare la cartella &#8220;src&#8221; prima e modificare successivamente l&#8217;header &#8220;path file&#8221;. Molto probabilmente tutto funzioner\u00e0 comunque. Insomma, ogni libreria ha il suo metodo di importazione quindi non posso affermare che questo sia il metodo migliore o l&#8217;unico, semplicemente ho preferito seguire le linee guida proposte da facebook.<\/p>\n<h4>Pubblicare un post sulla bacheca Facebook direttamente dalla nostra applicazione iOS<\/h4>\n<p>Eccoci finalmente alla parte pi\u00f9 importante (e interessante) del nostro tutorial, ovvero vedremo ora come si usano queste Graph API, a parer mio, molto semplici da usare. Grazie infatti a poche righe di codice saremo in grado di creare quanto necessario, ovviamente una volta comprese le dinamiche di funzionamento e verificato il significato di tutti i parametri tramite la documentazione ufficiale facebook.<\/p>\n<p>Importiamo &#8220;FBconnect.h&#8221; e settiamo i delegati:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n#import \"FBConnect.h\"\r\n@interface devAPPt100ViewController : UIViewController<FBRequestDelegate, FBDialogDelegate, FBSessionDelegate>\r\n{\r\n    Facebook* _facebook;\r\n    NSArray* _permissions;\r\n}\r\n@property(readonly) Facebook *facebook;\r\n\r\n-(void)loginToFacebook:(id)sender;\r\n-(void)publishStream:(id)sender;\r\n-(void)uploadFoto:(id)sender;\r\n@end\r\n<\/pre>\n<p>Vediamo cosa abbiamo appena fatto. Niente di complicato, abbiamo importato &#8220;FBConnect&#8221;, aggiunto i relativi delegati, dichiarato un oggetto di tipo Facebook e un array che conterr\u00e0 i permessi della nostra applicazione e abbiamo infine dichiarato tre metodi che useremo rispettivamente per il login, per pubblicare un post e fare eventuale upload di una foto.<\/p>\n<p>Passiamo ora alla parte pi\u00f9 importante: l&#8217;implementazione dei metodi. Iniziamo creando una stringa statica che conterr\u00e0 la nostra chiave API (quella ottenuta in fase di creazione della nuova app su facebook descritta ad inizio tuturial) e sintetizziamo l&#8217;oggetto facebook:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"devAPPt100ViewController.h\"\r\n\r\nstatic NSString* kAppId = @\"251336734895447\";\r\n\r\n@implementation devAPPt100ViewController\r\n@synthesize facebook = _facebook;\r\n<\/pre>\n<p>Passiamo al metodo &#8220;viewDidLoad&#8221; e modifichiamolo come segue:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    self.view.backgroundColor = [UIColor whiteColor];\r\n    \r\n    _permissions =  [[NSArray arrayWithObjects:\r\n                      @\"read_stream\", @\"publish_stream\", @\"offline_access\",nil] retain];\r\n    \r\n    UIButton * btnLogin = [UIButton buttonWithType:UIButtonTypeRoundedRect];\r\n    btnLogin.frame = CGRectMake(100, 100, 70, 30);\r\n    [btnLogin setTitle:@\"Login\" forState:UIControlStateNormal];\r\n    [btnLogin addTarget:self action:@selector(loginToFacebook:) forControlEvents:UIControlEventTouchDown];\r\n    [self.view addSubview:btnLogin];\r\n    \r\n}\r\n<\/pre>\n<p>Qui abbiamo inizializzato un array con gli stream che la nostra app andr\u00e0 ad utilizzare.<br \/>\nApriamo una piccola parentesi su questi &#8220;stream&#8221;. In pratica (e vi sar\u00e0 capitato sicuramente usando applicazioni terze che si interfacciano a facebook) quando volete postare da un&#8217;app specifica, la prima volta, vi viene chiesto di autorizzare l&#8217;applicazione stessa ad accedere ad alcuni contenuti del vostro profilo fb. Questi sono proprio definiti dagli stream. Il primo vi permetter\u00e0 di avere le informazioni dell&#8217;utente ed i post pubblicati, il secondo di poter pubblicare post, commentare i post e mettere il famoso &#8220;mi piace&#8221; sui commenti, mentre il terzo vi permetter\u00e0 l&#8217;accesso al profilo Facebook anche se l&#8217;utente non \u00e8 connesso (per pubblicare link, ecc). Per ulteriori informazioni vi rimando a questo <a href=\"https:\/\/developers.facebook.com\/docs\/reference\/api\/permissions\/\" target=\"_blank\">link<\/a> che illustra e spiega il significato di tutti i tipi di stream esistenti.<\/p>\n<p>Fatto questo occorrer\u00e0 aggiungere un pulsante per fare il login dall&#8217;applicazione.<\/p>\n<p>Vediamo il metodo di Login:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)loginToFacebook:(id)sender\r\n{\r\n    _facebook = [[Facebook alloc] initWithAppId:kAppId];\r\n    [_facebook authorize:_permissions delegate:self];\r\n}\r\n<\/pre>\n<p>Queste due righe sono semplicissime per noi dev e hanno il compito di realizzare il login della nostra app.<br \/>\nAllochiamo l&#8217;oggetto Facebook con la chiave API che avevamo copiato precedentemente e chiediamo all&#8217;utente di autorizzare la nostra applicazione a pubblicare post e di accedere al nostro profilo.<\/p>\n<p>Se provate ad eseguire l&#8217;applicazione a questo punto vedrete che, cliccando sul pulsante, si aprir\u00e0 una view in cui vi viene chiesto di inserire &#8220;nome utente&#8221; e &#8220;password&#8221; per accedere al vostro profilo facebook e successivamente di accettare le condizioni dell&#8217;app e autorizzarla.<\/p>\n<p>Nella seconda riga, passiamo come parametro l&#8217;array con gli stream e ovviamente il nostro delegato, cos\u00ec facendo avremo tre metodi che rispondo al login:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)fbDidLogin\r\n-(void)fbDidLogout\r\n-(void)fbDidNotLogin:(BOOL)cancelled\r\n<\/pre>\n<p>Come da titolo ci notificano quando il login viene effettuato, quando l&#8217;utente si slogga oppure quando l&#8217;utente cancella la pagina di login e quindi decide di non accedere.<\/p>\n<p>Passiamo all&#8217;implementazione del primo metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)fbDidLogin\r\n{\r\n    NSLog(@\"utente loggato\");\r\n    \r\n    UIButton * btnPost = [UIButton buttonWithType:UIButtonTypeRoundedRect];\r\n    btnPost.frame = CGRectMake(100, 150, 70, 30);\r\n    [btnPost setTitle:@\"Post\" forState:UIControlStateNormal];\r\n    [btnPost addTarget:self action:@selector(publishStream:) forControlEvents:UIControlEventTouchDown];\r\n    [self.view addSubview:btnPost];\r\n    \r\n    UIButton * btnUpload = [UIButton buttonWithType:UIButtonTypeRoundedRect];\r\n    btnUpload.frame = CGRectMake(100, 200, 70, 30);\r\n    [btnUpload setTitle:@\"Upload\" forState:UIControlStateNormal];\r\n    [btnUpload addTarget:self action:@selector(uploadFoto:) forControlEvents:UIControlEventTouchDown];\r\n    [self.view addSubview:btnUpload];\r\n}\r\n<\/pre>\n<p>Semplicemente abbiamo aggiunto due bottoni, uno per pubblicare un Post, l&#8217;altro per fare l&#8217;upload di una foto<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)publishStream:(id)sender\r\n{\r\n    SBJSON *jsonWriter = [[SBJSON new] autorelease];\r\n\t\r\n\t\/\/link del post\r\n\tNSArray* actionLinks = [NSArray arrayWithObjects:[NSDictionary dictionaryWithObjectsAndKeys: \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   @\"devAPP.it\",@\"text\", \/\/nome link\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   @\"http:\/\/www.devapp.it\/\",@\"href\", \/\/collegamento link\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   nil], nil];\r\n\t\r\n\t\r\n\tNSString *actionLinksStr = [jsonWriter stringWithObject:actionLinks];\r\n\t\r\n    \/\/immmagine post\r\n\tNSDictionary* media = [NSDictionary dictionaryWithObjectsAndKeys:\r\n\t\t\t\t\t\t   @\"image\", @\"type\", \/\/tipo di media allegato (immagine)\r\n\t\t\t\t\t\t   @\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/logo_devAPP.png\", @\"src\", \/\/link dell'immagine\r\n\t\t\t\t\t\t   @\"http:\/\/www.devapp.it\/\", @\"href\", nil]; \/\/link a cui porta l'immagine se cliccata\r\n\tNSArray * arraymedia = [NSArray arrayWithObject:media];\r\n\t\r\n\t\r\n\t\r\n\t\/\/collegamenti dell'immagine del post\r\n\tNSDictionary* attachment = [NSDictionary dictionaryWithObjectsAndKeys:\r\n\t\t\t\t\t\t\t\t@\"devAPP\", @\"name\", \/\/nome che compare vicino all'immagine\r\n\t\t\t\t\t\t\t\tarraymedia, @\"media\",\r\n\t\t\t\t\t\t\t\t@\"Tramite devAPP.it per iphone\", @\"caption\", \/\/caption (parte in piccolo sotto l'iconcina della nostra app\r\n\t\t\t\t\t\t\t\t@\"http:\/\/www.devapp.it\/\", @\"href\", nil];\/\/link a cui posrta caption\r\n\t\r\n\tNSString *attachmentStr = [jsonWriter stringWithObject:attachment];\r\n\t\r\n\t\r\n    \/\/parametri post\r\n\tNSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:\r\n\t\t\t\t\t\t\t\t   kAppId, @\"api_key\", \/\/chiave api\r\n\t\t\t\t\t\t\t\t   @\"Share on Facebook\",  @\"user_message_prompt\", \/\/default. Si pu\u00f2 modificare ma non ha rilievo per il post\r\n\t\t\t\t\t\t\t\t   @\"Post di prova per devAPP\", @\"message\", \/\/messaggio di post (\u00e8 l'unica cosa che l'utente pu\u00f2 modificare prima del post)\r\n\t\t\t\t\t\t\t\t   actionLinksStr, @\"action_links\",\r\n\t\t\t\t\t\t\t\t   attachmentStr, @\"attachment\",\r\n\t\t\t\t\t\t\t\t   nil];\r\n\t\r\n\t[_facebook dialog: @\"stream.publish\"\r\n         andParams: params\r\n       andDelegate:self]; \r\n}\r\n<\/pre>\n<p>In questo metodo creiamo un oggetto JSON che ci servir\u00e0 per contenere tutte le info del nostro Post.<br \/>\nHo commentato ogni riga per farvi capire meglio come funzionano i parametri da utilizzare, naturalmente fate le opportune  prove prima di rilasciare un applicazione che utilizzi Facebook.<\/p>\n<ul>\n<li>Action link: \u00e8 il link che compare vicino a <em>Commenta<\/em><\/li>\n<li>media: immagine che alleghiamo al nostro post (pu\u00f2 essere anche un video). Comprende il tipo di media aggiunto, il link del media e il link a cui porta il media se cliccato<\/li>\n<li>attachment: \u00e8 il contenitore della nostra immagine con il titolo, il sottotitolo e il link a cui porta il sottotitolo<\/li>\n<li>params: il contenitore di tutti i parametri definiti finora. Comprende la nostra chiave API, il messaggio visualizzato all&#8217;utente, i vari link, il media aggiunto e infine il messaggio vero e proprio <\/li>\n<\/ul>\n<p>Nell&#8217;ultima riga diciamo all&#8217;oggetto facebook di utilizzare lo stream di pubblicazione con i parametri passati e sar\u00e0 proprio quest&#8217;oggetto che si occuper\u00e0 della pubblicazione del post.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-20.40.09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-20.40.09-300x77.png\" alt=\"\" title=\"Schermata 07-2455774 alle 20.40.09\" width=\"300\" height=\"77\" class=\"aligncenter size-medium wp-image-7365\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-20.40.09-300x77.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-20.40.09-150x38.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Schermata-07-2455774-alle-20.40.09.png 495w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Come effettuare l&#8217;upload di foto nel profilo facebook<\/h4>\n<p>Vediamo ora come effettuare l&#8217;upload di foto su facebook direttamente dalle nostre applicazioni iPhone e iPad. Andiamo a implementare il metodo &#8220;uploadFoto&#8221; dichiarato precedentemente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)uploadFoto:(id)sender\r\n{\r\n    NSString *path = @\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/logo_devAPP.png\";\r\n    NSURL *url = [NSURL URLWithString:path];\r\n    NSData *data = [NSData dataWithContentsOfURL:url];\r\n    UIImage *img  = [[UIImage alloc] initWithData:data];\r\n    \r\n    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:\r\n                                   img, @\"picture\",\r\n                                   nil];\r\n    \r\n    [_facebook requestWithGraphPath:@\"me\/photos\"\r\n                          andParams:params\r\n                      andHttpMethod:@\"POST\"\r\n                        andDelegate:self];\r\n    \r\n    [img release];\r\n}\r\n<\/pre>\n<p>Questa porzione di codice \u00e8 molto pi\u00f9 semplice, in pratica inseriamo il link di un&#8217;immagine e diciamo che quei parametri devono essere inseriti nella sezione foto dell&#8217;account loggato con il metodo POST. Una precisazione: questo metodo non contiene alcuna conferma da parte dell&#8217;utente.<\/p>\n<p>Anche qui abbiamo delle notifiche per l&#8217;avvenuto successo dell&#8217;upload:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)request:(FBRequest *)request didLoad:(id)result\r\n- (void)request:(FBRequest *)request didFailWithError:(NSError *)error\r\n- (void)dialogDidComplete:(FBDialog *)dialog\r\n<\/pre>\n<p>Che potete implementare per segnalare all&#8217;utente il successo o meno dell&#8217;upload di una foto.<\/p>\n<h4>Considerazioni finali<\/h4>\n<p>Come avete visto nell&#8217;esempio proposto in questo tutorial, non \u00e8 poi cos\u00ec complesso postare un commento o fare upload di contenuti sul profilo utente facebook di chi utilizza la nostra applicazione. Potremo ovviamente andare oltre e ottenere particolari informazioni sull&#8217;utente e i suoi amici, ma per questo vi consiglio di guardare gli esempi forniti da facebook e la documentazione ufficiale.<\/p>\n<p>Ne approfitto, prima di lasciarvi, per un&#8217;ulteriore piccola precisazione: quando l&#8217;oggetto facebook fa il login, controlla che sia installata l&#8217;app facebook per eventualmente prendere il suo token o, in alternativa, avvia safari per far eseguire il login all&#8217;utente. Sinceramente non ho capito molto questa mossa da parte delle API e la prima volta che ho avviato l&#8217;applicazione con il simulatore (non avendo installata l&#8217;app facebook) ha avviato safari crashando dopo aver fatto il login. Se vi dovesse succedere qualcosa di analogo andate sulla classe &#8220;Facebook.m&#8221; e nel metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth safariAuth:(BOOL)trySafariAuth\r\n<\/pre>\n<p>commentate l&#8217;if come mostrato nel seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth\r\n                    safariAuth:(BOOL)trySafariAuth {\r\n  NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:\r\n                                 _appId, @\"client_id\",\r\n                                 @\"user_agent\", @\"type\",\r\n                                 kRedirectURL, @\"redirect_uri\",\r\n                                 @\"touch\", @\"display\",\r\n                                 kSDKVersion, @\"sdk\",\r\n                                 nil];\r\n\r\n  NSString *loginDialogURL = [kDialogBaseURL stringByAppendingString:kLogin];\r\n\r\n  if (_permissions != nil) {\r\n    NSString* scope = [_permissions componentsJoinedByString:@\",\"];\r\n    [params setValue:scope forKey:@\"scope\"];\r\n  }\r\n\r\n  if (_localAppId) {\r\n    [params setValue:_localAppId forKey:@\"local_client_id\"];\r\n  }\r\n  \r\n  \/\/ If the device is running a version of iOS that supports multitasking,\r\n  \/\/ try to obtain the access token from the Facebook app installed\r\n  \/\/ on the device.\r\n  \/\/ If the Facebook app isn't installed or it doesn't support\r\n  \/\/ the fbauth:\/\/ URL scheme, fall back on Safari for obtaining the access token.\r\n  \/\/ This minimizes the chance that the user will have to enter his or\r\n  \/\/ her credentials in order to authorize the application.\r\n  BOOL didOpenOtherApp = NO;\r\n  \/*UIDevice *device = [UIDevice currentDevice];\r\n  if ([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]) {\r\n    if (tryFBAppAuth) {\r\n      NSString *scheme = kFBAppAuthURLScheme;\r\n      if (_localAppId) {\r\n        scheme = [scheme stringByAppendingString:@\"2\"];\r\n      }\r\n      NSString *urlPrefix = [NSString stringWithFormat:@\"%@:\/\/%@\", scheme, kFBAppAuthURLPath];\r\n      NSString *fbAppUrl = [FBRequest serializeURL:urlPrefix params:params];\r\n      didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]];\r\n    }\r\n\r\n    if (trySafariAuth && !didOpenOtherApp) {\r\n      NSString *nextUrl = [self getOwnBaseUrl];\r\n      [params setValue:nextUrl forKey:@\"redirect_uri\"];\r\n\r\n      NSString *fbAppUrl = [FBRequest serializeURL:loginDialogURL params:params];\r\n      didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]];\r\n    }\r\n  }*\/\r\n\r\n  \/\/ If single sign-on failed, open an inline login dialog. This will require the user to\r\n  \/\/ enter his or her credentials.\r\n  if (!didOpenOtherApp) {\r\n    [_loginDialog release];\r\n    _loginDialog = [[FBLoginDialog alloc] initWithURL:loginDialogURL\r\n                                          loginParams:params\r\n                                             delegate:self];\r\n    [_loginDialog show];\r\n  }\r\n}\r\n<\/pre>\n<p>Cos\u00ec facendo verr\u00e0 sempre chiamato il modulo di login con la webView.<\/p>\n<p>Per qualsiasi problema vi invito a postare direttamente sul <a href=\"http:\/\/forum.devapp.it\" target=\"_blank\">nostro forum<\/a>, sar\u00e0 pi\u00f9 semplice per noi aiutarvi \ud83d\ude09<\/p>\n<p>Buon lavoro e alla prossima!<br \/>\nAndrea Cappellotto<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/integrare-facebook-applicazioni-iphone-ipad-devAPP.zip\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il progetto presentato, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/integrare-facebook-applicazioni-iphone-ipad-devAPP.zip\" target=\"_blank\">questo \u00e8 il link per scaricare il nostro esempio completo.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La condivisione sui Social Network di informazioni, pensieri, fotografie e non solo \u00e8 divenuto ormai un fattore&#8230;<\/p>\n","protected":false},"author":136,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[875,874,878,873,876,877],"class_list":["post-2942","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-facebook-ipad-sdk","tag-facebook-iphone-sdk","tag-facebook-xcode","tag-integrare-facebook-applicazioni-ios","tag-post-facebook-da-applicazione-iphone","tag-postare-immagine-facebook-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2942","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\/136"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2942"}],"version-history":[{"count":11,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2942\/revisions"}],"predecessor-version":[{"id":7462,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2942\/revisions\/7462"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}