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