iPhone SDK Anslut till Twitter med OAuth

Denna handledning visar hur du snabbt kan integrera Twitter API med iPhone SDK med Twitter-OAuth-iPhone, ett plug-and-play Twitter-bibliotek för iPhone som består av flera öppna källprojekt kombinerat och syntetiserat för att underlätta genomförandet av Ben Gottlieb.

Senare ändringar i tekniker och programvara

Vissa aspekter av tillämpningar eller tekniker som används i denna handledning har ändrats sedan den ursprungligen publicerades. Detta kan göra det lite svårt att följa med. Vi rekommenderar att du tittar på de senaste tutorialsna om samma ämne:

  • IOS 5 och Twitter Framework: Första steget
  • iOS 5 och Twitter Framework: avancerade tekniker

NOTERA: Med utgåvan av iOS 5 är den här artikeln föråldrad. Förflyttning framåt bör du allvarligt överväga att använda Twitter Framework som skickas med iOS 5 SDK. Tänk bara på att implementera lösningen som visas här om du måste stödja användare på äldre versioner av iOS.

Projektinställningar

Denna handledning kommer att använda en enkel applikation som heter "TwitterRush" för att visa Twitter OAuth-integration för iPhone. Genom att ladda ner TwitterRush-programmet kommer du att kunna exakt följa alla steg i denna handledning. Men om du redan har ett iPhone-projekt som du vill ansluta till Twitter API, borde du fortfarande kunna följa med i din egen kod med endast små ändringar.

Förutom TwitterRush eller ditt eget projekt måste du också ladda ner Ben Gottliebs Twitter-OAuth-iPhone-projekt tillgängligt på GitHub.

Steg 1: Kopiera Twitter + OAuth-mappen

När du har laddat ner och arkiverat Twitter-OAuth-iPhone-biblioteket drar du mappen "Twitter + OAuth" i mappen "Andra källor" i Xcode 4-navigatorns område. Var noga med att kolla "Kopiera objekt till målgruppens mapp (om det behövs)" och klicka på "Slutför".

Att försöka kompilera och köra din ansökan nu kommer att resultera i många fel (90 vid tidpunkten för det här skrivandet med iOS SDK 4). Oroa dig inte: vi kommer enkelt att fixa dem alla i steg 2.

Steg 2: Lägg till libxml2-biblioteket

Välj navigationsområdet i Xcode 4, välj projektnamnet (i det här fallet "TwitterRush"). Välj sedan det aktuella målet ("TwitterRush" här igen) och välj sedan fliken "Byggfaser". Expandera alternativet "Länka binära med bibliotek" och klicka sedan på knappen "+" för att lägga till en ny ram. Skriv "libxml2" i sökrutan och välj libxml2.dylib bibliotek som visas i listan. Klicka på "Lägg till" för att inkludera det här biblioteket i länkfasen av ditt projekt.

När du har genomfört dessa steg ska din skärm se ut så här:

När du har lagt till biblioteket i ditt projekt måste du ändra inställningen för rubrikens sökvägar i projektets byggnadsinställningar. För att göra detta, avmarkera målet och välj det faktiska TwitterRush-projektet. Öppna fliken "Bygg inställningar" och sök efter "Rubrikrubriker". Dubbelklicka på den här inställningen och klicka sedan på knappen "+" längst ned till vänster i popup-dialogrutan för att lägga till en ny sökväg. Klicka på kryssrutan "Rekursiv", dubbelklicka på fältet "Path" och ange följande dynamiska sökväg:

 $ (SDKROOT) / usr / include / libxml2

När du klickar på "Klar" ska din skärm likna följande:

Om du kör programmet från Xcode menyraden borde du nu kunna bygga programmet utan kompileringsfel!

Steg 3: Förklara NSXMLParserDelegate-protokollet

Medan du nu kan kompilera och köra programmet utan några fel finns det ett antal varningar relaterade till ändringar i iOS4 SDK och NSXMLParserDelegate-protokollet. Du måste uttryckligen förklara det MGTwitterStatusesParser.h och MGTwitterXMLParser.h överensstämma med detta protokoll för att förhindra att dessa varningar inträffar.

För att göra det, öppna MGTwitterStatusesParser.h fil och ändra @gränssnitt deklaration genom att deklarera NSXMLParserDelegate protokoll som så:

 @interface MGTwitterStatusesParser: MGTwitterXMLParser   

