Mobile technology 1_ 12_ios5-twitter_friese

1.913 Aufrufe

Veröffentlicht am

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.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.913
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
24
Aktionen
Geteilt
0
Downloads
8
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Mobile technology 1_ 12_ios5-twitter_friese

  1. 1. Ausgabe www.mobile360.de 1/2012 Deutschland 7,80 € Österreich 9,00 € | Schweiz 15,80 sFr | Luxemburg 9,20 € Volume 06 MOBILE TECHNOLOGY 1.2012 TELCOS SUCK! !"#$%&(%&))"*%+,- Tipps & Tricks für Ihre Website!!"#$%&($)*+,"&-./($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$2B12/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$2BG=$&(&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 Alle Neuerungen des!"#$%&(&0/($&2$(F2&/&/&7$(762(G$7$"6M*$2/(P205(:&$($2:"&-.($&2$(@#24/&62&$)$2:$(;)/H Ice Cream Sandwich2$)0-.@/(93&0-.$2(12/3&-4"$)(#2:(;)67&:$)(0-.@@$2(*+-./$2RD$.)(F2@60(#@%./0"123456 Eng verzahnt RIP Palm: Ein Pionier verlässt die Bühne | Optische Täuschung: Einsatzmöglichkeiten und Erstellung ((((((((((((((((S="#$7&T:$((( 333B="#$7&B-6* 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
  2. 2. Twitter API | iOS 025 EINFACHE INTEGRATION DES TWITTER API IN EIGENE APPS +(%,#- . ,/ ! ()* + "##$$%%&&()* !" Die Integration von Twitter in eigene Applikationen ist in vielen Fällen wünschens- wert. Was bisher mit recht viel Aufwand verbunden war, 00 ist seit iOS 5 sehr einfach geworden – dank mehrerer Frameworks, die nicht nur für den Zugriff auf Twitter inter- essant sind.www.mobile360.de 1 | 2012 Mobile Technology
  3. 3. 026 iOS | Twitter API! von Peter Friese denen Accounts abfragen, sondern auch neue anlegen können. Über die Settings App (oder über Apps, die das ollte man Twitter in eigene Anwendungen integrieren, entsprechende API nutzen) kann der Benutzer einen oder musste man als Entwickler bis dato relativ aufwändig mehrere Twitter-Accounts hinterlegen. Eine Authentifi- selbst für den Zugriff auf das Twitter API samt Au- zierung über OAuth ist danach nicht mehr erforderlich, thentifizierung und vieler anderer Kleinigkeiten sorgen. sprich der Benutzer muss den Zugriff der App auf seinen Alternativ hatte man die Möglichkeit, auf Third-Party- Useraccount bei Twitter nicht mehr gesondert freigeben. Bibliotheken zurückgreifen, was allerdings auch mit Die Anzeige des OAuth-Authentifizierungsformulars Schwierigkeiten verbunden war. Am Ende dieses müh- unterbleibt vollständig. Da nun alle Apps über ein sys- samen Wegs belohnte Twitter den Entwickler mit einer temweit einheitliches API auf diese auf dem Device ab- Reihe von APIs auf ausgewählte Twitter-Services, näm- gelegten Benutzeraccounts zugreifen können, muss der lich das Search API, das REST API sowie das Streaming Benutzer seine Twitter-Daten im Idealfall nur noch ein API [1]. Für normale Einsatzzwecke empfiehlt Twitter die einziges Mal eingeben. Bis es allerdings soweit ist und Nutzung des REST API, das den Zugriff auf Timelines, wirklich alle Apps das neue API verwenden, wird sicher- Status Updates (Tweets) sowie Benutzerinformationen lich noch einige Zeit vergehen. ermöglicht. Bis auf wenige Ausnahmen ist für die Ver- wendung der meisten API-Aufrufe eine OAuth-Authen- Ein Beispiel tifizierung erforderlich. Hierzu muss die App dem unter Anhand eines kleinen Beispiels schauen wir uns nun das [2] beschriebenen Prozess folgen. Unter anderem bedeu- Zusammenspiel der einzelnen Frameworks und Klassen tet dies, dass der Benutzer bei der ersten Verwendung an, die seit iOS 5 zur Verfügung stehen. Das Beispiel von Twitter in einer App auf eine Webseite bei Twitter wird die Grundfunktionen eines Twitter-Clients nachbil- gelenkt wird, auf der er explizit seine Zustimmung zur den: Auf der ersten Seite zeigen wir die Liste der auf dem Nutzung von Twitter in der entsprechenden App geben iPhone angelegten Twitter-Accounts an (Abb. 1). Durch muss. Nach Eingabe von Benutzernamen und Passwort Antippen eines Accounts gelangt der Anwender dann zur auf dieser speziellen Authentifizierungsseite gibt Twitter Home-Timeline (Abb. 2). Auf dieser Ansicht werden alle ein OAuth Access Token an die aufrufende App zurück. Tweets des Benutzers und seiner Follower angezeigt. Dieses Token kann nun von der App gespeichert werden Der Quellcode ist auf GitHub unter [3] verfügbar und und ersetzt fortan bei der Kommunikation mit Twitter kann dort heruntergeladen und gerne geforkt werden. Ich Benutzeramen und Passwort des Anwenders. Selbst wer möchte im Rahmen dieses Artikels nicht darauf eingehen, sich nicht zur Gruppe der Power-User zählt und mehre- wie der Aufbau von datenorientierten Apps mit Drill- re reine Twitter-Clients auf seinem iPhone installiert hat, down-Metapher funktioniert (hierzu gibt es eine Reihe wird doch die eine oder an- hervorragender Tutorials [4]). Stattdessen zeige ich die für dere App haben, die Daten die Twitter-Integration relevanten Punkte auf. Beginnen mit Twitter austauschen wir dazu mit dem Zugriff auf die Benutzerdaten – schließ- kann. Folglich muss der lich stellt die Anzeige der auf dem iPhone eingerichteten Anwender die OAuth-Au- Twitter-Accounts den Einstieg in die Applikation dar. thentifizierungsprozedur für jede dieser Apps erneut Zugriff auf die Benutzerdaten durchlaufen. Eine ziemlich Der Zugriff auf die Benutzerdatenbank erfolgt über das umständliche Angelegenheit Accounts-Framework [5]. Der zentrale Zugriffspunkt ist – für den Anwender jedoch die Klasse ACAccountStore. Sie ermöglicht das Speichern sicherer als jeder App sein neuer Accounts sowie das Auslesen bereits vorhandener. Passwort anzuvertrauen. Um die Liste aller Twitter-Accounts auszulesen, muss zu- Mit iOS 5 ändert sich all nächst über accountTypeWithAccountTypeIdentifier: der dies grundlegend. Apple Accounttyp ermittelt werden. Als Parameter wird eine hat iOS um einen direkten String-Konstante angegeben. Derzeit gibt es zwar nur die Zugriff auf Twitter erwei- Konstante ACAccountTypeIdentifierTwitter, jedoch kann tert, was die Verwendung man an dieser Stelle die Vermutung anstellen, dass Apple von Twitter sowohl für den in absehbarer Zukunft auch andere soziale Netzwerke Anwender als auch für uns unterstützen wird. Die Verwendung eines Strings als Iden- Entwickler deutlich verein- tifier erlaubt die Unterstützung zusätzlicher Dienste, ohne facht. Die Verwaltung von das API ändern zu müssen. Hat man so den Accounttyp Twitter-Benutzeraccounts ermittelt, muss mittels requestAccessToAccountsWith- erfolgt an zentraler Stelle Type:withCompletionHandler: der Zugriff auf die Be- über die Settings App bzw. nutzerdatenbank angefordert werden. Der Zugriff auf über das Accounts API, mit die zugrunde liegende Datenbank kann nicht ohne Zu-Abb. 1: Ansicht der auf dem iPhone einge- dessen Hilfe Apps nicht nur stimmung des Benutzers erfolgen, was gewissermaßenrichteten Twitter-Accounts die auf dem Device vorhan- den deutlich umständlicheren Weg über OAuth ersetzt.Mobile Technology 1 | 2012 www.mobile360.de
  4. 4. Twitter API | iOS 027Beim ersten Zugriff einer Applikation auf die Benutzer- Schritt weiter gehen und diedatenbank zeigt iOS daher ein Hinweisfenster und holt Accountdaten zum Zugriffsich die Zustimmung des Benutzers ein. Je nach dem, ob auf Twitter nutzen.der Benutzer seine Zustimmung gegeben hat oder nicht,wird YES oder NO im Parameter granted des Completion Zugriff auf die HomeHandler übermittelt. Hat der Benutzer seine Zustimmung Timelinegegeben, kann die Liste der entsprechenden Accounts nun Wie bereits angedeutet,mit der Nachricht accountsWithAccountType: ausgelesen setzt Twitter OAuth ein,werden. Das Ergebnis, ein Array, speichern wir in einer um den Zugriff auf seinInstanzvariablen und sorgen dafür, dass die Tabelle der REST API zu schützen. BisView neu geladen wird (Listing 1). Die einzelnen Elemente auf wenige Ausnahmendes Arrays sind vom Typ ACAccount. In der Methode ta müssen alle Aufrufe des APIbleView:cellForRowAtIndexPath: werden die einzelnen mit einem so genannten Ac-Accounts dann für die Darstellung in einer Tabellenzeile cess Token authentifiziertaufbereitet (Listing 2). Bitte beachten: Alle Listings sind werden. Was früher rechtfür Automated Reference Counting (ARC) formuliert. aufwändig war, ist dank Die Klasse ACAccount liefert allerdings nur wenige Apples neuem API jedochInformationen über den Benutzer. Die einzigen für uns sehr viel einfacher gewor-verwertbaren Informationen sind userName (der techni- den. Als Beispiel schauensche Name des Benutzers, d. h. sein Twitter Handle) und wir uns an, wie man aufaccountDescription (die Twitter-Kurzbiographie). Wei- die Home Timeline einestergehende Informationen, wie z. B. der echte Name des Twitter-Accounts zugrei-Benutzers sowie sein Twitter-Avatar müssen über separate fen kann. Die so genannteAPI-Aufrufe ermittelt werden – dazu später mehr. Nach- Home Timeline ist die Listedem wir nun Zugriff auf die Liste der auf dem Device ein- der aktuellsten Tweets (und Abb. 2: Ansicht der Home Timeline desgerichteten Twitter-Accounts haben, können wir einen Retweets, falls vorhanden) gewählten Benutzers Anzeige Anzeige
  5. 5. 028 iOS | Twitter API des Benutzers sowie seiner Follower. Sie entspricht dem, Listing 1 was man sieht, wenn man sich bei Twitter anmeldet und die Twitter-Homepage http://twitter.com aufruft. Wird - (void)fetchData { nichts anderes angegeben, liefert das API nur die 20 letz- if (_accountStore == nil) { ten Tweets zurück. Die offizielle API-Dokumentation [6] self.accountStore = [[ACAccountStore alloc] init]; gibt Auskunft über den Resource-URL, unter dem das if (_accounts == nil) { API erreichbar ist, sowie über die möglichen Parameter ACAccountType *accountTypeTwitter = und das zu erwartende Ergebnis. Für unsere Zwecke ist [self.accountStore ein parameterloser Aufruf des URL https://api.twitter. accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; com/1/statuses/home_timeline.json adäquat, da wir ja [self.accountStore die jeweils aktuellsten Tweets anzeigen wollen. Norma- requestAccessToAccountsWithType:accountTypeTwitter lerweise würden wir nun wie z. B. unter [7] beschrieben withCompletionHandler:^(BOOL granted, NSError *error) einen NSURLRequest instantiieren und die entsprechen- { den Delegate-Methoden implementieren, um Daten vom if(granted) { dispatch_sync(dispatch_get_main_queue(), ^{ angegebenen URL herunterzuladen. Dank des neuen self.accounts = Twitter API geht dieser Kelch aber erfreulicherweise an [self.accountStore uns vorüber. Um eine Anfrage an Twitter zu stellen, in- accountsWithAccountType:accountTypeTwitter]; stantiieren wir einen TWRequest und konfigurieren ihn [self.tableView reloadData]; 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 2 Listing 4 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: [request performRequestWithHandler:^(NSData *responseData, (NSIndexPath *)indexPath NSHTTPURLResponse *urlResponse, { NSError *error) static NSString *CellIdentifier = @"Cell"; { if ([urlResponse statusCode] == 200) { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; NSError *jsonError = nil; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle id jsonResult = [NSJSONSerialization reuseIdentifier:CellIdentifier]; JSONObjectWithData:responseData } options:0 error:&jsonError]; // Configure the cell... if (jsonResult != nil) { ACAccount *account = [self.accounts objectAtIndex:[indexPath row]]; self.timeline = jsonResult; cell.textLabel.text = account.username; dispatch_sync(dispatch_get_main_queue(), ^{ cell.detailTextLabel.text = account.accountDescription; [self.tableView reloadData]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; }); return cell; } } else { NSString *message = [NSString stringWithFormat:@"Could not parse timeline: %@", [jsonError localizedDescription]]; Listing 3 [[[UIAlertView alloc] initWithTitle:@"Error" NSURL *url = [NSURL URLWithString: message:message @"https://api.twitter.com/1/statuses/home_timeline.json"]; delegate:nil TWRequest *request = [[TWRequest alloc] cancelButtonTitle:@"OK" initWithURL:url otherButtonTitles:nil] show]; parameters:nil } requestMethod:TWRequestMethodGET]; } [request setAccount:self.account]; }];Mobile Technology 1 | 2012 www.mobile360.de
  6. 6. Twitter API | iOS 029nachlesen, wie man Twitter OAuth unter iOS 4.x imple- wird eine Fehlermeldung aus-mentieren musste. gegeben. Nachdem der Request auf diese Weise konfiguriert ist, Wie wir der Dokumenta-kann er ausgeführt werden. Dank Blocks [9] ist auch dies tion entnehmen können, istsehr viel einfacher und überschaubarer als zu Zeiten von nicht garantiert auf welchemSelektoren: die Methode (void)performRequestWith- Thread der Completion-Handler:(TWRequestHandler)handler der Klasse TW- Handler-Block der MethodeRequest führt den Request aus und erwartet einen (void)performRequestWithCompletion Handler, der nach Ausführung des Requests Handler:(TWRequestHandaufgerufen wird. Der Handler hat drei Parameter: ler)handler zurückkehrt. Da der Zugriff auf das UI aller- NSData *responseData enthält die Antwortdaten des dings auf jeden Fall im Main Requests Thread erfolgen muss, nutzen NSHTTPURLRequest *urlResponse erlaubt den wir Grand Central Dispatch Zugriff auf die Header-Infos der Antwort [11], um dies sicherzustellen. NSError *error schließlich enthält ggf. einen Fehler- Mit dispatch_sync weisen wir code GCD an, einen Block auf dem angegebenen Thread auszu-Listing 4 zeigt den vollständigen Aufruf. Im Falle ei- führen und auf die Ausfüh-nes erfolgreichen Request (der durch den HTTP-Code rung des Blocks zu warten.200 angezeigt wird [10]) kann die Antwort des Servers Mit dispatch_get_main_queueverarbeitet werden. Wie durch den Request-URL gefor- greifen wir auf den Maindert, wird die Antwort im JSON-Format zurückgelie- Thread zu. Der übergebene Abb. 3: Tweet eingeben und sendenfert. Mit iOS 5 hat Apple auch ein JSON-Framework Block initiiert das Neuladenbereitgestellt, sodass das Parsen von JSON-Daten nun der Tabelle auf unserer View.sehr bequem und ohne die Einbindung von Third Party Wie Listing 5 zu entnehmen ist, ist der Aufbau der Zellen-Libraries erfolgen kann, wie in Listing 4. Die Deseria- inhalte der Tabelle recht einfach gehalten – eine weiterelisierung der JSON-Anwort ergibt in unserem Fall ein Ausschmückung sei Ihrer eigenen Kreativität überlassen.NSArray von Tweets, die ihrerseits als NSDictionaryabgelegt sind. Dieses Array speichern wir in einer Ins- Tweets senden – easy!tanzvariablen, um später darauf zugreifen zu können. Nun mag es ja ganz interessant sein, seine eigenen TweetsDer Aufbau der von Twitter zurückgegebenen Daten ist und die seiner Follower in einer Liste zu sehen, aber letzt-der API-Dokumentation zu entnehmen. Anders als viel- endlich möchte man sich irgendwann einmal auch selbstleicht von vielen vermutet, führt iOS kein automatisches mitteilen und einen Tweet absenden. Das Senden vonMapping von JSON-Objekten auf Objective-C-Objekte Tweets kann mit dem neuen Twitter API auf zwei Artendurch. Sollten wider Erwarten die von Twitter zurück- erfolgen: mithilfe des so genannten Tweet Sheets, wie ingelieferten Daten keine gültigen JSON-Daten sein, so Abbildung  3 dargestellt (technisch realisiert durch die Klasse TWTweetComposeViewController), oder mithilfe einer selbst zu implementierenden View, die dann wiede- Listing 5 rum die Klasse TWRequest zum Senden des Tweets be- - (UITableViewCell *)tableView:(UITableView *)tableView nutzt. cellForRowAtIndexPath:(NSIndexPath *)indexPath Schauen wir uns zunächst die Verwendung der Klasse { TWTweetComposeViewController an: Mit ihr ist das static NSString *CellIdentifier = @"Cell"; Senden eines Tweets mit nicht mehr als drei Zeilen Code zu erledigen. Wie jeder andere ViewController auch wird UITableViewCell *cell = [tableView der TWTweetComposeViewController mittels [[TW- dequeueReusableCellWithIdentifier:CellIdentifier]; TweetComposeViewController alloc] init] angelegt. Mit if (cell == nil) { [self presentModalViewController:tweetComposeView cell = [[UITableViewCell alloc] Controller animated:YES] wird er dann dargestellt und initWithStyle:UITableViewCellStyleSubtitle der Benutzer kann seinen Tweet eingeben und absenden. reuseIdentifier:CellIdentifier]; Der Text kann über die Methode setInitialText vor der } Anzeige des Tweet Sheets vorbelegt werden. Nach Anzei- id tweet = [self.timeline objectAtIndex:[indexPath row]]; ge des Tweet Sheets kann der Text nur noch durch den cell.textLabel.text = [tweet objectForKey:@"text"]; Benutzer verändert werden, um eine Manipulation durch cell.detailTextLabel.text = [tweet valueForKeyPath:@"user.name"]; die App zu unterbinden. Bilder können über die Methode return cell; addImage hinzugefügt und mittels removeAllImages wie- } der entfernt werden. Gleiches gilt für URLs, hier sind die Methoden addUrl und removeAllUrls zu verwenden. Undwww.mobile360.de 1 | 2012 Mobile Technology
  7. 7. 030 iOS | Twitter API das war’s eigentlich auch schon. Um das Tweet Sheet nach nutzer mit mehreren Accounts vernünftig unterstützen Absenden des Tweets oder im Falle eines Abbruchs durch will), kann ohne Weiteres ein eigenes UI für das Senden den Benutzer wieder auszublenden, sollte man allerdings von Tweets (und ggf. von Direct Messages) erstellen. In noch einen Completion Handler setzen (Listing 6). unserem Beispiel wird das Tweet Sheet durch die Klasse So verlockend einfach die Verwendung von TW- TweetComposeViewController ersetzt, das UI wurde mit- TweetComposeViewController auch sein mag, es gibt hilfe des Interface Builders erstellt. UI-technisch gibt es kei- einen entscheidenden Nachteil: Der zu verwendende ne Überraschungen. Das Absenden eines Tweets erfolgt, Twitter-Account kann nicht programmatisch gesetzt wenn der Benutzer den Send-Button drückt. Der Code werden. Der Benutzer kann zwar im UI des Tweet für das Senden eines Tweets ist nur unwesentlich länger Sheet zwischen den auf seinem Device eingerichteten als bei der Verwendung des Apple-eigenen Tweet Sheets. Accounts hin- und herschalten, allerdings ist dies nicht ausreichend, um versehentlich vom falschen Account gesendete Tweets zu verhindern. Listing 8 TWRequest *request = [[TWRequest alloc] Tweets senden – aber richtig! initWithURL:[NSURL URLWithString:@"http://api.twitter.com/1/users/ Wem das Tweet Sheet nicht gefällt oder wer aus ande- show.json"] ren Gründen ein anderes UI bevorzugt (z. B. weil er Be- parameters:[NSDictionary dictionaryWithObjectsAndKeys: account.username, @"screen_name", nil] Listing 6 requestMethod:TWRequestMethodGET]; TWTweetComposeViewController *tweetComposeViewController = [request performRequestWithHandler:^(NSData *responseData, [[TWTweetComposeViewController alloc] init]; NSHTTPURLResponse *urlResponse, [tweetComposeViewController setCompletionHandler: NSError *error) { (TWTweetComposeViewControllerResult result) if ([urlResponse statusCode] == 200) { { dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissViewControllerAnimated:YES completion:nil]; NSError *error; }]; id userInfo = [NSJSONSerialization JSONObjectWithData:responseData [self presentModalViewController:tweetComposeViewController animated:YES]; 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] Listing 9 initWithURL: TWRequest *fetchUserImageRequest = [[TWRequest alloc] [NSURL URLWithString:@"https://api.twitter.com/1/statuses/update.json"] initWithURL:[NSURL parameters: URLWithString:[NSString [NSDictionary dictionaryWithObjectsAndKeys:status, @"status", nil] stringWithFormat:@"http://api.twitter.com/1/users/ requestMethod:TWRequestMethodPOST]; profile_image/%@", sendTweet.account = self.account; account.username]] [sendTweet performRequestWithHandler: parameters:nil ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) requestMethod:TWRequestMethodGET]; { [fetchUserImageRequest performRequestWithHandler:^(NSData if ([urlResponse statusCode] == 200) { *responseData, dispatch_sync(dispatch_get_main_queue(), ^{ NSHTTPURLResponse *urlResponse, [self.tweetComposeDelegate NSError *error) { tweetComposeViewController:self if ([urlResponse statusCode] == 200) { didFinishWithResult:TweetComposeResultSent]; UIImage *image = [UIImage imageWithData:responseData]; }); dispatch_sync(dispatch_get_main_queue(), ^{ } cell.imageView.image = image; else { [cell setNeedsLayout]; NSLog(@"Problem sending tweet: %@", error); }); } } }]; }]; }Mobile Technology 1 | 2012 www.mobile360.de
  8. 8. Twitter API | iOS 031Das Vorgehen dürfte mittlerweile bekannt vorkommen: ein Neuladen der Zelle. Sollte die Zelle in der Zwischen-Zunächst wird ein TWRequest mittels des passenden URL zeit recycelt und mit neuem Inhalt gefüllt worden sein, istkonfiguriert, mit dem aktuellen Account autorisiert und dies nicht weiter tragisch, da wir beim Neuladen der Zellemittels performWithRequestHandler abgeschickt. Nach die Inhalte ja aus dem Cache beziehen. Dieser Vorgang isterfolgreichem Absenden wird der View Controller im UI in Listing 10 exemplarisch dargestellt.Thread wieder ausgeblendet, wie in Listing 7 dargestellt. FazitZusatzinformationen zu einem Account ermitteln iOS 5 bringt mit den Accounts- und Twitter-FrameworksWie bereits erwähnt, liefert das Accounts-Framework sowie der neuen Unterstützung für JSON-Serialisierungnur einige wenige Informationen zu einem gegebenen Ac- einige Erleichterungen für Entwickler mit sich, die einecount. Weitere Informationen müssen explizit ermittelt Integration von Twitter in eigene Anwendungen im Ge-werden. Twitter stellt hierzu die beiden REST Endpoints gensatz zu iOS 4 deutlich vereinfachen. Je nach Bedarfusers/show [12] und users/profile_image/:screen_name und Anwendungsfall kann jeder die Tiefe der benötig-zur Verfügung. Der Zugriff auf diese Endpoints erfolgt ten Integration wählen: von der einfachen Verwendungin Listing 8 und 9 nach dem nunmehr bekannten Sche- des neuen Tweet Sheets zum Tweeten von Texten, Linksma. oder Bildern bis hin zur tiefen Integration mit dem REST- Dem aufmerksamen Leser wird nicht entgangen sein, basierten Twitter API. Weitergehende Informationen zurdass der Code in Listing 8 und 9 ein Problem birgt: Der Integration von Twitter in iOS 5, die in diesem ArtikelZugriff auf die Tabellenzelle innerhalb des dispatch_sync- nicht abgedeckt wurden, gibt es unter [13].Blocks erfolgt eventuell zu einem Zeitpunkt, der nach demRecycling der Tabellenzelle liegt. Es würde also die falscheZelle verändert. Um dies zu verhindern, verwenden wirdie Klasse NSCache, um die benötigten Informationenzu cachen. Sind die benötigten Informationen bereits imCache, können wir sie direkt anzeigen. Anderenfalls ladenwir sie asynchron, speichern sie im Cache und erzwingen 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:// Listing 10 www.peterfriese.de und twittert unter @peterfriese. UIImage *image = [_imageCache objectForKey:account.username]; if (image) { cell.imageView.image = image; } Links & Literatur else { TWRequest *fetchUserImageRequest = [[TWRequest alloc] [1] https://dev.twitter.com/docs/api initWithURL:[NSURL [2] https://dev.twitter.com/docs/auth/oauth URLWithString:[NSString [3] http://github.com/peterfriese/TwitterClient stringWithFormat:@"http://api.twitter.com/1/users/ [4] http://www.raywenderlich.com/1797/how-to-create-a-simple-iphone- profile_image/%@", app-tutorial-part-1 account.username]] [5] http://developer.apple.com/library/ios/#documentation/Accounts/ parameters:nil Reference/AccountsFrameworkRef/_index.html requestMethod:TWRequestMethodGET]; [6] http://dev.twitter.com/docs/api/1/get/statuses/home_timeline [fetchUserImageRequest performRequestWithHandler:^(NSData [7] http://useyourloaf.com/blog/2011/6/16/searching-twitter-with-ios. *responseData, html NSHTTPURLResponse *urlResponse, [8] http://www.icodeblog.com/2010/09/16/dealing-with-the-twitter- NSError *error) { oauth-apocalypse/ if ([urlResponse statusCode] == 200) { [9] https://developer.apple.com/library/mac/#featuredarticles/ UIImage *image = [UIImage imageWithData:responseData]; BlocksGCD/_index.html dispatch_sync(dispatch_get_main_queue(), ^{ [10] http://www.w3.org/Protocols/HTTP/HTRESP.html [_imageCache setObject:image forKey:account.username]; [self.tableView reloadRowsAtIndexPaths: [11] http://developer.apple.com/library/mac/#documentation/ [NSArray arrayWithObject:indexPath] Performance/Reference/GCD_libdispatch_Ref/Reference/reference. html withRowAnimation:NO]; }); [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/profile_ image/%3Ascreen_namewww.mobile360.de 1 | 2012 Mobile Technology
  9. 9. Impressum Vorschau auf die Ausgabe 2.2012 Verlag: Mit CRM-Anwendungen Geschäftsprozesse mobilisieren Software & Support Media GmbH Der Einsatz mobiler Endgeräte im Unternehmensbereich wird zunehmend wichtiger. Der Wert Anschrift der Redaktion: für das Unternehmen ist weitestgehend unbestritten. Dieser Artikel geht der alles entscheiden- Mobile Technology Software & Support Media GmbH den Frage auf den Grund: Wer profitiert von mobilen Prozessen? Geleitsstraße 14 Videos vom roten Bullen D-60599 Frankfurt am Main Tel. +49 (0) 69 630089-0 Gemeinsam mit Red Bull sollte Mitte 2010 für die bald startende Windows-Phone-Plattform Fax. +49 (0) 69 630089-89 ein mobiler Client gebaut werden, mit dem begeisterte Benutzer die Inhalte der Onlineplatt- redaktion@mobile360.de www.mobile360.de form immer und überall konsumieren können. Der Funktionsumfang dieser Applikation schien Redaktion: Thomas Wießeckel, Lukasz Konieczny, überschaubar, außerdem existierte zu diesem Zeitpunkt bereits eine App auf einer nicht näher Christoph Ebert zu nennenden, aber beliebten anderen Handybetriebssystemplattform, die es „einfach zu Chefin vom Dienst/Leitung Schlussredaktion: migrieren“ galt. Erleben Sie dieses Abenteuer aus erster Hand! Nicole Bechtel Schlussredaktion: Katharina Klassen, Frauke Pesch, Lisa Pychlau Leitung Grafik & Produktion: Jens Mainz Aus redaktionellen Gründen können sich einige Themen kurzfristig ändern. Layout, Titel: Tobias Dorn, Flora Feher, Karolina Gaspar, Laura Keßler, Dominique Kalbassi,Die nächste Ausgabe erscheint am 30. März 2012 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 UrbainczykQuerschau Anzeigenverkauf: Software & Support Media GmbH Patrik Baumann Ausgabe 2.2012 | www.phpmagazin.de Tel. +49 (0) 69 630089-0 Fax. +49 (0) 69 630089-89 pbaumann@mobile360.defoursquare API: Interessantes in der Nähe – mit PHP! Es gilt die Anzeigenpreisliste Mediadaten 2012Responsive Web Design: Was steckt hinter dem Hype? Pressevertrieb: DPV Network Tel.+49 (0) 40 378456261, www.mobile360.de www.dpv-network.de Druck: PVA LandauDritte Dimension – Das LG P920 Optimus 3D im Test: http://bit.ly/vwdgMR ISSN: 1619-795XTablet-PCs auf dem Vormarsch in Deutschland: http://bit.ly/tDlUUu Einzelverkaufspreis: Deutschland: € 7,80 Österreich: € 9,00 www.createordie.de Luxemburg € 9,20 Schweiz: sFr 15,80Die Tricks der Photoshop-Profis: http://bit.ly/uQFZt4Neuer Musikdienst rara.com im Anflug: http://bit.ly/tPfo6Y © 2012 Software & Support Media GmbH Alle Rechte vorbehalten. Nachdruck nur mit schriftlicher Genehmigung. Eine Haftung für die Richtigkeit der Veröffentlichungen kann trotz Prüfung durch die Redaktion vom Heraus- geber nicht übernommen werden. Honorierte Artikel Inserenten gehen in das Verfügungsrecht des Verlags über. Mit der Übergabe der Manuskripte und Abbildungen an den Verlag erteilt der Verfasser dem Herausgeber das Exklusivitätsrecht zur Veröffentlichung. Für unverlangt Android 360 2 JAX 2012 61 eingeschickte Manuskripte, Fotos und Abbildungen www.android360.de www.jax.de keine Gewähr. BASTA! Spring 2012 51 Mobile360.de 13 Alle im Mobile Technology verwendeten Markennamen www.basta.net www.mobile360.de sind in der Regel eingetragene Warenzeichen der entsprechenden Unternehmen oder Organisationen. dot.NET Magazin 79 MobileTech Conference 2012 37 www.dotnet-magazin.de www.mobiletech.de Entwickler Akademie 23, 57, 85 Mobile Technology Magazin 19 www.entwickler-akademie.de mobile360.de/MobileTechnology Entwickler Magazin 67 Neue DEUTSCHE KONGRESS GmbH 69  www.entwickler-magazin.de www.deutsche-kongress.de entwickler.press 35, 95 OPITZ CONSULTING GmbH 17 www.entwickler-press.de www.opitz-consulting.de Galileo Press GmbH 21  PHP Magazin 27 www.galileo-press.de www.phpmagazin.de inovex GmbH  15 Telefónica O2 Germany GmbH & Co. OHG 100 www.inovex.de www.o2.com Java Magazin 73 webinale 2012 99 www.javamagazin.de www.webinale.de

×