iPhone SDK Koble til Twitter med OAuth

Denne opplæringen vil vise deg hvordan du raskt kan integrere Twitter API med iPhone SDK ved hjelp av Twitter-OAuth-iPhone, et plug-and-play Twitter-bibliotek for iPhone som består av flere open source-prosjekter kombinert og syntetisert for enkel implementering av Ben Gottlieb.

Senere endringer i teknikker og programvare

Visse aspekter av applikasjoner eller teknikker som brukes i denne opplæringen, har endret seg siden den ble opprinnelig publisert. Dette kan gjøre det litt vanskelig å følge med. Vi anbefaler å se på disse nyere opplæringsprogrammene på samme emne:

  • IOS 5 og Twitter Framework: Første trinn
  • iOS 5 og Twitter Framework: avanserte teknikker

MERK: Med utgivelsen av iOS 5 er denne artikkelen nå utdatert. Fortsett, bør du vurdere å bruke Twitter Framework som leveres med iOS 5 SDK. Bare vurder å implementere løsningen som er demonstrert her hvis du må støtte brukere på eldre versjoner av iOS.

Prosjektoppsett

Denne opplæringen vil bruke et enkelt program kalt "TwitterRush" for å demonstrere Twitter OAuth-integrasjon for iPhone. Ved å laste ned TwitterRush-applikasjonen, vil du kunne følge alle trinnene i denne opplæringen nøyaktig. Men hvis du allerede har et iPhone-prosjekt som du vil koble til med Twitter API, bør du fortsatt kunne følge med i din egen kode med bare små endringer.

I tillegg til TwitterRush eller ditt eget prosjekt, må du også laste ned Ben Gottliebs Twitter-OAuth-iPhone-prosjekt tilgjengelig på GitHub.

Trinn 1: Kopier Twitter + OAuth-mappen

Etter å ha lastet ned og unarchiving Twitter-OAuth-iPhone-biblioteket, drar du mappen "Twitter + OAuth" i mappen "Andre kilder" i Xcode 4-navigatorområdet. Pass på å sjekke "Kopier elementer i destinasjonsgruppens mappe (hvis nødvendig)" og klikk "Fullfør".

Å forsøke å kompilere og kjøre din søknad nå, vil resultere i mange feil (90 på tidspunktet for denne skrivingen med iOS SDK 4). Ikke bekymre deg: vi vil enkelt fikse alle dem i trinn 2.

Trinn 2: Legg til libxml2-biblioteket

I navigatorområdet til Xcode 4 velger du prosjektnavnet (i dette tilfellet "TwitterRush"). Deretter velger du det nåværende målet ("TwitterRush" her igjen), og velg deretter "Bygg faser" -fanen. Utvid alternativet "Link binære med biblioteker", og klikk deretter "+" -knappen for å legge til et nytt rammeverk. Skriv "libxml2" i søkeboksen, og velg libxml2.dylib bibliotek som vises i listen. Klikk på "Legg til" for å inkludere dette biblioteket i koblingsfasen av prosjektet.

Etter å ha fullført disse trinnene, bør skjermen se slik ut:

Når du har lagt til biblioteket i prosjektet ditt, må du endre innstillingene for "header søkebaner" i prosjektets bygginnstillinger. For å gjøre dette, fjerner du målet og velger det faktiske TwitterRush-prosjektet. Åpne kategorien "Bygg innstillinger" og søk etter "Header Search Paths" -oppføringen. Dobbeltklikk denne innstillingen og klikk deretter "+" -knappen nederst til venstre i popup-dialogboksen for å legge til en ny søkebane. Klikk avkrysningsboksen "Rekursiv", dobbeltklikk feltet "Sti" og skriv inn følgende dynamiske sti:

 $ (SDKROOT) / usr / include / libxml2

Etter å ha klikket på "Ferdig", ser skjermen ut som dette:

Hvis du kjører programmet fra Xcode menulinjen, bør du nå kunne bygge programmet uten kompileringsfeil!

Trinn 3: Erklære NSXMLParserDelegate-protokollen

Mens du nå kan kompilere og kjøre programmet uten feil, er det en rekke advarsler knyttet til endringer i iOS4 SDK og NSXMLParserDelegate-protokollen. Du må eksplisitt erklære det MGTwitterStatusesParser.h og MGTwitterXMLParser.h i samsvar med denne protokollen for å forhindre at disse advarslene oppstår.

For å gjøre det, åpne MGTwitterStatusesParser.h fil og endre @interface erklæring ved å erklære NSXMLParserDelegate protokoll som så:

 @interface MGTwitterStatusesParser: MGTwitterXMLParser   

