iOS Twitter frameworkを使って、Twitterの情報を取得する。

かなり簡単だった。まずは以下のサイトを読む。

iOSに設定されているアカウント情報を取得する。

“Linked Frameworks and Libraries”に、”Accounts.framework”を追加する。

[c]

self.accountStore = [[ACAccountStore alloc] init];

ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

[accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {

if(granted) {

// Get the list of Twitter accounts.

NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

if ([accountsArray count] > 0) {

self.twAccount = [accountsArray objectAtIndex:0];

accountLable.text = twAccount.username;

} else {

accountLable.text = [NSString stringWithString:@“Sorry.”];

}

}

}];

[/c]

OSにTwitterアカウントが登録されていないと、アカウントが取得できない。

Twitterの情報を取得する

“Linked Frameworks and Libraries”に、”Twitter.framework”を追加する。ここでは、お気に入りの情報を取得するようにした。

[c]

NSURL *url = [NSURL URLWithString:@“https://api.twitter.com/1/favorites.json"];

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];

[params setObject:@“eiKatou” forKey:@“screen_name”];

[params setObject:@“5” forKey:@“count”];

TWRequest *getFavReq = [[TWRequest alloc] initWithURL:url

parameters:params

requestMethod:TWRequestMethodGET];

[getFavReq setAccount:twAccount];

[getFavReq performRequestWithHandler:

^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

NSLog(@“HTTP response status: %i”, urlResponse.statusCode);

if (responseData) {

NSError *jsonError;

NSArray *timeline = [NSJSONSerialization JSONObjectWithData:responseData

options:NSJSONReadingMutableLeaves

error:&jsonError];

if (timeline) {

// NSLog(@“%@”, timeline);

for (NSDictionary *tweet in timeline) {

NSLog(@“tweet :%@“, tweet);

NSLog(@“tweet text :%@“, [tweet objectForKey:@“text”]);

NSLog(@“tweet created_at :%@“, [tweet objectForKey:@“created_at”]);

}

} else {

NSLog(@“%@”, jsonError);

}

}

}]

[/c]

Twitterの情報を取得するには、URLを作って、JSON形式の戻り値をパースすれば良い。NSJSONSerializationは、NSArrayとNSDictionaryでオブジェクトが返ってくる。汎用的で、使いやすいように思った。欲を言えば、GSON的なのが欲しい。

“TWRequest performRequestWithHandler:”で、EXC_BAD_ACCESSが出て困ってしまった。cocoa touch – Using blocks within blocks in Objective-C: EXC_BAD_ACCESS – Stack Overflowにあるように、ACAccountStoreの参照がなくなったことで、ACAccountも回収されてしまったことでエラーとなっていた。ACAccountStoreの参照を保持するようにしたら、エラーも出なくなった。

サンプル

他サイトのサンプルソースをコピペして作った物。GetAccountボタンを押すと、アカウントを取得する。GetFavoriteボタンを押すと、お気に入りを取得してログに出力する。

iOSTwitterSample1

余談だが、Twitterクライアントを作っている人が言うには、このiOS Twitter frameworkは地雷らしい。できないことが多々あるらしいので、本格的なTwitterクライアントでの使用には向かないとの事。