iPhone SDK connettiti a Twitter con OAuth

Questo tutorial ti mostrerà come integrare rapidamente l'API di Twitter con l'SDK di iPhone utilizzando Twitter-OAuth-iPhone, una libreria di Twitter plug-and-play per iPhone composta da più progetti open source combinati e sintetizzati per facilità di implementazione da parte di Ben Gottlieb.

Modifiche successive alle tecniche e al software

Alcuni aspetti delle applicazioni o delle tecniche utilizzate in questo tutorial sono cambiati da quando è stato originariamente pubblicato. Questo potrebbe rendere un po 'difficile da seguire. Ti consigliamo di guardare questi tutorial più recenti sullo stesso argomento:

  • iOS 5 e Twitter Framework: Primi passi
  • iOS 5 e Twitter Framework: tecniche avanzate

NOTA: Con il rilascio di iOS 5, questo articolo è ormai obsoleto. Andando avanti, dovresti prendere seriamente in considerazione l'utilizzo di Twitter Framework fornito con l'SDK di iOS 5. Considerare solo l'implementazione della soluzione qui illustrata se è necessario supportare gli utenti su versioni precedenti di iOS.

Impostazione del progetto

Questo tutorial utilizzerà una semplice applicazione chiamata "TwitterRush" per dimostrare l'integrazione di Twitter OAuth per l'iPhone. Scaricando l'applicazione TwitterRush, sarai in grado di seguire con precisione tutti i passaggi di questo tutorial. Tuttavia, se hai già un progetto per iPhone che desideri connettere con l'API di Twitter, dovresti comunque essere in grado di seguire il tuo codice con solo piccole modifiche.

Oltre a TwitterRush o al tuo progetto, dovrai anche scaricare il progetto Twitter-OAuth-iPhone di Ben Gottlieb disponibile su GitHub.

Passaggio 1: copia la cartella Twitter + OAuth

Dopo aver scaricato e annullato l'archiviazione della libreria Twitter-OAuth-iPhone, trascina la cartella "Twitter + OAuth" nella cartella "Altre fonti" nell'area del navigatore Xcode 4. Assicurati di selezionare l'opzione "Copia gli elementi nella cartella del gruppo di destinazione (se necessario)" e fai clic su "Fine".

Provare a compilare ed eseguire la tua applicazione ora provocherà MOLTI errori (90 al momento della stesura di questo documento con iOS SDK 4). Non preoccuparti: li sistemeremo facilmente tutti nel passaggio 2.

Passaggio 2: aggiungere la libreria libxml2

Nell'area del navigatore di Xcode 4, selezionare il nome del progetto (in questo caso "TwitterRush"). Quindi, seleziona il target corrente ("TwitterRush" qui di nuovo), quindi seleziona la scheda "Crea Fasi". Espandi l'opzione "Collega binari con le librerie", quindi fai clic sul pulsante "+" per aggiungere un nuovo framework. Digita "libxml2" nella casella di ricerca e seleziona il libxml2.dylib libreria che appare nell'elenco. Fai clic su "Aggiungi" per includere questa libreria nella fase di collegamento del tuo progetto.

Dopo aver completato questi passaggi, lo schermo dovrebbe apparire in questo modo:

Dopo aver aggiunto la libreria al progetto, sarà necessario modificare l'impostazione "Percorsi di ricerca intestazione" nelle impostazioni di costruzione del progetto. Per fare ciò, deselezionare l'obiettivo e selezionare il progetto TwitterRush effettivo. Aprire la scheda "Impostazioni di creazione" e cercare la voce "Percorsi di ricerca intestazione". Fare doppio clic su questa impostazione e quindi fare clic sul pulsante "+" nella parte inferiore sinistra della finestra di dialogo a comparsa per aggiungere un nuovo percorso di ricerca. Fare clic sulla casella di controllo "ricorsiva", fare doppio clic sul campo "Percorso" e immettere il seguente percorso dinamico:

 $ (SDKROOT) / usr / include / libxml2

Dopo aver fatto clic su "Fatto", lo schermo dovrebbe essere simile a questo:

Se esegui l'applicazione dalla barra dei menu Xcode, ora dovresti essere in grado di creare l'applicazione senza errori di compilazione!

Passaggio 3: dichiarare il protocollo NSXMLParserDelegate

Anche se ora sei in grado di compilare ed eseguire l'applicazione senza errori, ci sono una serie di avvisi relativi alle modifiche nell'SDK di iOS4 e nel protocollo NSXMLParserDelegate. Dovrai dichiararlo esplicitamente MGTwitterStatusesParser.h e MGTwitterXMLParser.h conformarsi a questo protocollo per evitare che questi avvertimenti si verifichino.