Gjør det samme for MGTwitterXMLParser.h, modifisere @interface erklæring for å lese:

 @interface MGTwitterXMLParser: NSObject   

Nå bør du kunne kompilere programmet uten å generere feil eller advarsler! Vi er nå klar til å begynne å integrere Twitter-OAuth-iPhone-biblioteket med vår kode.

Trinn 4: Importer SA_OAuthTwitterController.h & Deklar SA_OAuthTwitterEngine

Vi må nå begynne å importere biblioteksklassene som vi skal bruke for å koble til Twitter API. Åpen TwitterRushViewController.h og endre koden for å lese som følger:

 #importere  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @property (nonatomic, behold) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) sender; @slutt 

På linje 2 importerer vi SA_OAuthTwitterController klasse for bruk i vår visningskontroller. På linje 4, videresender vi SA_OAuthTwitterEngine klasse slik at vi kan erklære en forekomst av den klassen i @interface uten å faktisk importere topptekstfilen. På linje 6 erklærer vi SA_OAuthTwitterControllerDelegate protokoll-dette vil tillate oss å enkelt reagere på Twitter API-hendelser senere. Til slutt, på linje 10 erklærer vi _motor objekt som en forekomst av SA_OAuthTwitterEngine klasse.

Bytt nå til TwitterRushViewController.m fil. Importer SA_OAuthTwitterEngine klasse som vi fremdeles erklæres i klassegrensesnittet:

 #import "SA_OAuthTwitterEngine.h" 

Fordi det SA_OAuthTwitterControllerDelegate inneholder bare valgfrie metoden deklarasjoner, på dette tidspunktet bør du igjen kunne kompilere og kjøre programmet uten feil eller advarsler.

Trinn 5: Definer din Twitter API OAuth-legitimasjon

For å få OAuth tilgang til Twitter API, må du først opprette en forbrukernøkkel og en hemmelig nøkkel for Twitter for å kunne identifisere og godkjenne søknaden din. Du kan gjøre dette fra Twitter-nettstedet ved å logge deg på kontoen din og navigere til app-registreringsskjemaet. Når du går gjennom registreringsprosessen, må du passe på å spesifisere "klient" som søknadstype, sjekk "Ja, bruk Twitter for pålogging" -boksen, og velg "Les og skriv" som standard tilgangstype for å aktivere iPhone-appen din til å legge inn tweets på vegne av brukerne dine.

Etter at du har registrert søknaden din og Twitter har generert søknadsinformasjon, legger du til følgende i TwitterRushViewController.m over klassen @gjennomføring:

 #define kOAuthConsumerKey @ "Din forbruksnøkkel her" // SKIFT MED Twitter App OAuth Key #define kOAuthConsumerSecret @ "Din forbrukerhemmelig her" // SKIFT MED Twitter App OAuth Secret 

Vi vil bruke disse konstantene øyeblikkelig når vi instanser vår _motor gjenstand.

Trinn 6: Start Twitter Login Screen

For vårt brukstilfelle vil vi initialisere _motor objekt når vår ViewController er opprettet og så vise Twitter OAuth login-skjermen så snart visningskontrolleren fullfører lasting. For å initialisere _motor objekt, modifiser viewDidAppear metode for å lese som følger:

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

Gå nå og slipp ut _motor objekt i vår visning kontrollantens dealloc metode:

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

Etter at visningen er fullført, vil vi umiddelbart starte Twitter-innloggingsskjermen. For å gjøre det, må du igjen endre viewDidAppear metode slik:

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

Hvis du kjører programmet nå, ser du at vi presenterer Twitter-innloggingsskjermen med hell når vår tilpassede visning vises. Det er imidlertid ett stort problem med dette oppsettet: påloggingsskjermen vil alltid vises når visningen vises, selv om brukeren allerede har logget inn. Vi må legge til en betinget at denne kun vil vise denne kontrollen hvis brukeren ikke har vært koblet via OAuth.

