iPhone SDK Verbinden Sie sich mit OAuth mit Twitter

In diesem Lernprogramm erfahren Sie, wie Sie die Twitter-API schnell in das iPhone-SDK integrieren Twitter-OAuth-iPhone, eine Plug-and-Play-Twitter-Bibliothek für das iPhone, die aus mehreren Open-Source-Projekten besteht, die von Ben Gottlieb für eine einfache Implementierung kombiniert und synthetisiert wurden.

Nachfolgende Änderungen an Techniken und Software

Bestimmte Aspekte von Anwendungen oder Techniken, die in diesem Lernprogramm verwendet werden, haben sich seit der ursprünglichen Veröffentlichung geändert. Dies kann es ein wenig schwierig machen, mitzuverfolgen. Wir empfehlen Ihnen, sich diese neueren Tutorials zum gleichen Thema anzusehen:

  • iOS 5 und das Twitter-Framework: Erste Schritte
  • iOS 5 und das Twitter-Framework: Fortgeschrittene Techniken

HINWEIS: Mit der Veröffentlichung von iOS 5 ist dieser Artikel nun veraltet. In Zukunft sollten Sie das Twitter Framework, das zum Lieferumfang des iOS 5 SDK gehört, ernsthaft in Betracht ziehen. Erwägen Sie nur die Implementierung der hier vorgestellten Lösung, wenn Sie Benutzer mit älteren Versionen von iOS unterstützen müssen.

Projektaufbau

Dieses Tutorial verwendet eine einfache Anwendung namens "TwitterRush", um die Integration von Twitter OAuth für das iPhone zu demonstrieren. Durch das Herunterladen der Anwendung TwitterRush können Sie alle Schritte in diesem Lernprogramm genau befolgen. Wenn Sie jedoch bereits ein iPhone-Projekt haben, das Sie mit der Twitter-API verbinden möchten, sollten Sie dennoch in der Lage sein, Ihren Code mit nur geringfügigen Änderungen zu verfolgen.

Zusätzlich zu TwitterRush oder Ihrem eigenen Projekt müssen Sie auch das auf GitHub verfügbare Twitter-OAuth-iPhone-Projekt von Ben Gottlieb herunterladen.

Schritt 1: Kopieren Sie den Twitter + OAuth-Ordner

Ziehen Sie nach dem Herunterladen und Aufheben der Archivierung der Bibliothek Twitter-OAuth-iPhone den Ordner "Twitter + OAuth" in den Ordner "Other Sources" im Xcode 4-Navigatorbereich. Stellen Sie sicher, dass Sie die Option "Elemente in den Ordner der Zielgruppe kopieren (falls erforderlich)" aktivieren und auf "Fertig stellen" klicken.

Wenn Sie jetzt versuchen, Ihre Anwendung zu kompilieren und auszuführen, führt dies zu einer Menge Fehler (90 zum Zeitpunkt der Erstellung dieses Dokuments mit iOS SDK 4). Machen Sie sich keine Sorgen: Wir werden alle in Schritt 2 leicht beheben.

Schritt 2: Fügen Sie die libxml2-Bibliothek hinzu

Wählen Sie im Navigatorbereich von Xcode 4 den Projektnamen (in diesem Fall "TwitterRush"). Als nächstes wählen Sie das aktuelle Ziel ("TwitterRush" hier erneut) und dann die Registerkarte "Build-Phasen". Erweitern Sie die Option "Binär mit Bibliotheken verknüpfen" und klicken Sie auf die Schaltfläche "+", um ein neues Framework hinzuzufügen. Geben Sie "libxml2" in das Suchfeld ein und wählen Sie die Option aus libxml2.dylib Bibliothek, die in der Liste angezeigt wird. Klicken Sie auf "Hinzufügen", um diese Bibliothek in die Verknüpfungsphase Ihres Projekts aufzunehmen.

Nachdem Sie diese Schritte ausgeführt haben, sollte Ihr Bildschirm ungefähr so ​​aussehen:

