iOS開発:iOS Twitter frameworkを使う
iOS Twitter frameworkを使って、Twitterの情報を取得する。
かなり簡単だった。まずは以下のサイトを読む。
- iOS Twitter framework | Twitter Developers
- API requests with TWRequest | Twitter Developers
- iOS 5でTwitterを使う方法(カスタムな方) – Debian GNU/Linux 3.1 on PowerMac G4
- ACAccountとACAccountStoreの関係 – 作戦:いろいろやろうぜ
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ボタンを押すと、お気に入りを取得してログに出力する。
余談だが、Twitterクライアントを作っている人が言うには、このiOS Twitter frameworkは地雷らしい。できないことが多々あるらしいので、本格的なTwitterクライアントでの使用には向かないとの事。