iPhone SDK maak verbinding met Twitter met OAuth

Deze tutorial laat je zien hoe je de Twitter API snel kunt integreren met de iPhone SDK met Twitter-OAuth-iPhone, een plug-and-play Twitter-bibliotheek voor de iPhone die is samengesteld uit meerdere open-sourceprojecten gecombineerd en gesynthetiseerd voor eenvoudige implementatie door Ben Gottlieb.

Latere wijzigingen in technieken & software

Bepaalde aspecten van toepassingen of technieken die in deze zelfstudie worden gebruikt, zijn gewijzigd sinds de publicatie oorspronkelijk werd gepubliceerd. Dit maakt het misschien een beetje moeilijk om mee te volgen. We raden u aan deze meer recente zelfstudies over hetzelfde onderwerp te bekijken:

  • iOS 5 en het Twitter Framework: eerste stappen
  • iOS 5 en het Twitter Framework: geavanceerde technieken

NOTITIE: Met de release van iOS 5 is dit artikel nu verouderd. Vooruitkijkend zou je serieus moeten overwegen om het Twitter Framework te gebruiken dat wordt meegeleverd met de iOS 5 SDK. Overweeg alleen om de hier gedemonstreerde oplossing te implementeren als u gebruikers in oudere versies van iOS moet ondersteunen.

Project Setup

Deze tutorial gebruikt een eenvoudige applicatie genaamd "TwitterRush" om Twitter OAuth-integratie voor de iPhone te demonstreren. Door de toepassing TwitterRush te downloaden, kunt u alle stappen in deze zelfstudie precies volgen. Als u echter al een iPhone-project hebt dat u met de Twitter API wilt verbinden, zou u nog steeds in uw eigen code moeten kunnen volgen met slechts kleine wijzigingen.

Naast TwitterRush of je eigen project, moet je ook Ben Gottlieb's Twitter-OAuth-iPhone-project downloaden, beschikbaar op GitHub.

Stap 1: Kopieer de Twitter + OAuth-map

Na het downloaden en uitpakken van de Twitter-OAuth-iPhone-bibliotheek sleept u de map met de naam "Twitter + OAuth" naar de map "Andere bronnen" in het Xcode 4-navigatorgebied. Zorg ervoor dat u de optie "Items naar bestemmingsgroep kopiëren (indien nodig)" aanvinkt en klik op "Voltooien".

Als je probeert je programma nu te compileren en uit te voeren, krijg je VEEL fouten (90 op het moment van schrijven met iOS SDK 4). Geen zorgen: we zullen ze allemaal gemakkelijk oplossen in stap 2.

Stap 2: voeg de libxml2-bibliotheek toe

Selecteer in het navigatiegebied van Xcode 4 de projectnaam (in dit geval "TwitterRush"). Selecteer vervolgens het huidige doel ("TwitterRush" hier opnieuw) en selecteer vervolgens het tabblad "Fasen opbouwen". Vouw de optie "Binaire koppelingen met bibliotheken uitbreiden" uit en klik vervolgens op de knop "+" om een ​​nieuw kader toe te voegen. Typ "libxml2" in het zoekvak en selecteer de libxml2.dylib bibliotheek die in de lijst verschijnt. Klik op "Toevoegen" om deze bibliotheek in de koppelingsfase van uw project op te nemen.

Na het voltooien van deze stappen ziet uw scherm er ongeveer zo uit:

Nadat u de bibliotheek aan uw project hebt toegevoegd, moet u de instelling "Aanhefzoekpaden" in de bouwinstellingen van uw project wijzigen. Om dit te doen, deselecteert u het doel en selecteert u het eigenlijke TwitterRush-project. Open het tabblad "Build-instellingen" en zoek naar het item "Header Search Paths". Dubbelklik op deze instelling en klik vervolgens op de knop "+" linksonder in het pop-upvenster om een ​​nieuw zoekpad toe te voegen. Klik op het selectievakje "recursief", dubbelklik op het veld "Pad" en voer het volgende dynamische pad in:

 $ (SDKROOT) / usr / include / libxml2

Nadat u op 'Gereed' heeft geklikt, ziet uw scherm er ongeveer zo uit:

Als u de toepassing uitvoert via de Xcode-menubalk, zou u nu in staat moeten zijn om de toepassing te bouwen zonder compileerfouten!

Stap 3: Verklaar het NSXMLParser-delegatieprotocol

Hoewel u nu de toepassing kunt compileren en uitvoeren zonder fouten, zijn er een aantal waarschuwingen met betrekking tot wijzigingen in de iOS4 SDK en het NSXMLParserDelegate-protocol. U moet dat expliciet aangeven MGTwitterStatusesParser.h en MGTwitterXMLParser.h conform dit protocol om te voorkomen dat deze waarschuwingen zich voordoen.

