2014/01/14

Social.FrameworkとAccount.Frameworkを利用して、Twitterからタイムラインを取得する

超今さらながら、Social.FrameworkとAccount.Frameworkを使ってみました。

これらを利用すると、面倒なアカウント管理やOAuth周りのコードを書かなくてもよくなります。

今回は、Twitter公式ブログにあるコードがだいたい利用できました。

ただし、公式ブログのコードには次のような間違いがあります。

  • JSONデータを変換時にNSDictionaryにしているが、実際はトップレベル要素は配列なので、NSArrayにしなければいけない
  • fetchTimelineForUser:は引数でユーザ名を指定しているが、SLRequestにセットしているアカウントはアカウントストアの最後の要素決め打ちになっている

今回、欲しかったユーザのタイムラインはhome_timelineで取得できます。

注意点としては、APIの利用制限がわりと厳しいみたいで、例えば、home_timelineは15分に15回しが利用できません。

そのときのエラーコードは429 (Too Many Requests)になります。それ以外のエラーはエラーコードを参照してください。

サンプルコード

このコードでは、管理されているTwitterアカウントの最初のものを利用します。

- (void)fetchTimeline {
    ACAccountType* accountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    [self.accountStore requestAccessToAccountsWithType:accountType
                                           options:NULL
                                        completion:^(BOOL granted, NSError* error) {
         if (error) {
             NSLog(@"%@", error);
             return;
         }

         NSArray* accounts = [self.accountStore accountsWithAccountType:accountType];
         if (accounts.count == 0) return;

         NSURL* url = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/home_timeline.json"];
         NSDictionary* params = @{@"screen_name" : [accounts.firstObject username],
                                  @"count" : @"60" };

         SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                                 requestMethod:SLRequestMethodGET
                                                           URL:url
                                                    parameters:params];

         request.account = accounts.firstObject;
         [request performRequestWithHandler:^(NSData* responseData,
                                              NSHTTPURLResponse* urlResponse,
                                              NSError* error) {
             if (error) {
                 NSLog(@"%@, %@", urlResponse, error);
                 return;
             }

             if (200 <= urlResponse.statusCode && urlResponse.statusCode < 300) {
                 NSError* e = nil;
                 NSArray* jsonData = [NSJSONSerialization
                                      JSONObjectWithData:responseData
                                      options:NSJSONReadingAllowFragments error:&e];
                 if (e) {
                     NSLog(@"%@", e);
                     return;
                 }

                 if (jsonData.count > 0) {
                     NSLog(@"%@", jsonData);
                 }
             } else {
                 NSLog(@"%@", urlResponse);
             }
         }];
     }];
}

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。