Gör nu detsamma för MGTwitterXMLParser.h, modifiera @gränssnitt förklaring att läsa:

 @interface MGTwitterXMLParser: NSObject   

Du borde nu kunna kompilera programmet smidigt utan att skapa några fel eller varningar! Vi är nu redo att börja integrera Twitter-OAuth-iPhone-biblioteket med vår kod.

Steg 4: Importera SA_OAuthTwitterController.h & Declare SA_OAuthTwitterEngine

Vi måste nu börja importera biblioteksklasserna som vi ska använda för att ansluta till Twitter API. Öppna TwitterRushViewController.h och ändra koden för att läsa enligt följande:

 #importera  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @property (nonatomic, behåll) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) avsändare; @slutet 

På linje 2 importerar vi SA_OAuthTwitterController klass för användning inom vår visningskontroller. På rad 4 skickar vi fram förklaringen SA_OAuthTwitterEngine klass så att vi kan deklarera en förekomst av den klassen i @gränssnitt utan att faktiskt importera headerfilen. På rad 6 förklarar vi SA_OAuthTwitterControllerDelegate protokoll-det här tillåter oss att enkelt reagera på Twitter API-händelser senare. Slutligen, på rad 10, deklarerar vi _motor objekt som en förekomst av SA_OAuthTwitterEngine klass.

Växla nu till TwitterRushViewController.m fil. Importera SA_OAuthTwitterEngine klass som vi precis förklarat i klassgränssnittet:

 #import "SA_OAuthTwitterEngine.h" 

Eftersom det SA_OAuthTwitterControllerDelegate innehåller bara valfria metoddeklarationer. Vid denna tidpunkt bör du återigen kunna kompilera och köra din ansökan utan några fel eller varningar.

Steg 5: Definiera dina Twitter-API-OAuth-referenser

För att få OAuth-åtkomst till Twitter API måste du först skapa en konsumentnyckel och en hemlig nyckel för Twitter för att kunna identifiera och verifiera din ansökan. Du kan göra det från Twitter webbplats genom att logga in på ditt konto och navigera till appregistreringsformuläret. När du går igenom registreringsprocessen, var noga med att ange "klient" som applikationstyp, kolla rutan "Ja, använd Twitter för inloggning" och välj "Läs och skriv" som standardåtkomsttyp för att göra det möjligt för din iPhone-app att posta tweets på uppdrag av dina användare.

När du har registrerat din ansökan och Twitter har genererat dina ansökningsuppgifter, lägg till följande till TwitterRushViewController.m ovanför klassen @genomförande:

 #define kOAuthConsumerKey @ "Din konsumentnyckel här" // Byt ut med Twitter App OAuth Key #define kOAuthConsumerSecret @ "Din konsumenthemlighet här" // REPLACE WITH Twitter App OAuth Secret 

Vi kommer att använda dessa konstanter tillfälligt när vi instanserar vår _motor objekt.

Steg 6: Starta Twitter-inloggningsskärmen

För vårt användningsfall vill vi initiera _motor objekt när vår ViewController är skapad och visa sedan Twitter OAuth-inloggningsskärmen så snart bildkontrollen slutar ladda. För att initiera _motor objekt, ändra viewDidAppear metod att läsa enligt följande:

 - (void) viewDidAppear: (BOOL) animerad om (! _ motor) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  

Nu fortsätt och släpp ut _motor objekt enligt vår kontrollansvariges deallokmetod:

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

När vår syn är färdig att ladda, vill vi omedelbart starta Twitter-inloggningsskärmen. För att göra det måste du på nytt ändra viewDidAppear metod som så:

 - (void) viewDidAppear: (BOOL) animerad om (! _ motor) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; om (controller) [self presentModalViewController: controller animerad: YES];  

Om du kör programmet nu ser du att vi presenterar Twitter-inloggningsskärmen närhelst vår anpassade visning visas. Det finns dock ett stort problem med den här inställningen: inloggningsskärmen visas alltid när visningen visas, även om användaren redan har loggat in. Vi måste lägga till en villkorlig som endast visar denna kontroll om användaren inte har än har anslutits via OAuth.