Nachdem Sie die Bibliothek zu Ihrem Projekt hinzugefügt haben, müssen Sie die Einstellung "Header-Suchpfade" in den Build-Einstellungen Ihres Projekts ändern. Heben Sie die Markierung des Ziels auf und wählen Sie das tatsächliche TwitterRush-Projekt aus. Öffnen Sie die Registerkarte "Build-Einstellungen" und suchen Sie nach dem Eintrag "Header Search Paths". Doppelklicken Sie auf diese Einstellung und klicken Sie auf die Schaltfläche "+" unten links im Popup-Dialogfeld, um einen neuen Suchpfad hinzuzufügen. Klicken Sie auf das Kontrollkästchen "rekursiv", doppelklicken Sie auf das Feld "Pfad" und geben Sie den folgenden dynamischen Pfad ein:

 $ (SDKROOT) / usr / include / libxml2

Nachdem Sie auf "Fertig" geklickt haben, sollte Ihr Bildschirm folgendermaßen aussehen:

Wenn Sie die Anwendung über die Xcode-Menüleiste ausführen, sollten Sie die Anwendung jetzt ohne Kompilierungsfehler erstellen können!

Schritt 3: Deklarieren Sie das NSXMLParserDelegate-Protokoll

Während Sie die Anwendung jetzt ohne Fehler kompilieren und ausführen können, gibt es eine Reihe von Warnungen, die sich auf Änderungen des iOS4-SDK und des NSXMLParserDelegate-Protokolls beziehen. Sie müssen das explizit erklären MGTwitterStatusesParser.h und MGTwitterXMLParser.h diesem Protokoll entsprechen, um das Auftreten dieser Warnungen zu verhindern.

Öffnen Sie dazu das MGTwitterStatusesParser.h Datei und ändern Sie die @Schnittstelle Erklärung durch die Erklärung der NSXMLParserDelegate Protokoll wie folgt:

 @Interface MGTwitterStatusesParser: MGTwitterXMLParser   

Jetzt mache dasselbe für MGTwitterXMLParser.h, das ändern @Schnittstelle Erklärung zu lesen:

 @Interface MGTwitterXMLParser: NSObject   

Sie sollten jetzt in der Lage sein, die Anwendung reibungslos zu kompilieren, ohne Fehler oder Warnungen zu generieren! Wir können jetzt mit der Integration der Twitter-OAuth-iPhone-Bibliothek in unseren Code beginnen.

Schritt 4: Importieren Sie SA_OAuthTwitterController.h und deklarieren Sie SA_OAuthTwitterEngine

Nun müssen wir mit dem Importieren der Bibliotheksklassen beginnen, die wir zum Verbinden mit der Twitter-API verwenden werden. Öffnen TwitterRushViewController.h und ändern Sie den Code wie folgt:

 #einführen  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @ Schnittstelle TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @ property (nicht atomar, beibehalten) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) Sender; @Ende 

In Zeile 2 importieren wir die SA_OAuthTwitterController Klasse zur Verwendung in unserem View-Controller. In Zeile 4 melden wir die SA_OAuthTwitterEngine Klasse, so dass wir eine Instanz dieser Klasse in der deklarieren können @Schnittstelle ohne die Header-Datei tatsächlich zu importieren. In Zeile 6 erklären wir die SA_OAuthTwitterControllerDelegate Protokoll: Dadurch können wir später leicht auf Twitter-API-Ereignisse reagieren. Schließlich wird in Zeile 10 der _Motor Objekt als Instanz des SA_OAuthTwitterEngine Klasse.

Wechseln Sie jetzt zu TwitterRushViewController.m Datei. Importieren Sie die SA_OAuthTwitterEngine Klasse, die wir gerade in der Klassenschnittstelle weiterleiten:

 #import "SA_OAuthTwitterEngine.h" 

Weil der SA_OAuthTwitterControllerDelegate Enthält nur optionale Methodendeklarationen. Zu diesem Zeitpunkt sollten Sie Ihre Anwendung erneut ohne Fehler oder Warnungen kompilieren und ausführen können.

Schritt 5: Definieren Sie Ihre Twitter-API-OAuth-Anmeldeinformationen

