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.
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:
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.
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.
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.
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!
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.
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.
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.
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"];
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.
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!