Per fare ciò, apri il MGTwitterStatusesParser.h file e modificare il @interfaccia dichiarazione dichiarando il NSXMLParserDelegate protocollo in questo modo:

 @interface MGTwitterStatusesParser: MGTwitterXMLParser   

Ora fai lo stesso per MGTwitterXMLParser.h, modificando il @interfaccia dichiarazione da leggere:

 @interface MGTwitterXMLParser: NSObject   

Ora dovresti essere in grado di compilare senza problemi l'applicazione senza generare errori o avvisi! Siamo ora pronti per iniziare a integrare la libreria Twitter-OAuth-iPhone con il nostro codice.

Passaggio 4: importa SA_OAuthTwitterController.h e dichiara SA_OAuthTwitterEngine

Ora dobbiamo iniziare a importare le classi di libreria che useremo per connettersi con l'API di Twitter. Aperto TwitterRushViewController.h e modificare il codice da leggere come segue:

 #importare  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @property (nonatomic, retain) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) del mittente; @fine 

Alla riga 2, importiamo il SA_OAuthTwitterController classe per l'uso all'interno del nostro controller di visualizzazione. Alla riga 4, inoltriamo la dichiarazione SA_OAuthTwitterEngine classe in modo che possiamo dichiarare un'istanza di quella classe in @interfaccia senza effettivamente importare il file di intestazione. Sulla linea 6 dichiariamo il SA_OAuthTwitterControllerDelegate protocollo: questo ci consentirà di rispondere facilmente agli eventi dell'API di Twitter in seguito. Alla fine, sulla linea 10, dichiariamo il _motore oggetto come un'istanza del SA_OAuthTwitterEngine classe.

Ora passa al TwitterRushViewController.m file. Importa il SA_OAuthTwitterEngine classe che abbiamo appena inoltrato dichiarato nell'interfaccia di classe:

 #import "SA_OAuthTwitterEngine.h" 

Perché il SA_OAuthTwitterControllerDelegate contiene solo dichiarazioni di metodo opzionali, a questo punto dovresti essere nuovamente in grado di compilare ed eseguire la tua applicazione senza errori o avvisi.

Passaggio 5: definire le credenziali OAuth dell'API di Twitter

Per ottenere l'accesso OAuth all'API di Twitter, dovrai prima creare una chiave utente e una chiave segreta per Twitter in modo da identificare e autenticare la tua applicazione. Puoi farlo dal sito web di Twitter accedendo al tuo account e navigando verso il modulo di registrazione dell'app. Durante la procedura di registrazione, assicurati di specificare "client" come tipo di applicazione, seleziona la casella "Sì, utilizza Twitter per l'accesso" e seleziona "Leggi e scrivi" come tipo di accesso predefinito per consentire alla tua app iPhone di pubblicare tweet per conto dei tuoi utenti.

Dopo aver registrato l'applicazione e Twitter ha generato le credenziali dell'applicazione, aggiungere quanto segue a TwitterRushViewController.m sopra la classe @implementazione:

 #define kOAuthConsumerKey @ "La tua chiave utente qui" // REPLACE con Twitter App OAuth Key #define kOAuthConsumerSecret @ "Il tuo consumatore segreto qui" // SOSTITUISCI CON Twitter App OAuth Secret 

Useremo queste costanti per un istante quando istanziamo il nostro _motore oggetto.

Passaggio 6: avviare la schermata di accesso di Twitter

