超今さらながら、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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。