9
www.mobile360.de Österreich 9,00 | Schweiz 15,80 sFr | Luxemburg 9,20 Deutschland 7,80 Ausgabe 1/2012 Volume 06 RIP Palm: Ein Pionier verlässt die Bühne | Optische Täuschung: Einsatzmöglichkeiten und Erstellung von AR-Anwendungen |Tipps & Tricks: WP7 Mango für Profis | Case Study: Interaktive Kinderbuch-Apps Die Alternative: Nokia Maps auf Smartphones | RIA goes Mobile: App-Entwicklung mit Sencha Touch Alle Neuerungen des Ice Cream Sandwich Eng verzahnt Tipps & Tricks für Ihre Website!

Mobile technology 1_ 12_ios5-twitter_friese

  • Upload
    zuehlke

  • View
    1.626

  • Download
    1

Embed Size (px)

DESCRIPTION

Einfache Integration des Twitter API in eigene Apps. Die Integration von Twitter in eigene Applikationen ist in vielen Fällen wünschenswert. Was bisher mit recht viel Aufwand verbunden war, ist seit iOS 5 sehr einfach geworden – dank mehrerer Frameworks, die nicht nur für den Zugriff auf Twitter interessant sind.

Citation preview

Page 1: Mobile technology 1_ 12_ios5-twitter_friese

www.mobile360.de Österreich 9,00 ! | Schweiz 15,80 sFr | Luxemburg 9,20 ! Deutschland 7,80!Ausgabe 1/2012

Volume

06

RIP Palm: Ein Pionier verlässt die Bühne | Optische Täuschung: Einsatzmöglichkeiten und Erstellung

von AR-Anwendungen |!Tipps & Tricks: WP7 Mango für Profis | Case Study: Interaktive Kinderbuch-Apps

Die Alternative: Nokia Maps auf Smartphones | RIA goes Mobile: App-Entwicklung mit Sencha Touch

