Работает ли TWRequest для потокового API Twitter?

Я пытаюсь сделать основное приложение для iphone, которое показывает близлежащие твиты. Я использовал объект TWRequest для достижения этого с помощью API поиска в Твиттере. К сожалению, я на самом деле хотел бы отметить твиты на карте, используя их GPS-координаты, и поисковый API, похоже, не возвращает фактическое местоположение, в котором был создан твит, с большей точностью, чем название города.

Таким образом, я думаю, что мне нужно переключиться на потоковый API. Мне интересно, возможно ли продолжить использование объекта TWRequest в этом случае, или мне действительно нужно переключиться на использование NSURLConnection? Заранее спасибо!

Avtar

2 ответа

Решение

Да, вы можете использовать объект TWRequest. Создайте свой объект TWRequest, используя соответствующий URL-адрес и параметры из документа API Twitter, и установите для свойства TWRequest.account объект ACAccount для учетной записи Twitter.

Затем вы можете использовать метод signatureURLRequest в TWRequest, чтобы получить NSURLRequest, который можно использовать для создания асинхронного NSURLConnection с использованием connectionWithRequest: делегат:.

Как только это будет сделано, метод делегата connection:didReceiveData: будет вызываться при получении данных из Twitter. Обратите внимание, что каждый полученный объект NSData может содержать более одного объекта JSON. Вам нужно будет разделить их (разделенные "\r\n") перед преобразованием каждого из JSON с помощью NSJSONSerialization.

Мне потребовалось немного времени, чтобы все заработало, поэтому я решил опубликовать свой код для других. В моем случае я пытался получить твиты близко к определенному месту, так что вы увидите, что я использовал locations Параметр и структура местоположения я имел в области видимости. Вы можете добавить любые параметры в словарь параметров.

Также обратите внимание, что это пустяки, и вы захотите сделать что-то, например, уведомить пользователя о том, что учетная запись не была найдена, и позволить пользователю выбрать учетную запись Twitter, которую он хотел бы использовать, если существует несколько учетных записей.

Удачи!

//First, we need to obtain the account instance for the user's Twitter account
ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *twitterAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

//  Request permission from the user to access the available Twitter accounts
[store requestAccessToAccountsWithType:twitterAccountType
                 withCompletionHandler:^(BOOL granted, NSError *error) {
                     if (!granted) {
                         // The user rejected your request
                         NSLog(@"User rejected access to the account.");
                     }
                     else {
                         // Grab the available accounts
                         NSArray *twitterAccounts = [store accountsWithAccountType:twitterAccountType];
                         if ([twitterAccounts count] > 0) {
                             // Use the first account for simplicity
                             ACAccount *account = [twitterAccounts objectAtIndex:0];
                             NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
                             [params setObject:@"1" forKey:@"include_entities"];
                             [params setObject:location forKey:@"locations"];
                             [params setObject:@"true" forKey:@"stall_warnings"];
                             //set any other criteria to track
                             //params setObject:@"words, to, track" forKey@"track"];

                             //  The endpoint that we wish to call
                             NSURL *url = [NSURL URLWithString:@"https://stream.twitter.com/1.1/statuses/filter.json"];

                             //  Build the request with our parameter
                             TWRequest *request = [[TWRequest alloc] initWithURL:url
                                                                      parameters:params
                                                                   requestMethod:TWRequestMethodPOST];

                             // Attach the account object to this request
                             [request setAccount:account];
                             NSURLRequest *signedReq = request.signedURLRequest;

                             // make the connection, ensuring that it is made on the main runloop
                             self.twitterConnection = [[NSURLConnection alloc] initWithRequest:signedReq delegate:self startImmediately: NO];
                             [self.twitterConnection scheduleInRunLoop:[NSRunLoop mainRunLoop]
                                                   forMode:NSDefaultRunLoopMode];
                             [self.twitterConnection start];

                         } // if ([twitterAccounts count] > 0)
                     } // if (granted) 
                 }];
Другие вопросы по тегам