Open hiervoor de MGTwitterStatusesParser.h bestand en wijzig de @interface verklaring door het NSXMLParserDelegate protocol zoals zo:

 @interface MGTwitterStatusesParser: MGTwitterXMLParser   

Doe nu hetzelfde voor MGTwitterXMLParser.h, het wijzigen van de @interface verklaring om te lezen:

 @interface MGTwitterXMLParser: NSObject   

Je zou nu in staat moeten zijn om de applicatie soepel te compileren zonder fouten of waarschuwingen te genereren! We zijn nu klaar om te beginnen met het integreren van de Twitter-OAuth-iPhone-bibliotheek met onze code.

Stap 4: Import SA_OAuthTwitterController.h & Declareer SA_OAuthTwitterEngine

We moeten nu beginnen met het importeren van de bibliotheekklassen die we zullen gebruiken om verbinding te maken met de Twitter API. Open TwitterRushViewController.h en pas de code als volgt aan:

 #importeren  #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) afzender; @einde 

Op regel 2 importeren we de SA_OAuthTwitterController klasse voor gebruik binnen onze view controller. Op regel 4 verklaren we de SA_OAuthTwitterEngine klasse zodat we een exemplaar van die klasse in de. kunnen declareren @interface zonder het header-bestand daadwerkelijk te importeren. Op regel 6 verklaren we de SA_OAuthTwitterControllerDelegate protocol - dit zal ons toelaten om gemakkelijk later op Twitter API-evenementen te reageren. Ten slotte verklaren we op regel 10 de _motor object als een instantie van de SA_OAuthTwitterEngine klasse.

Schakel nu over naar TwitterRushViewController.m het dossier. Importeer de SA_OAuthTwitterEngine klasse die we zojuist hebben doorgestuurd verklaard in de klasse-interface:

 #import "SA_OAuthTwitterEngine.h" 

Omdat het SA_OAuthTwitterControllerDelegate bevat alleen optionele methodedeclaraties, op dit punt zou u uw applicatie opnieuw moeten kunnen compileren en uitvoeren zonder fouten of waarschuwingen.

Stap 5: definieer uw OAuth-id's voor Twitter API

Als u OAuth-toegang tot de Twitter API wilt verkrijgen, moet u eerst een consumentensleutel en een geheime sleutel voor Twitter maken om uw toepassing te kunnen identificeren en verifiëren. U kunt dit doen via de Twitter-website door u aan te melden bij uw account en te navigeren naar het aanmeldingsformulier voor de app. Wanneer u het registratieproces doorloopt, moet u "client" opgeven als het toepassingstype, vink het selectievakje "Ja, gebruik Twitter voor inloggen" aan en selecteer "Lezen en schrijven" als het standaardtoegangstype om uw iPhone-app in te schakelen tweets namens uw gebruikers.

Nadat u uw toepassing hebt geregistreerd en Twitter uw aanmeldingsreferenties heeft gegenereerd, voegt u het volgende toe aan TwitterRushViewController.m boven de klas @implementatie:

 #define kOAuthConsumerKey @ "Uw gebruikerscode hier" // REPLACE met Twitter-app OAuth Key #define kOAuthConsumerSecret @ "Uw consumentengeheim hier" // REPLACE met Twitter App OAuth Secret 

We zullen deze constanten even gebruiken wanneer we onze constitueren _motor voorwerp.

Stap 6: Start het Twitter-loginscherm

Voor onze use-case willen we het _motor object wanneer onze ViewController is gemaakt en geef het Twitter OAuth-inlogscherm weer zodra de weergavecontroller klaar is met laden. Om de. Te initialiseren _motor object, wijzig het viewDidAppear methode om als volgt te lezen:

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

Ga nu door en laat de _motor object in onze visie controller dealloc methode:

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

Nadat het laden is voltooid, willen we het inlogscherm van Twitter onmiddellijk starten. Om dit te doen, moet u opnieuw het viewDidAppear methode zoals zo:

 - (void) viewDidAppear: (BOOL) geanimeerde 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 presentModalViewController: controller geanimeerd: YES];  

Als u de toepassing nu uitvoert, ziet u dat we het Twitter-aanmeldscherm met succes presenteren wanneer onze aangepaste weergave wordt weergegeven. Er is echter één groot probleem met deze instelling: het inlogscherm wordt altijd weergegeven wanneer de weergave wordt weergegeven, zelfs als de gebruiker al is ingelogd. We moeten een voorwaarde toevoegen die dit besturingselement alleen weergeeft als de gebruiker dit nog niet heeft gedaan verbonden via OAuth.