Per il nostro caso d'uso, vogliamo inizializzare il _motore oggetto quando viene creato ViewController e quindi viene visualizzata la schermata di accesso OAuth di Twitter non appena il controller della vista termina il caricamento. Per inizializzare il _motore oggetto, modificare il viewDidAppear metodo da leggere come segue:

 - (void) viewDidAppear: (BOOL) animato if (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  

Ora vai avanti e rilascia il _motore oggetto nel nostro metodo dealloc del controllore:

 - (void) dealloc [_engine release]; [tweetTextField release]; [super dealloc];  

Al termine del caricamento della vista, vogliamo avviare immediatamente la schermata di accesso di Twitter. Per fare ciò, è necessario modificare nuovamente il file viewDidAppear metodo in questo modo:

 - (void) viewDidAppear: (BOOL) animato if (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (controller) [self presentedModalViewController: controller animated: YES];  

Se esegui l'applicazione ora, vedrai che stiamo presentando con successo la schermata di login di Twitter ogni volta che viene visualizzata la nostra visualizzazione personalizzata. Tuttavia, c'è un grosso problema con questa configurazione: la schermata di login sarà sempre visualizzata quando appare la vista, anche se l'utente ha già effettuato l'accesso. Dobbiamo aggiungere un condizionale che visualizzerà questo controllo solo se l'utente non ha ancora stato collegato tramite OAuth.

Per fare ciò, aggiungi il seguente condizionale prima di visualizzare la vista:

 if (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (controller) [self presentedModalViewController: controller animated: YES];  

Il isAuthorized il metodo restituirà un valore booleano di VERO se abbiamo un token di autenticazione OAuth. Quindi, questo condizionale semplicemente verifica se noi non avere l'autorizzazione e quindi visualizzare l'accesso di Twitter quando necessario.

Per il isAuthorized metodo per funzionare, abbiamo anche bisogno di aggiungere il seguente SA_OAuthTwitterEngineDelegate metodi di protocollo responsabili della memorizzazione del nostro token di autenticazione OAuth dopo il primo accesso:

 // ================================================ ================================================== =========================== #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) nomeutente  NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [default setObject: data forKey: @ "authData"]; [default si sincronizza];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) username return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  

Passaggio 7: Pubblica aggiornamenti su Twitter

In quella che è forse la fase più semplice dell'intero processo, aggiungi la seguente singola riga di codice a updateTwitter, il nostro metodo IBAction personalizzato, per pubblicare effettivamente un aggiornamento su Twitter:

 [_engine sendUpdate: tweetTextField.text]; 

Ecco! Ora dovresti pubblicare aggiornamenti sul tuo feed Twitter. Tuttavia, non abbiamo ancora finito. Cosa succede se la nostra applicazione non riesce a pubblicare l'aggiornamento? E se volessimo presentare una vista di conferma se il tweet è pubblicato con successo? Per fortuna, il TwitterEngineDelegate il protocollo ha due metodi definiti proprio per questo scopo.

Aggiungere il seguente codice a TwitterRushViewController.m:

 // ================================================ ================================================== =========================== #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Richiesta% @ riuscito ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error NSLog (@ "Request% @ failed with error:% @", requestIdentifier, error);  

È possibile vedere che l'applicazione registrerà i messaggi di successo e di errore sulla console in base a ciò che accade dopo aver fatto clic sul pulsante "Tweet". Questo comportamento può essere facilmente modificato per soddisfare le esigenze delle tue app.

Conclusione

Se hai seguito le istruzioni passo-passo sopra, ora dovresti essere in grado di pubblicare aggiornamenti di stato su Twitter per conto dei tuoi utenti!

Il pieno TwitterRushViewController.h il file dovrebbe ora assomigliare a questo:

 #importare  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @property (nonatomic, retain) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) del mittente; @fine 

Il pieno TwitterRushViewController.m il file dovrebbe contenere:

 #import "TwitterRushViewController.h" #import "SA_OAuthTwitterEngine.h" / * Definisci le costanti di seguito con la chiave e il segreto di Twitter per la tua applicazione. Crea credenziali OAuth di Twitter registrando la tua applicazione come client OAuth qui: http://twitter.com/apps/new * / #define kOAuthConsumerKey @ "La tua chiave qui" // SOSTITUISCI CON Twitter App OAuth Key #define kOAuthConsumerSecret @ "Your Segreto qui "// REPLACE con Twitter App OAuth Secret @implementation TwitterRushViewController @synthesize tweetTextField; #pragma mark Custom Methods - (IBAction) updateTwitter: (id) sender // Dismiss Keyboard [tweetTextField resignFirstResponder]; // Il codice di integrazione di Twitter va qui [_engine sendUpdate: tweetTextField.text];  #pragma mark Ciclo di vita di ViewController - (void) viewDidAppear: (BOOL) animato // Inizializzazione di Twitter / Codice di accesso qui se (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  if (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (controller) [self presentedModalViewController: controller animated: YES];  - (void) viewDidUnload [tweetTextField release]; tweetTextField = nil;  - (void) didReceiveMemoryWarning [super didReceiveMemoryWarning];  - (void) dealloc [_engine release]; [tweetTextField release]; [super dealloc];  // =============================================== ================================================== ============================ #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) username NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [default setObject: data forKey: @ "authData"]; [default si sincronizza];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) username return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  // =============================================== ================================================== ============================ #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Richiesta% @ riuscito ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error NSLog (@ "Request% @ failed with error:% @", requestIdentifier, error);  @fine 

Grazie per aver letto questo tutorial sulla libreria Twitter-OAuth-iPhone e un ringraziamento speciale a Ben Gottlieb, Matt Gemmell, Jon Crosby, Chris Kimpton e Isaiah Carew. Senza il loro duro lavoro, l'implementazione dell'API di Twitter con l'SDK dell'iPhone richiederebbe molti, molti più passi da compiere.

Hai domande o commenti su questo tutorial? Lasciali nella sezione commenti qui sotto o scrivi @markhammonds direttamente su twitter. Punti bonus per completare questo tutorial e utilizzare l'applicazione TwitterRush per inviarmi un messaggio!