Um OAuth Zugriff auf die Twitter-API zu erhalten, müssen Sie zunächst einen Consumer-Schlüssel und einen geheimen Schlüssel für Twitter erstellen, um Ihre Anwendung identifizieren und authentifizieren zu können. Sie können dies auf der Twitter-Website tun, indem Sie sich bei Ihrem Konto anmelden und zum Registrierungsformular der App navigieren. Wenn Sie den Registrierungsvorgang durchlaufen, geben Sie unbedingt "Client" als Anwendungstyp an, aktivieren Sie das Kontrollkästchen "Ja, Twitter für Login verwenden" und wählen Sie als Standardzugriffstyp "Lesen & Schreiben", damit Ihre iPhone-App Beiträge posten kann Tweets im Namen Ihrer Benutzer.

Nachdem Sie Ihre Bewerbung registriert haben und Twitter Ihre Anmeldeinformationen generiert hat, fügen Sie Folgendes hinzu TwitterRushViewController.m über der Klasse @Implementierung:

 #define kOAuthConsumerKey @ "Ihr Consumer-Schlüssel hier" // ERSETZEN mit Twitter-App-OAuth-Schlüssel #define kOAuthConsumerSecret @ "Ihr Consumer-Geheimnis hier" // ERSETZEN mit Twitter-App OAuth Secret 

Wir werden diese Konstanten vorübergehend verwenden, wenn wir unsere instanziieren _Motor Objekt.

Schritt 6: Starten Sie den Twitter-Anmeldebildschirm

Für unseren Anwendungsfall möchten wir das initialisieren _Motor Objekt, wenn unser ViewController erstellt wurde, und zeigen Sie den Twitter OAuth-Anmeldebildschirm an, sobald der View Controller geladen ist. Zu initialisieren _Motor Objekt, ändern Sie die viewDidAppear Methode wie folgt zu lesen:

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

Nun los und los _Motor Objekt in unserer Ansicht Controller-Dealloc-Methode:

 - (void) dealloc [_engine release]; [tweetTextField-Version]; [Super Dealloc];  

Nachdem unsere Ansicht vollständig geladen wurde, möchten wir sofort den Twitter-Anmeldebildschirm starten. Dazu müssen Sie die viewDidAppear Methode wie folgt:

 - (void) viewDidAppear: (BOOL) animiert 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: animierter Controller: JA];  

Wenn Sie die Anwendung jetzt ausführen, werden Sie feststellen, dass der Twitter-Anmeldebildschirm erfolgreich angezeigt wird, sobald unsere benutzerdefinierte Ansicht angezeigt wird. Es gibt jedoch ein Hauptproblem bei diesem Setup: Der Anmeldebildschirm wird immer angezeigt, wenn die Ansicht angezeigt wird, auch wenn der Benutzer bereits angemeldet ist. Wir müssen eine Bedingung hinzufügen, die dieses Steuerelement nur anzeigt, wenn der Benutzer dies noch nicht getan hat wurde über OAuth verbunden.

Fügen Sie dazu die folgende Bedingung hinzu, bevor Sie die Ansicht anzeigen:

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

Das ist berechtigt Diese Methode gibt den booleschen Wert TRUE zurück, wenn wir ein OAuth-Authentifizierungstoken haben. Also prüft diese Bedingung einfach, ob wir unterlassen Sie haben die Berechtigung und zeigen bei Bedarf das Twitter-Login an.

Für die ist berechtigt Methode zu arbeiten, müssen wir auch Folgendes hinzufügen SA_OAuthTwitterEngineDelegate Protokollmethoden, die für das Speichern unseres OAuth-Authentifizierungstokens nach der ersten Anmeldung verantwortlich sind:

 // ================================================= ================================================== ============================= #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) Daten fürUsername: (NSString *) Benutzername  NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [Standardwerte setObject: data forKey: @ "authData"]; [Standardeinstellungen synchronisieren];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) Benutzername return [[NSUserDefaults StandardUserDefaults] objectForKey: @ "authData"];  

Schritt 7: Aktualisierungen bei Twitter posten

Fügen Sie in dem vielleicht einfachsten Schritt des gesamten Prozesses die folgende einzelne Codezeile hinzu updateTwitter, unsere benutzerdefinierte IBAction-Methode, um ein Update auf Twitter zu veröffentlichen:

 [_engine sendUpdate: tweetTextField.text]; 

