Сегодня я собираюсь немного отдохнуть от написания статьи об Орни, чтобы обсудить API-интерфейсы Apple для интеграции с Twitter , недавно представленные в iOS 5 SDK .
В частности, мы собираемся охватить платформу Twitter (развитие NSHTTPRequest
), платформу учетных записей (центральную платформу и демон для хранения и управления учетными данными) и кратко коснемся NSJSONSerialization
, ранее частной компании Apple (и теперь публично) реализация парсера JSON-to-Foundation-Object (он также работает наоборот).
истоки
Я предполагаю, что вы прочитали наши предыдущие уроки iOS и знаете, как начать новый проект. Ситуация немного отличается в новой версии XCode, но не настолько отличается, что предыдущие инструкции слишком сильно устарели. Создайте новый проект, используя следующие изображения для подсказок.
Для тех, у кого нет изображений, мы используем шаблон приложения Single View Application , добавляя префикс класса «TWAPIExample», семейство устройств «Universal», и все три флажка отмечены, потому что мы используем раскадровку , автоматический подсчет ссылок и хотим Включить юнит-тесты .
Разреженная документация
На момент написания документа документация по некоторым из этих фреймворков еще находилась в начальной стадии. Я приложил все усилия, чтобы собрать воедино все из документации API и представить здесь целостный обзор. Однако вам следует обязательно ознакомиться с документацией Apple, прежде чем использовать какой-либо из этого кода (поскольку он мог измениться к моменту прочтения этого документа).
Формирование связного запроса
Для начала, мы сделаем простой запрос, чтобы получить некоторые результаты от публичного Firehose в Twitter. Это не требует аутентификации. Мы собираемся взять один публичный твит и UILabel
его в UILabel
на экране при загрузке приложения. Ничего фантастического.
Добавление фреймворка
Прежде чем мы сможем использовать класс TWRequest
, нам нужно добавить Framework в наш проект. Если вы не знакомы с Frameworks, это дополнительные разделы iOS API, которые ваше приложение может включать во время компиляции. Добавление Framework позволяет Xcode знать, что вы хотите использовать эти функции в своем приложении.
Выберите свой проект и прокрутите вниз до раздела « Связанные фреймворки и библиотеки » (под заголовком « Сводка» ). Нажмите стрелку «плюс» и прокрутите вниз, пока не найдете «Twitter.framework». Добавьте это. (На момент написания я обнаружил, что поле для ввода текста в верхней части этого списка не работает. YMMV; прокручивайте вручную, если сомневаетесь).
Указание URL
Первое, что нам нужно сделать, это указать URL, по которому мы собираемся нажать, чтобы получить данные. Мы предоставили отличную документацию по API, например, полный список ресурсов API REST для Twitter . Мы собираемся использовать REST API для этого приложения. Также предлагается API потокового вещания Twitter для крупномасштабного, почти реального времени доступа к объемным данным Twitter, выходящим далеко за рамки того, чего мы хотим достичь в этом примере.
Документация Apple по TWRequest
самом деле не говорит, какую форму он ожидает получить по URL, но, как я подозревал и обнаружил экспериментально, он хочет получить полный URL к API Twitter, а также путь, указанный в документации. В этом случае URL-адрес, который мы хотим:
https://api.twitter.com/1/statuses/public_timeline.json
Указание параметров
Объект TWRequest
позволяет нам указывать необязательные параметры, возможные значения, как описано в документации по API Twitter. Мы закодируем их как объект Foundation Dictionary (пары ключ-значение), указав, что мы хотим, чтобы возвращался только один твит. Код для этого выглядит следующим образом:
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"count", nil];
Добавление объекта UILabel
В последней версии Xcode у нас теперь есть доступ к двум раскадровкам .
Раскадровка заменяет предыдущий набор файлов NIB, представленных в проекте iOS. Теперь все Views
отображаются на одной раскадровке и присоединяются к соответствующим ViewControllers
. Вы можете намного легче почувствовать, как ваше приложение висит вместе на раскадровке , хотя оно может стать более загроможденным.
Нажмите раскадровку для вашего пользовательского интерфейса iPhone ( MainStoryboard_iPhone.storyboard
) и выберите View
. Перетащите Label
в центр представления, выберите Label
и перейдите к ее свойствам. Пролистайте следующие три скриншота, и мы встретимся внизу, чтобы изменить свойства.
Дайте View
тег (я использовал «1» в этом примере, просто целое число и ничего особенного). Я решил выровнять текст по центру с помощью элемента управления «Выравнивание» и увеличил количество строк до 5 (позволяя метке расширяться до 5 строк вместо усечения текста).
Затем перейдите на вкладку «View Properties» для вашей Label
. Вы захотите изменить размер Label
чтобы он был красивым и большим, чтобы он мог отображать весь твит. Возьмите края и разверните их, чтобы заполнить доступное пространство. Вы также захотите сделать его многострочным, поэтому в поле « Линии» (см. Скриншоты выше) увеличьте число до 3 или 4. Повторите вышеуказанные шаги для раскадровки iPad, следя за тем, чтобы использовать тот же тег. !
Создание объекта TWRequest
Мы добавим сообщение getTweet
к нашему объекту ViewController
. Во-первых, нам нужно добавить заголовки API-интерфейса Twitter в ViewController
заголовка нашего ViewController
TWAPIExampleViewController.h
около строки 10. Мы определим функции и методы, которые нам нужны, в заголовке, пока мы здесь, около строки 13.
#import <UIKit/UIKit.h> #import <Twitter/Twitter.h> @interface TweetAMaticViewController : UIViewController @property (nonatomic, retain) UILabel *tweetLabel; -(void)getTweet; @end
Мы будем использовать свойство tweetLabel
в качестве дескриптора нашей UILabel
в View
, поэтому мы можем легко ссылаться на него по желанию. Мы определили @property
, поэтому, конечно, нам нужно @synthesize
его в TWAPIExampleViewController.m
в начале нашей реализации:
@implementation TWAPIExampleViewController @synthesize tweetLabel; - (void)didReceiveMemoryWarning {
Теперь давайте определим функцию, которую мы будем использовать для получения твита, непосредственно перед @end
нашей реализации в TWAPIExampleViewController.m
.
#pragma mark - Twitter Interactions -(void)getTweet { // Specify the URL and parameters NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1/statuses/public_timeline.json"]; NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"count", nil]; // Create the TweetRequest object TWRequest *tweetRequest = [[TWRequest alloc] initWithURL:url parameters:parameters requestMethod:TWRequestMethodGET]; [tweetRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { // Request completed and we have data // Output it! NSError *jsonError = nil; id timelineData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&jsonError]; if(timelineData == NULL) { // There was an error changing the data to a Foundation Object, // so we'll output a bunch of debug information. NSString *myString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSLog(@"nnConversion to object failed."); NSLog(@"HTTP Response code: %d", [urlResponse statusCode]); NSLog(@"Output from server: %@", myString); NSLog(@"JSON Error: %@nn", [jsonError localizedDescription]); abort(); // TODO: Show a graceful error message here } NSDictionary *timelineDict = (NSDictionary*) timelineData; NSLog(@"nnConversion succeeded!"); NSLog(@"%@nn", timelineDict); self.tweetLabel.text = [[(NSArray*)timelineDict objectAtIndex:0] objectForKey:@"text"]; }]; }
Фух, занят функция! Возможно, мы могли бы существенно реорганизовать это, разложив его и перенеся много функций в другой класс, но на данный момент мы оставим это как есть. Считайте это рефакторингом упражнение для читателя, домашнее задание, если хотите.
NSLog()
выведет информацию на консоль, которую вы можете просмотреть с помощью Console.App. Это довольно глупый способ получить информацию из вашего приложения (вам гораздо удобнее работать с отладчиком), но это простой способ начать работу и диагностировать простые проблемы (у отладчика иногда возникают проблемы с большими строками и отображением сложных данные.)
Мы используем блок после performRequestWithHandler
для обработки ответа от сервера. Блок является реализацией Closure в Objective-C 2.0, и его объяснение выходит за рамки данной статьи, но это удобный способ инкапсулировать простой блок кода без необходимости заключать его в функцию для себя (и должен быть знакомый любому разработчику Javascript в комнате).
Наконец, мы устанавливаем текстовый атрибут self.tweetLabel
… о, но у нас пока нет дескриптора, не так ли?
Обработка и отображение ответа
Нам нужно захватить нашу Label
, а также вызвать наше сообщение getTweet
. Мы сделаем это в сообщении ViewController
нашего ViewController
, которое определяет действия, которые необходимо предпринять после загрузки View
из файла NIB.
- (void)viewDidLoad { [super viewDidLoad]; self.tweetLabel = (UILabel*)[self.view viewWithTag:1]; [self getTweet]; }
Помните, как мы ранее установили тег на нашей Label
в View
? Теперь мы используем этот тег, чтобы ссылаться на этот компонент View
и использовать его, чтобы мы могли изменить его.
Вывод
Если вы скомпилируете и запустите программу, она должна удалить один твит с публичного Firehose в Твиттере. Кто знает, откуда это будет или на каком языке !?
Теперь у вас должно быть достаточно знаний, чтобы отображать твит через API Twitter, включая некоторые из его метаданных, такие как имя автора, дату и время, это просто вопрос копирования того, что мы сделали с ярлыком. Если вы чувствуете себя особенно трудолюбивым, вы можете даже показать карту, используя информацию о местоположении, если в Твиттере она есть…