För att göra detta lägger du till följande villkorliga innan du visar vyn:

 om (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; om (controller) [self presentModalViewController: controller animerad: YES];  

De isAuthorized Metoden kommer att returnera ett booleskt värde av SANT om vi har en OAuth-autentiseringstoken. Så, denna villkorliga testar helt enkelt om vi låt bli har behörighet och visar sedan Twitter-inloggningen när det behövs.

För isAuthorized Metod att arbeta, vi måste också lägga till följande SA_OAuthTwitterEngineDelegate protokollmetoder som ansvarar för att lagra vår OAuth-autentiseringstoken efter den första inloggningen:

 // ================================================ ================================================== ==================== #pragma markera SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data för användarnamn: (NSString *) användarnamn  NSUserDefaults * default = [NSUserDefaults standardUserDefaults]; [standardvärden setObject: data forKey: @ "authData"]; [standardinställningar]  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) användarnamn return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  

Steg 7: Postuppdateringar till Twitter

I vad som är det enklaste steget i hela processen lägger du till följande enkla rad kod till updateTwitter, vår anpassade IBAction-metod, att faktiskt posta en uppdatering till Twitter:

 [_engine sendUpdate: tweetTextField.text]; 

Voila! Du bör nu skicka uppdateringar till ditt Twitter-flöde. Vi är dock inte helt färdiga än. Vad händer om vår ansökan misslyckas med att lägga upp uppdateringen? Vad händer om vi ville presentera en bekräftelse om tweetn är upplagd? Tack och lov, TwitterEngineDelegate protokollet har två metoder definierade för just denna ändamål.

Lägg till följande kod till TwitterRushViewController.m:

 // ================================================ ================================================== ==================== #pragma markera TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Begär% @ lyckades ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) fel NSLog (@ "Begäran% @ misslyckades med fel:% @", requestIdentifier, error);  

Du kan se att programmet nu loggar framgång och felmeddelanden till konsolen beroende på vad som händer efter att vi klickat på knappen "Tweet". Detta beteende kan enkelt ändras för att matcha behoven hos dina egna appar.

Slutsats

Om du har följt stegen-för-steg-instruktionerna ovan bör du nu kunna posta statusuppdateringar till Twitter på uppdrag av dina användare!

Hela TwitterRushViewController.h filen ska nu se ut så här:

 #importera  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @property (nonatomic, behåll) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) avsändare; @slutet 

Hela TwitterRushViewController.m filen ska läsa:

 #import "TwitterRushViewController.h" #import "SA_OAuthTwitterEngine.h" / * Definiera konstanterna nedan med Twitter Key och Secret för din ansökan. Skapa Twitter OAuth-uppgifter genom att registrera din ansökan som en OAuth-klient här: http://twitter.com/apps/new * / #define kOAuthConsumerKey @ "Din nyckel här" // BYTA MED Twitter App OAuth Key #define kOAuthConsumerSecret @ "Your Hemlighet här "// REPLACE med Twitter App OAuth Secret @ implementation TwitterRushViewController @synthesize tweetTextField; #pragma markera anpassade metoder - (IBAction) updateTwitter: (id) avsändare // Avvisa tangentbordet [tweetTextField resignFirstResponder]; // Twitter Integration Code Går här [_engine sendUpdate: tweetTextField.text];  #pragma markera ViewController Lifecycle - (void) viewDidAppear: (BOOL) animerad // Twitter Initialization / Login Code Går här om (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  om (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; om (controller) [self presentModalViewController: controller animerad: YES];  - (void) viewDidUnload [tweetTextField release]; tweetTextField = nil;  - (void) didReceiveMemoryWarning [super didReceiveMemoryWarning];  - (void) dealloc [_engine release]; [tweetTextField release]; [super dealloc];  // ================================================== ================================================== ===================== #pragma markera SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data för användarnamn: (NSString *) användarnamn NSUserDefaults * default = [NSUserDefaults standardUserDefaults]; [standardvärden setObject: data forKey: @ "authData"]; [standardinställningar]  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) användarnamn return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  // ================================================== ================================================== ===================== #pragma markera TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ lyckades ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) fel NSLog (@ "Begäran% @ misslyckades med fel:% @", requestIdentifier, error);  @slutet 

Tack för att du läste den här handledningen på Twitter-OAuth-iPhone-biblioteket, och ett mycket speciellt tack till Ben Gottlieb, Matt Gemmell, Jon Crosby, Chris Kimpton och Isaiah Carew. Utan sitt hårda arbete skulle implementeringen av Twitter API med iPhone SDK ta många, många fler steg för att uppnå.

Har du frågor eller kommentarer om denna handledning? Lämna dem i kommentarfältet nedan eller meddelande @markhammonds direkt på twitter. Bonuspoäng för att slutföra denna handledning och använda TwitterRush-ansökan för att skicka mig en rop ut!