Voila! Sie sollten jetzt Aktualisierungen für Ihren Twitter-Feed veröffentlichen. Wir sind jedoch noch nicht ganz fertig. Was passiert, wenn unsere Anwendung das Update nicht veröffentlicht? Was wäre, wenn wir eine Bestätigungsansicht präsentieren wollten, wenn der Tweet erfolgreich gepostet wurde? Zum Glück die TwitterEngineDelegate Protokoll hat zwei Methoden, die genau für diesen Zweck definiert sind.

Fügen Sie den folgenden Code hinzu TwitterRushViewController.m:

 // ================================================= ================================================== ============================ #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ erfolgreich abgeschlossen ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) Fehler NSLog (@ "Request% @ schlug mit Fehler fehl:% @", RequestIdentifier, Fehler);  

Sie können sehen, dass die Anwendung nun Erfolgs- und Fehlernachrichten in der Konsole protokolliert, je nachdem, was nach dem Klicken auf die Schaltfläche „Tweet“ geschieht. Dieses Verhalten kann leicht an die Anforderungen Ihrer eigenen Apps angepasst werden.

Fazit

Wenn Sie die oben aufgeführten Schritt-für-Schritt-Anweisungen befolgt haben, können Sie jetzt Status-Updates für Ihre Benutzer bei Twitter veröffentlichen!

Die volle TwitterRushViewController.h Die Datei sollte jetzt so aussehen:

 #einführen  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @ Schnittstelle TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @ property (nicht atomar, beibehalten) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) Sender; @Ende 

Die volle TwitterRushViewController.m Datei sollte lesen:

 #import "TwitterRushViewController.h" #import "SA_OAuthTwitterEngine.h" / * Definieren Sie die unten angegebenen Konstanten mit dem Twitter-Schlüssel und -Schlüssel für Ihre Anwendung. Erstellen Sie Twitter-OAuth-Anmeldeinformationen, indem Sie Ihre Anwendung als OAuth-Client hier registrieren: http://twitter.com/apps/new * / #define kOAuthConsumerKey @ "Ihr Schlüssel hier" // ERSETZEN mit der Twitter-App OAuth-Schlüssel #define kOAuthConsumerSecret @ "Ihr Secret Here "// Mit Twitter-App ersetzen OAuth Secret @implementation TwitterRushViewController @synthesize tweetTextField; #pragma mark Custom Methods - (IBAction) updateTwitter: (id) sender // Tastatur abbrechen [tweetTextField resignFirstResponder]; // Twitter-Integrationscode geht hier [_engine sendUpdate: tweetTextField.text];  #pragma mark ViewController Lifecycle - (void) viewDidAppear: (BOOL) animiert // Twitter-Initialisierung / Login-Code geht hier if (! _ engine) _engine = [[SA_OAuthTwitterEngine zuordnen] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  if (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (Controller) [self presentModalViewController: animierter Controller: JA];  - (void) viewDidUnload [tweetTextField release]; tweetTextField = nil;  - (void) didReceiveMemoryWarning [Super DidReceiveMemoryWarning];  - (void) dealloc [_engine release]; [tweetTextField-Version]; [Super Dealloc];  // =============================================== ================================================== ============================== #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) Daten für den Benutzernamen (NSString *) NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [Standardwerte setObject: data forKey: @ "authData"]; [Standardeinstellungen synchronisieren];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) Benutzername return [[NSUserDefaults StandardUserDefaults] objectForKey: @ "authData"];  // =============================================== ================================================== ============================= #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ erfolgreich abgeschlossen ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) Fehler NSLog (@ "Request% @ schlug mit Fehler fehl:% @", RequestIdentifier, Fehler);  @Ende 

Vielen Dank für das Lesen dieses Tutorials in der Twitter-OAuth-iPhone-Bibliothek und einen besonderen Dank an Ben Gottlieb, Matt Gemmell, Jon Crosby, Chris Kimpton und Isaiah Carew. Die Implementierung der Twitter-API mit dem iPhone-SDK würde ohne ihre harte Arbeit viele weitere Schritte erfordern.

Haben Sie Fragen oder Kommentare zu diesem Tutorial? Hinterlassen Sie sie in den Kommentaren oder schreiben Sie @markhammonds direkt auf Twitter. Bonuspunkte für das Abschließen dieses Tutorials und die Verwendung der TwitterRush-Anwendung zum Senden eines Anrufs!