For å gjøre dette, legg til følgende betinget før visningen vises:

 hvis (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; hvis (controller) [selvtillitModalViewController: controller animert: YES];  

De isAuthorized Metoden vil returnere en boolsk verdi av SANT hvis vi har et OAuth-godkjennings-token. Så, dette betinget bare tester om vi ikke ha autorisasjon, og viser deretter Twitter-login når det trengs.

For isAuthorized metode for arbeid, vi må også legge til følgende SA_OAuthTwitterEngineDelegate protokollmetoder som er ansvarlige for lagring av OAuth-autentiseringstoken vår etter den første påloggingen:

 // ================================================ ================================================== ====================pragma markere SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) brukernavn  NSUserDefaults * standard = [NSUserDefaults standardUserDefaults]; [standard settObject: data forKey: @ "authData"]; [standard synkronisere];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) brukernavn retur [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  

Trinn 7: Legg inn oppdateringer til Twitter

I det som er kanskje det enkleste trinnet i hele prosessen, legg til følgende enkelt linje med kode til updateTwitter, vår tilpassede IBAction-metode, for å faktisk legge inn en oppdatering til Twitter:

 [_engine sendUpdate: tweetTextField.text]; 

Voila! Du bør nå legge inn oppdateringer til ditt Twitter-feed. Vi er imidlertid ikke helt ferdige ennå. Hva skjer hvis programmet ikke sender oppdateringen? Hva om vi ønsket å presentere en bekreftelsesvisning hvis tweetet ble lagt ut? Heldigvis, TwitterEngineDelegate protokollen har to metoder definert for bare denne hensikten.

Legg til følgende kode til TwitterRushViewController.m:

 // ================================================ ================================================== =================== #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ lyktes ", requestIdentifier);  - (ugyldig) requestFailed: (NSString *) requestIdentifier withError: (NSError *) feil NSLog (@ "Request% @ mislyktes med feil:% @", requestIdentifier, error);  

Du kan se at applikasjonen nå logger suksess og feilmeldinger til konsollen avhengig av hva som skjer når vi klikker på "Tweet" -knappen. Denne oppførselen kan enkelt endres for å matche behovene til dine egne apper.

Konklusjon

Hvis du har fulgt trinnvise instruksjonene ovenfor, bør du nå kunne legge inn statusoppdateringer til Twitter på vegne av brukerne!

Den fulle TwitterRushViewController.h filen skal nå se slik ut:

 #importere  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @property (nonatomic, behold) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) sender; @slutt 

Den fulle TwitterRushViewController.m filen bør lese:

 #import "TwitterRushViewController.h" #import "SA_OAuthTwitterEngine.h" / * Definer konstanterne nedenfor med Twitter-nøkkelen og hemmelig for søknaden din. Opprett Twitter OAuth-legitimasjon ved å registrere din søknad som OAuth-klient her: http://twitter.com/apps/new * / #define kOAuthConsumerKey @ "Din nøkkel her" // SKIFT MED Twitter App OAuth Key #define kOAuthConsumerSecret @ "Din Hemmelighet her "// SKIFT MED Twitter App OAuth Secret @ implementering TwitterRushViewController @synthesize tweetTextField; #pragma markere Tilpassede metoder - (IBAction) updateTwitter: (id) avsender // Dismiss Keyboard [tweetTextField resignFirstResponder]; // Twitter Integration Code Går her [_engine sendUpdate: tweetTextField.text];  #pragma mark ViewController Lifecycle - (void) viewDidAppear: (BOOL) animert // Twitter Initialization / Login Code Går her hvis (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  hvis (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; hvis (controller) [selvtillitModalViewController: controller animert: YES];  - (void) viewDidUnload [tweetTextField release]; tweetTextField = nil;  - (void) didReceiveMemoryWarning [super didReceiveMemoryWarning];  - (void) dealloc [_engine release]; [tweetTextField release]; [super dealloc];  // ================================================= ================================================== =====================&pragma markere SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) brukernavn NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [standard settObject: data forKey: @ "authData"]; [standard synkronisere];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) brukernavn retur [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  // ================================================= ================================================== ==================== #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ lyktes ", requestIdentifier);  - (ugyldig) requestFailed: (NSString *) requestIdentifier withError: (NSError *) feil NSLog (@ "Request% @ mislyktes med feil:% @", requestIdentifier, error);  @slutt 

Takk for at du leser denne veiledningen på Twitter-OAuth-iPhone-biblioteket, og en veldig spesiell takk til Ben Gottlieb, Matt Gemmell, Jon Crosby, Chris Kimpton og Isaiah Carew. Uten deres harde arbeid, ville implementering av Twitter API med iPhone SDK ta mange, mange flere skritt for å oppnå.

Har du spørsmål eller kommentarer til denne opplæringen? La dem stå i kommentarfeltet nedenfor eller melding @markhammonds direkte på twitter. Bonuspoeng for å fullføre denne opplæringen og bruke TwitterRush-applikasjonen for å sende meg en rop ut!