!"#$%&'(%&'))"*%+,-!"#$%&'($)*+,"&-./($0(12/3&-4"$)25(&2267'/&7$(8$)7&-$0(9#(4)$&$)$25(3$"-.$(:&$(;63$)(

#2:(<$&-.3$&/$(:$0(,"6='"$2(>6**#2&4'/&6202$/93$)40(762(?$"$@A2&-'(2#/9$2B

12/3&-4"$)(4+22$2(06('#@(8-."C00$"/$-.26"6,&$2(3&$(D$00',&2,5(?$"$@62&$(#2:(;'E*$2/(

9#,)$&@$2(#2:(0&$(@C)(&.)$(F:$$2(2#/9$2B

G'=$&(&0/(!"#$%&'(*$.)('"0($&2$()$&2$(?$-.26"6,&$H;"'//@6)*B(I#-.(%$)*')4/#2,(#2:(

J@@$2/"&-.4$&/0')=$&/(3$):$2('2,$=6/$2B(G'*&/(06""(*&/(46**$)9&$""$)(1)@'.)#2,(:$)(

#2/$)2$.*$)&0-.$(I20'/9(:$)(12/3&-4"$)(#2/$)0/C/9/(3$):$2(K($,'"5(6=(8/')/HLM(6:$)(

*#"/&2'/&62'"$)(;"'E$)5()$,&62'"(6:$)(,"6='"B

&2267'/&7$(N$0-.O@/0*6:$""$(*&/(L*0'/9=$/$&"&,#2,B(G&$(PO.&,4$&/$2(:$0(12/3&-4"$)0(

3$):$2(:'=$&(:#)-.($&2$()':&4'"$(Q2:$)#2,(:$)(8&-./(&2(:$2(D&//$"M#24/(,$0/$""/B

!"#$%&'(&0/($&2$(F2&/&'/&7$(762(G$7$"6M*$2/(P'205(:&$($2:"&-.($&2$(@#24/&62&$)$2:$(;')/H

2$)0-.'@/(93&0-.$2(12/3&-4"$)(#2:(;)67&:$)(0-.'@@$2(*+-./$2R

D$.)(F2@60('#@%./0"1'23456

333B="#$7&'B-6*((((((((((((((((S="#$7&'T:$(((

TELCOSSUCK!

Alle Neuerungen des Ice Cream Sandwich

Eng verzahnt

MOBILE TECHNOLOGY 1.2012

Tipps & Tricks für Ihre Website!

sandragitzel
sandragitzel
sandragitzel
Page 2: Mobile technology 1_ 12_ios5-twitter_friese

Twitter API | iOS 025

1 | 2012 Mobile Technology www.mobile360.de

!"#$%&'()*+(%,#-.,/

!"#$%&'()*+(%

,#-.,/!"#$%&'()*+

(%,#-.,/

!"#$%&'()*+(%

,#-.,/!"#$%&'()*+

(%,#-.,/

EINFACHE INTEGRATION DES TWITTER API IN EIGENE APPS

00

Die Integration von Twitter in eigene Applikationen ist in vielen Fällen wünschens-wert. Was bisher mit recht viel Aufwand verbunden war, ist seit iOS 5 sehr einfach geworden – dank mehrerer Frameworks, die nicht nur für den Zugriff auf Twitter inter-essant sind.

Page 3: Mobile technology 1_ 12_ios5-twitter_friese

026 iOS | Twitter API

www.mobile360.deMobile Technology 1 | 2012

von Peter Friese

ollte man Twitter in eigene Anwendungen integrieren, musste man als Entwickler bis dato relativ aufwändig selbst für den Zugriff auf das Twitter API samt Au-thenti!zierung und vieler anderer Kleinigkeiten sorgen. Alternativ hatte man die Möglichkeit, auf Third-Party-Bibliotheken zurückgreifen, was allerdings auch mit Schwierigkeiten verbunden war. Am Ende dieses müh-samen Wegs belohnte Twitter den Entwickler mit einer Reihe von APIs auf ausgewählte Twitter-Services, näm-lich das Search API, das REST API sowie das Streaming API [1]. Für normale Einsatzzwecke emp!ehlt Twitter die Nutzung des REST API, das den Zugriff auf Timelines, Status Updates (Tweets) sowie Benutzerinformationen ermöglicht. Bis auf wenige Ausnahmen ist für die Ver-wendung der meisten API-Aufrufe eine OAuth-Authen-ti!zierung erforderlich. Hierzu muss die App dem unter [2] beschriebenen Prozess folgen. Unter anderem bedeu-tet dies, dass der Benutzer bei der ersten Verwendung von Twitter in einer App auf eine Webseite bei Twitter gelenkt wird, auf der er explizit seine Zustimmung zur Nutzung von Twitter in der entsprechenden App geben muss. Nach Eingabe von Benutzernamen und Passwort auf dieser speziellen Authenti!zierungsseite gibt Twitter ein OAuth Access Token an die aufrufende App zurück. Dieses Token kann nun von der App gespeichert werden und ersetzt fortan bei der Kommunikation mit Twitter Benutzeramen und Passwort des Anwenders. Selbst wer sich nicht zur Gruppe der Power-User zählt und mehre-re reine Twitter-Clients auf seinem iPhone installiert hat,

wird doch die eine oder an-dere App haben, die Daten mit Twitter austauschen kann. Folglich muss der Anwender die OAuth-Au-thentifizierungsprozedur für jede dieser Apps erneut durchlaufen. Eine ziemlich umständliche Angelegenheit – für den Anwender jedoch sicherer als jeder App sein Passwort anzuvertrauen.

Mit iOS 5 ändert sich all dies grundlegend. Apple hat iOS um einen direkten Zugriff auf Twitter erwei-tert, was die Verwendung von Twitter sowohl für den Anwender als auch für uns Entwickler deutlich verein-facht. Die Verwaltung von Twitter-Benutzeraccounts erfolgt an zentraler Stelle über die Settings App bzw. über das Accounts API, mit dessen Hilfe Apps nicht nur die auf dem Device vorhan-

denen Accounts abfragen, sondern auch neue anlegen können. Über die Settings App (oder über Apps, die das entsprechende API nutzen) kann der Benutzer einen oder mehrere Twitter-Accounts hinterlegen. Eine Authenti!-zierung über OAuth ist danach nicht mehr erforderlich, sprich der Benutzer muss den Zugriff der App auf seinen Useraccount bei Twitter nicht mehr gesondert freigeben. Die Anzeige des OAuth-Authenti!zierungsformulars unterbleibt vollständig. Da nun alle Apps über ein sys-temweit einheitliches API auf diese auf dem Device ab-gelegten Benutzeraccounts zugreifen können, muss der Benutzer seine Twitter-Daten im Idealfall nur noch ein einziges Mal eingeben. Bis es allerdings soweit ist und wirklich alle Apps das neue API verwenden, wird sicher-lich noch einige Zeit vergehen.

Ein BeispielAnhand eines kleinen Beispiels schauen wir uns nun das Zusammenspiel der einzelnen Frameworks und Klassen an, die seit iOS 5 zur Verfügung stehen. Das Beispiel wird die Grundfunktionen eines Twitter-Clients nachbil-den: Auf der ersten Seite zeigen wir die Liste der auf dem iPhone angelegten Twitter-Accounts an (Abb.!1). Durch Antippen eines Accounts gelangt der Anwender dann zur Home-Timeline (Abb.!2). Auf dieser Ansicht werden alle Tweets des Benutzers und seiner Follower angezeigt.

Der Quellcode ist auf GitHub unter [3] verfügbar und kann dort heruntergeladen und gerne geforkt werden. Ich möchte im Rahmen dieses Artikels nicht darauf eingehen, wie der Aufbau von datenorientierten Apps mit Drill-down-Metapher funktioniert (hierzu gibt es eine Reihe hervorragender Tutorials [4]). Stattdessen zeige ich die für die Twitter-Integration relevanten Punkte auf. Beginnen wir dazu mit dem Zugriff auf die Benutzerdaten – schließ-lich stellt die Anzeige der auf dem iPhone eingerichteten Twitter-Accounts den Einstieg in die Applikation dar.

Zugriff auf die BenutzerdatenDer Zugriff auf die Benutzerdatenbank erfolgt über das Accounts-Framework [5]. Der zentrale Zugriffspunkt ist die Klasse ACAccountStore. Sie ermöglicht das Speichern neuer Accounts sowie das Auslesen bereits vorhandener. Um die Liste aller Twitter-Accounts auszulesen, muss zu-nächst über accountTypeWithAccountTypeIdenti!er: der Accounttyp ermittelt werden. Als Parameter wird eine String-Konstante angegeben. Derzeit gibt es zwar nur die Konstante ACAccountTypeIdenti!erTwitter, jedoch kann man an dieser Stelle die Vermutung anstellen, dass Apple in absehbarer Zukunft auch andere soziale Netzwerke unterstützen wird. Die Verwendung eines Strings als Iden-ti!er erlaubt die Unterstützung zusätzlicher Dienste, ohne das API ändern zu müssen. Hat man so den Accounttyp ermittelt, muss mittels requestAccessTo Accounts With-Type:with CompletionHandler: der Zugriff auf die Be-nutzerdatenbank angefordert werden. Der Zugriff auf die zugrunde liegende Datenbank kann nicht ohne Zu-stimmung des Benutzers erfolgen, was gewissermaßen den deutlich umständlicheren Weg über OAuth ersetzt.

Abb. 1: Ansicht der auf dem iPhone einge-richteten Twitter-Accounts

!!

Ihre Vorteile auf einen Blick:

Frei-Haus-Lieferung des Print-Magazins!

Alle Ausgaben online immer und

überall verfügbar!

Offline-PDF-Export

Ihre Vorteile auf einen Blick:

Jetzt Premium-

Angebot sichern!

Einfach online bestellen unter www.phpmagazin.de/abo oder unter +49 (0) 6123 9238-239 (Mo – Fr, 8 –17 Uhr)

Page 4: Mobile technology 1_ 12_ios5-twitter_friese

Twitter API | iOS 027

Abb. 2: Ansicht der Home Timeline des gewählten Benutzers

Beim ersten Zugriff einer Applikation auf die Benutzer-datenbank zeigt iOS daher ein Hinweisfenster und holt sich die Zustimmung des Benutzers ein. Je nach dem, ob der Benutzer seine Zustimmung gegeben hat oder nicht, wird YES oder NO im Parameter granted des Completion Handler übermittelt. Hat der Benutzer seine Zustimmung gegeben, kann die Liste der entsprechenden Accounts nun mit der Nachricht accountsWithAccountType: ausgelesen werden. Das Ergebnis, ein Array, speichern wir in einer Instanzvariablen und sorgen dafür, dass die Tabelle der View neu geladen wird (Listing 1). Die einzelnen Elemente des Arrays sind vom Typ ACAccount. In der Methode tableView:cellForRowAtIndexPath: werden die einzelnen Accounts dann für die Darstellung in einer Tabellenzeile aufbereitet (Listing 2). Bitte beachten: Alle Listings sind für Automated Reference Counting (ARC) formuliert.

Die Klasse ACAccount liefert allerdings nur wenige Informationen über den Benutzer. Die einzigen für uns verwertbaren Informationen sind userName (der techni-sche Name des Benutzers, d.!h. sein Twitter Handle) und accountDescription (die Twitter-Kurzbiographie). Wei-tergehende Informationen, wie z.!B. der echte Name des Benutzers sowie sein Twitter-Avatar müssen über separate API-Aufrufe ermittelt werden – dazu später mehr. Nach-dem wir nun Zugriff auf die Liste der auf dem Device ein-gerichteten Twitter-Accounts haben, können wir einen

Schritt weiter gehen und die Accountdaten zum Zugriff auf Twitter nutzen.

Zugriff auf die Home TimelineWie bereits angedeutet, setzt Twitter OAuth ein, um den Zugriff auf sein REST API zu schützen. Bis auf wenige Ausnahmen müssen alle Aufrufe des API mit einem so genannten Ac-cess Token authenti"ziert werden. Was früher recht aufwändig war, ist dank Apples neuem API jedoch sehr viel einfacher gewor-den. Als Beispiel schauen wir uns an, wie man auf die Home Timeline eines Twitter-Accounts zugrei-fen kann. Die so genannte Home Timeline ist die Liste der aktuellsten Tweets (und Retweets, falls vorhanden)

Anzeige

Anzeige

sandragitzel
Anzeige
sandragitzel
sandragitzel
Page 5: Mobile technology 1_ 12_ios5-twitter_friese

028 iOS | Twitter API

www.mobile360.deMobile Technology 1 | 2012

des Benutzers sowie seiner Follower. Sie entspricht dem, was man sieht, wenn man sich bei Twitter anmeldet und die Twitter-Homepage http://twitter.com aufruft. Wird nichts anderes angegeben, liefert das API nur die 20 letz-ten Tweets zurück. Die of!zielle API-Dokumentation [6] gibt Auskunft über den Resource-URL, unter dem das API erreichbar ist, sowie über die möglichen Parameter und das zu erwartende Ergebnis. Für unsere Zwecke ist ein parameterloser Aufruf des URL https://api.twitter.com/1/statuses/home_timeline.json adäquat, da wir ja die jeweils aktuellsten Tweets anzeigen wollen. Norma-lerweise würden wir nun wie z."B. unter [7] beschrieben einen NSURLRequest instantiieren und die entsprechen-den Delegate-Methoden implementieren, um Daten vom angegebenen URL herunterzuladen. Dank des neuen Twitter API geht dieser Kelch aber erfreulicherweise an uns vorüber. Um eine Anfrage an Twitter zu stellen, in-stantiieren wir einen TWRequest und kon!gurieren ihn entsprechend der Twitter-Dokumentation (Listing 3).

Die Autorisierung des Requests erfolgt, indem wir der Eigenschaft account den Twitter-Account zuwei-sen, den wir zuvor aus der lokalen Benutzerdatenbank (nach vorheriger Zustimmung des Benutzers) ausgelesen haben (Listing 1 und 2). Was hier so simpel aussieht, war früher recht kompliziert. Wer mag, kann unter [8]

Listing 1- (void)fetchData{ if (_accountStore == nil) { self.accountStore = [[ACAccountStore alloc] init]; if (_accounts == nil) { ACAccountType *accountTypeTwitter = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [self.accountStore requestAccessToAccountsWithType:accountTypeTwitter withCompletionHandler:^(BOOL granted, NSError *error) { if(granted) { dispatch_sync(dispatch_get_main_queue(), ^{ self.accounts = [self.accountStore accountsWithAccountType:accountTypeTwitter]; [self.tableView reloadData]; }); } }]; } }}

Listing 2- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } // Configure the cell... ACAccount *account = [self.accounts objectAtIndex:[indexPath row]]; cell.textLabel.text = account.username; cell.detailTextLabel.text = account.accountDescription; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell;}

Listing 3NSURL *url = [NSURL URLWithString: @"https://api.twitter.com/1/statuses/home_timeline.json"];TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:nil requestMethod:TWRequestMethodGET];[request setAccount:self.account];

Listing 4[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if ([urlResponse statusCode] == 200) { NSError *jsonError = nil; id jsonResult = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonError]; if (jsonResult != nil) { self.timeline = jsonResult; dispatch_sync(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); } else { NSString *message = [NSString stringWithFormat:@"Could not parse timeline: %@", [jsonError localizedDescription]]; [[[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } }}];

Page 6: Mobile technology 1_ 12_ios5-twitter_friese

Twitter API | iOS 029

1 | 2012 Mobile Technology www.mobile360.de

Listing 5- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } id tweet = [self.timeline objectAtIndex:[indexPath row]]; cell.textLabel.text = [tweet objectForKey:@"text"]; cell.detailTextLabel.text = [tweet valueForKeyPath:@"user.name"]; return cell;}

nachlesen, wie man Twitter OAuth unter iOS 4.x imple-mentieren musste.

Nachdem der Request auf diese Weise kon!guriert ist, kann er ausgeführt werden. Dank Blocks [9] ist auch dies sehr viel einfacher und überschaubarer als zu Zeiten von Selektoren: die Methode (void)performRequestWith-Handler:(TWRequestHandler)handler der Klasse TW-Request führt den Request aus und erwartet einen Completion Handler, der nach Ausführung des Requests aufgerufen wird. Der Handler hat drei Parameter:

NSData *responseData enthält die Antwortdaten des RequestsNSHTTPURLRequest *urlResponse erlaubt den Zugriff auf die Header-Infos der AntwortNSError *error schließlich enthält ggf. einen Fehler-code

Listing 4 zeigt den vollständigen Aufruf. Im Falle ei-nes erfolgreichen Request (der durch den HTTP-Code 200 angezeigt wird [10]) kann die Antwort des Servers verarbeitet werden. Wie durch den Request-URL gefor-dert, wird die Antwort im JSON-Format zurückgelie-fert. Mit iOS 5 hat Apple auch ein JSON-Framework bereitgestellt, sodass das Parsen von JSON-Daten nun sehr bequem und ohne die Einbindung von Third Party Libraries erfolgen kann, wie in Listing"4. Die Deseria-lisierung der JSON-Anwort ergibt in unserem Fall ein NSArray von Tweets, die ihrerseits als NSDictionary abgelegt sind. Dieses Array speichern wir in einer Ins-tanzvariablen, um später darauf zugreifen zu können. Der Aufbau der von Twitter zurückgegebenen Daten ist der API-Dokumentation zu entnehmen. Anders als viel-leicht von vielen vermutet, führt iOS kein automatisches Mapping von JSON-Objekten auf Objective-C-Objekte durch. Sollten wider Erwarten die von Twitter zurück-gelieferten Daten keine gültigen JSON-Daten sein, so

wird eine Fehlermeldung aus-gegeben.

Wie wir der Dokumenta-tion entnehmen können, ist nicht garantiert auf welchem Thread der Completion-Hand ler-Block der Methode (void)performRequestWithHandler:(TWRequestHandler)handler zurückkehrt. Da der Zugriff auf das UI aller-dings auf jeden Fall im Main Thread erfolgen muss, nutzen wir Grand Central Dispatch [11], um dies sicherzustellen. Mit dispatch_sync weisen wir GCD an, einen Block auf dem angegebenen Thread auszu-führen und auf die Ausfüh-rung des Blocks zu warten. Mit dispatch_get_main_queue greifen wir auf den Main Thread zu. Der übergebene Block initiiert das Neuladen der Tabelle auf unserer View. Wie Listing 5 zu entnehmen ist, ist der Aufbau der Zellen-inhalte der Tabelle recht einfach gehalten – eine weitere Ausschmückung sei Ihrer eigenen Kreativität überlassen.

Tweets senden – easy!Nun mag es ja ganz interessant sein, seine eigenen Tweets und die seiner Follower in einer Liste zu sehen, aber letzt-endlich möchte man sich irgendwann einmal auch selbst mitteilen und einen Tweet absenden. Das Senden von Tweets kann mit dem neuen Twitter API auf zwei Arten erfolgen: mithilfe des so genannten Tweet Sheets, wie in Abbildung! 3 dargestellt (technisch realisiert durch die Klasse TWTweetComposeViewController), oder mithilfe einer selbst zu implementierenden View, die dann wiede-rum die Klasse TWRequest zum Senden des Tweets be-nutzt.

Schauen wir uns zunächst die Verwendung der Klasse TWTweetComposeViewController an: Mit ihr ist das Senden eines Tweets mit nicht mehr als drei Zeilen Code zu erledigen. Wie jeder andere ViewController auch wird der TWTweetComposeViewController mittels [[TW-TweetComposeViewController alloc] init] angelegt. Mit [self presentModalViewController:tweetComposeViewController animated:YES] wird er dann dargestellt und der Benutzer kann seinen Tweet eingeben und absenden. Der Text kann über die Methode setInitialText vor der Anzeige des Tweet Sheets vorbelegt werden. Nach Anzei-ge des Tweet Sheets kann der Text nur noch durch den Benutzer verändert werden, um eine Manipulation durch die App zu unterbinden. Bilder können über die Methode addImage hinzugefügt und mittels removeAllImages wie-der entfernt werden. Gleiches gilt für URLs, hier sind die Methoden addUrl und removeAllUrls zu verwenden. Und

Abb. 3: Tweet eingeben und senden

Page 7: Mobile technology 1_ 12_ios5-twitter_friese

030 iOS | Twitter API

www.mobile360.deMobile Technology 1 | 2012

das war’s eigentlich auch schon. Um das Tweet Sheet nach Absenden des Tweets oder im Falle eines Abbruchs durch den Benutzer wieder auszublenden, sollte man allerdings noch einen Completion Handler setzen (Listing 6).

So verlockend einfach die Verwendung von TW-TweetComposeViewController auch sein mag, es gibt einen entscheidenden Nachteil: Der zu verwendende Twitter-Account kann nicht programmatisch gesetzt werden. Der Benutzer kann zwar im UI des Tweet Sheet zwischen den auf seinem Device eingerichteten Accounts hin- und herschalten, allerdings ist dies nicht ausreichend, um versehentlich vom falschen Account gesendete Tweets zu verhindern.

Tweets senden – aber richtig!Wem das Tweet Sheet nicht gefällt oder wer aus ande-ren Gründen ein anderes UI bevorzugt (z.!B. weil er Be-

nutzer mit mehreren Accounts vernünftig unterstützen will), kann ohne Weiteres ein eigenes UI für das Senden von Tweets (und ggf. von Direct Messages) erstellen. In unserem Beispiel wird das Tweet Sheet durch die Klasse TweetComposeViewController ersetzt, das UI wurde mit-hilfe des Interface Builders erstellt. UI-technisch gibt es kei-ne Überraschungen. Das Absenden eines Tweets erfolgt, wenn der Benutzer den S"#$-Button drückt. Der Code für das Senden eines Tweets ist nur unwesentlich länger als bei der Verwendung des Apple-eigenen Tweet Sheets.

Listing 9TWRequest *fetchUserImageRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://api.twitter.com/1/users/ profile_image/%@", account.username]] parameters:nil requestMethod:TWRequestMethodGET];[fetchUserImageRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if ([urlResponse statusCode] == 200) { UIImage *image = [UIImage imageWithData:responseData]; dispatch_sync(dispatch_get_main_queue(), ^{ cell.imageView.image = image; [cell setNeedsLayout]; }); }}];

Listing 8TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://api.twitter.com/1/users/ show.json"] parameters:[NSDictionary dictionaryWithObjectsAndKeys: account.username, @"screen_name", nil] requestMethod:TWRequestMethodGET];[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if ([urlResponse statusCode] == 200) { dispatch_sync(dispatch_get_main_queue(), ^{ NSError *error; id userInfo = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; cell.textLabel.text = [userInfo valueForKey:@"name"]; }); }}];Listing 7

- (IBAction)sendTweet:(id)sender { NSString *status = self.textView.text; TWRequest *sendTweet = [[TWRequest alloc] initWithURL: [NSURL URLWithString:@"https://api.twitter.com/1/statuses/update.json"] parameters: [NSDictionary dictionaryWithObjectsAndKeys:status, @"status", nil] requestMethod:TWRequestMethodPOST]; sendTweet.account = self.account; [sendTweet performRequestWithHandler: ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if ([urlResponse statusCode] == 200) { dispatch_sync(dispatch_get_main_queue(), ^{ [self.tweetComposeDelegate tweetComposeViewController:self didFinishWithResult:TweetComposeResultSent]; }); } else { NSLog(@"Problem sending tweet: %@", error); } }];}

Listing 6TWTweetComposeViewController *tweetComposeViewController = [[TWTweetComposeViewController alloc] init];[tweetComposeViewController setCompletionHandler: (TWTweetComposeViewControllerResult result) { [self dismissViewControllerAnimated:YES completion:nil]; }];[self presentModalViewController:tweetComposeViewController animated:YES];

Page 8: Mobile technology 1_ 12_ios5-twitter_friese

Twitter API | iOS 031

1 | 2012 Mobile Technology www.mobile360.de

Listing 10UIImage *image = [_imageCache objectForKey:account.username];if (image) { cell.imageView.image = image; }else { TWRequest *fetchUserImageRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://api.twitter.com/1/users/ profile_image/%@", account.username]] parameters:nil requestMethod:TWRequestMethodGET]; [fetchUserImageRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { if ([urlResponse statusCode] == 200) { UIImage *image = [UIImage imageWithData:responseData]; dispatch_sync(dispatch_get_main_queue(), ^{ [_imageCache setObject:image forKey:account.username]; [self.tableView reloadRowsAtIndexPaths: [NSArray arrayWithObject:indexPath] withRowAnimation:NO]; }); } }];

Das Vorgehen dürfte mittlerweile bekannt vorkommen: Zunächst wird ein TWRequest mittels des passenden URL kon!guriert, mit dem aktuellen Account autorisiert und mittels performWithRequestHandler abgeschickt. Nach erfolgreichem Absenden wird der View Controller im UI Thread wieder ausgeblendet, wie in Listing 7 dargestellt.

Zusatzinformationen zu einem Account ermitteln Wie bereits erwähnt, liefert das Accounts-Framework nur einige wenige Informationen zu einem gegebenen Ac-count. Weitere Informationen müssen explizit ermittelt werden. Twitter stellt hierzu die beiden REST Endpoints users/show [12] und users/pro!le_image/:screen_name zur Verfügung. Der Zugriff auf diese Endpoints erfolgt in Listing 8 und 9 nach dem nunmehr bekannten Sche-ma.

Dem aufmerksamen Leser wird nicht entgangen sein, dass der Code in Listing 8 und 9 ein Problem birgt: Der Zugriff auf die Tabellenzelle innerhalb des dispatch_sync-Blocks erfolgt eventuell zu einem Zeitpunkt, der nach dem Recycling der Tabellenzelle liegt. Es würde also die falsche Zelle verändert. Um dies zu verhindern, verwenden wir die Klasse NSCache, um die benötigten Informationen zu cachen. Sind die benötigten Informationen bereits im Cache, können wir sie direkt anzeigen. Anderenfalls laden wir sie asynchron, speichern sie im Cache und erzwingen

ein Neuladen der Zelle. Sollte die Zelle in der Zwischen-zeit recycelt und mit neuem Inhalt gefüllt worden sein, ist dies nicht weiter tragisch, da wir beim Neuladen der Zelle die Inhalte ja aus dem Cache beziehen. Dieser Vorgang ist in Listing 10 exemplarisch dargestellt.

FazitiOS 5 bringt mit den Accounts- und Twitter-Frameworks sowie der neuen Unterstützung für JSON-Serialisierung einige Erleichterungen für Entwickler mit sich, die eine Integration von Twitter in eigene Anwendungen im Ge-gensatz zu iOS 4 deutlich vereinfachen. Je nach Bedarf und Anwendungsfall kann jeder die Tiefe der benötig-ten Integration wählen: von der einfachen Verwendung des neuen Tweet Sheets zum Tweeten von Texten, Links oder Bildern bis hin zur tiefen Integration mit dem REST-basierten Twitter API. Weitergehende Informationen zur Integration von Twitter in iOS 5, die in diesem Artikel nicht abgedeckt wurden, gibt es unter [13].

Peter Friese arbeitet als Software Engineering Consultant für Zühl-ke Engineering. Seine Schwerpunkte liegen auf der modellgetriebe-nen Softwareentwicklung, der plattformübergreifenden Entwicklung von mobilen Anwendungen (u.!a. für iOS, Android, Windows Phone!7 und Mobile Web) sowie Eclipse als Plattform. Peter bloggt auf http://

www.peterfriese.de und twittert unter @peterfriese.

Links & Literatur

[1] https://dev.twitter.com/docs/api

[2] https://dev.twitter.com/docs/auth/oauth

[3] http://github.com/peterfriese/TwitterClient

[4] http://www.raywenderlich.com/1797/how-to-create-a-simple-iphone-app-tutorial-part-1

[5] http://developer.apple.com/library/ios/#documentation/Accounts/Reference/AccountsFrameworkRef/_index.html

[6] http://dev.twitter.com/docs/api/1/get/statuses/home_timeline

[7] http://useyourloaf.com/blog/2011/6/16/searching-twitter-with-ios.html

[8] http://www.icodeblog.com/2010/09/16/dealing-with-the-twitter-oauth-apocalypse/

[9] https://developer.apple.com/library/mac/#featuredarticles/BlocksGCD/_index.html

[10] http://www.w3.org/Protocols/HTTP/HTRESP.html

[11] http://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

[12] http://dev.twitter.com/docs/api/1/get/users/show

[13] http://bitly.com/twitterios5

[14] http://dev.twitter.com/docs/api/1/get/users/pro"le_image/%3Ascreen_name

Page 9: Mobile technology 1_ 12_ios5-twitter_friese

ImpressumVorschau auf die Ausgabe 2.2012Mit CRM-Anwendungen Geschäftsprozesse mobilisierenDer Einsatz mobiler Endgeräte im Unternehmensbereich wird zunehmend wichtiger. Der Wert für das Unternehmen ist weitestgehend unbestritten. Dieser Artikel geht der alles entscheiden-den Frage auf den Grund: Wer pro!tiert von mobilen Prozessen?Videos vom roten BullenGemeinsam mit Red Bull sollte Mitte 2010 für die bald startende Windows-Phone-Plattform ein mobiler Client gebaut werden, mit dem begeisterte Benutzer die Inhalte der Onlineplatt-form immer und überall konsumieren können. Der Funktionsumfang dieser Applikation schien überschaubar, außerdem existierte zu diesem Zeitpunkt bereits eine App auf einer nicht näher zu nennenden, aber beliebten anderen Handybetriebssystemplattform, die es „einfach zu migrieren“ galt. Erleben Sie dieses Abenteuer aus erster Hand!

Aus redaktionellen Gründen können sich einige Themen kurzfristig ändern.

Verlag:Software & Support Media GmbH

Anschrift der Redaktion:Mobile TechnologySoftware & Support Media GmbHGeleitsstraße 14D-60599 Frankfurt am MainTel. +49 (0) 69 630089-0Fax. +49 (0) 69 [email protected]

Redaktion: Thomas Wießeckel, Lukasz Konieczny, Christoph EbertChefin vom Dienst/Leitung Schlussredaktion: Nicole BechtelSchlussredaktion: Katharina Klassen, Frauke Pesch, Lisa PychlauLeitung Grafik & Produktion: Jens MainzLayout, Titel: Tobias Dorn, Flora Feher, Karolina Gaspar, Laura Keßler, Dominique Kalbassi, Maria Rudi, Petra Rüth, Franziska Sponer

Autoren dieser Ausgabe:Peter Friese, Tam Hanna, Dominik Helleberg, Rudolf Jansen, Max Knor, Daniel Koch, Christian Kuhn, Chris-tian Meder, Rainald Suchan, Juri Urbainczyk

Anzeigenverkauf:Software & Support Media GmbHPatrik BaumannTel. +49 (0) 69 630089-0Fax. +49 (0) 69 [email protected] Es gilt die Anzeigenpreisliste Mediadaten 2012

Pressevertrieb:DPV NetworkTel.+49 (0) 40 378456261, www.dpv-network.de

Druck: PVA LandauISSN: 1619-795X

Einzelverkaufspreis:Deutschland: ! 7,80Österreich: ! 9,00Luxemburg ! 9,20Schweiz: sFr 15,80

© 2012 Software & Support Media GmbH

Alle Rechte vorbehalten.Nachdruck nur mit schriftlicher Genehmigung.

Eine Haftung für die Richtigkeit der Veröffent lichungen kann trotz Prüfung durch die Re daktion vom Heraus-geber nicht übernommen werden. Honorierte Artikel gehen in das Verfügungsrecht des Verlags über. Mit der Übergabe der Manuskripte und Abbildungen an den Verlag erteilt der Verfasser dem Heraus geber das Exklusivitätsrecht zur Veröffentlichung. Für unverlangt eingeschickte Manuskripte, Fotos und Abbildungen keine Gewähr.

Alle im Mobile Technology verwendeten Markennamen sind in der Regel eingetragene Warenzeichen der entsprechenden Unternehmen oder Organisationen.

foursquare API: Interessantes in der Nähe –!mit PHP! Responsive Web Design: Was steckt hinter dem Hype?

Dritte Dimension – Das LG P920 Optimus 3D im Test: http://bit.ly/vwdgMR Tablet-PCs auf dem Vormarsch in Deutschland: http://bit.ly/tDlUUu

Die Tricks der Photoshop-Pro"s: http://bit.ly/uQFZt4 Neuer Musikdienst rara.com im An#ug: http://bit.ly/tPfo6Y

www.createordie.de

Querschau

Ausgabe 2.2012 | www.phpmagazin.de

www.mobile360.de

Die nächste Ausgabe erscheint am 30. März 2012

InserentenAndroid 360 2www.android360.de

BASTA! Spring 2012 51www.basta.net

dot.NET Magazin 79www.dotnet-magazin.de

Entwickler Akademie 23, 57, 85www.entwickler-akademie.de

Entwickler Magazin 67www.entwickler-magazin.de

entwickler.press 35, 95www.entwickler-press.de

Galileo Press GmbH 21!www.galileo-press.de

inovex GmbH! 15www.inovex.de

Java Magazin 73www.javamagazin.de

JAX 2012 61www.jax.de

Mobile360.de 13www.mobile360.de

MobileTech Conference 2012 37www.mobiletech.de

Mobile Technology Magazin 19mobile360.de/MobileTechnology

Neue DEUTSCHE KONGRESS GmbH 69!www.deutsche-kongress.de

OPITZ CONSULTING GmbH 17www.opitz-consulting.de

PHP Magazin 27www.phpmagazin.de

Telefónica O2 Germany GmbH & Co. OHG 100www.o2.com

webinale 2012 99www.webinale.de