Voeg hiervoor de volgende voorwaarden toe voordat u de weergave weergeeft:

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

De is geautoriseerd methode retourneert een Booleaanse waarde WAAR als we een OAuth-verificatietoken hebben. Dus, deze voorwaardelijke test gewoon of we Niet doen autorisatie hebben en vervolgens de Twitter-login weergeven wanneer dat nodig is.

Voor de is geautoriseerd methode om te werken, moeten we ook het volgende toevoegen SA_OAuthTwitterEngineDelegate protocolmethoden die verantwoordelijk zijn voor het opslaan van ons OAuth-authenticatietoken na de eerste aanmelding:

 // ================================================ ================================================== =========================== #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) gebruikersnaam  NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [standaardinstellingen setObject: data forKey: @ "authData"]; [standaardsynchronisatie];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) gebruikersnaam return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  

Stap 7: post updates naar Twitter

In wat misschien de eenvoudigste stap van het hele proces is, voegt u de volgende enkele regel code toe aan updateTwitter, onze aangepaste IBAction-methode om een ​​update naar Twitter te plaatsen:

 [_engine sendUpdate: tweetTextField.text]; 

Voila! Je zou nu updates moeten posten op je Twitter-feed. We zijn echter nog niet helemaal klaar. Wat gebeurt er als onze applicatie de update niet publiceert? Wat als we een bevestigingsweergave wilden presenteren als de tweet succesvol is gepost? Gelukkig, de TwitterEngineDelegate protocol heeft twee methoden die voor dit doel zijn gedefinieerd.

Voeg de volgende code toe aan TwitterRushViewController.m:

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

U kunt zien dat de toepassing nu succes- en faalmeldingen bij de console registreert, afhankelijk van wat er gebeurt nadat we op de knop "Tweet" hebben geklikt. Dit gedrag kan eenvoudig worden aangepast aan de behoeften van uw eigen apps.

Conclusie

Als u de stapsgewijze instructies hierboven hebt gevolgd, zou u nu in staat moeten zijn om namens uw gebruikers statusupdates naar Twitter te posten!

De volledige TwitterRushViewController.h bestand zou er nu als volgt uit moeten zien:

 #importeren  #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) afzender; @einde 

De volledige TwitterRushViewController.m bestand moet lezen:

 #import "TwitterRushViewController.h" #import "SA_OAuthTwitterEngine.h" / * Definieer de onderstaande constanten met de Twitter-sleutel en geheim voor uw toepassing. Maak Twitter OAuth-referenties door uw toepassing als een OAuth-client hier te registreren: http://twitter.com/apps/new * / #define kOAuthConsumerKey @ "Uw sleutel hier" // REPLACE met Twitter-app OAuth-sleutel #define kOAuthConsumerSecret @ "Uw Secret Here "// REPLACE With Twitter App OAuth Secret @implementation TwitterRushViewController @synthetize tweetTextField; #pragma mark Custom Methods - (IBAction) updateTwitter: (id) afzender // toetsenbord sluiten [tweetTextField resignFirstResponder]; // Twitter-integratiecode komt hier [_engine sendUpdate: tweetTextField.text];  #pragma mark ViewController Lifecycle - (void) viewDidAppear: (BOOL) geanimeerd // Twitter-initialisatie / inlogcode komt hier als (! _ 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 presentModalViewController: controller geanimeerd: YES];  - (void) viewDidUnload [tweetTextField-release]; tweetTextField = nihil;  - (void) didReceiveMemoryWarning [super didReceiveMemoryWarning];  - (void) dealloc [_engine release]; [tweetTextField-release]; [super dealloc];  // =============================== ================================================== ============ # pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) gebruikersnaam NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [standaardinstellingen setObject: data forKey: @ "authData"]; [standaardsynchronisatie];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) gebruikersnaam return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  // =============================== ================================================== ============ # pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ succeeded ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error NSLog (@ "Request% @ failed with error:% @", requestIdentifier, error);  @end 

Bedankt voor het lezen van deze tutorial op de Twitter-OAuth-iPhone-bibliotheek, en een heel speciale dank aan Ben Gottlieb, Matt Gemmell, Jon Crosby, Chris Kimpton en Isaiah Carew. Zonder hun harde werk zou het implementeren van de Twitter API met de iPhone SDK nog vele, veel meer stappen moeten doen.

Heeft u vragen of opmerkingen over deze tutorial? Laat ze achter in de comments hieronder of stuur @markhammonds rechtstreeks op twitter. Bonuspunten voor het voltooien van deze tutorial en het gebruiken van de TwitterRush-applicatie om me een shout-out te sturen!