ツイッターアプリを作ろう – 第2回。誰でもわかるiPhone開発講座。

みなさま、こんにちは!拡張現実ライフ@akio0911と申します。※詳しいプロフィールはこちら

ツイッターアプリを作ろう。誰でもわかるiPhone開発講座。第2回です。

第1回の記事はこちら
【プレゼント有】ツイッターアプリを作ろう。誰でもわかるiPhone開発講座。第1回。 – AppBank

今回は、TwitterのAPIを使って、タイムライン情報を取得します。

第2回の目次です。

  • Accountsフレームワークを追加する
  • Twitterアカウントへのアクセスの許可を求めるコードを追加する
  • Twitterアカウント情報にアクセスするコードを追加する
  • TwitterのAPIを呼び出すコードを追加する
  • TwitterのAPIから受け取ったデータを変換するコードを追加する

では、早速はじめましょう!

Accountsフレームワークを追加する

これから追加するコード内ではTwitterのアカウント情報にアクセスします。そのためにはAccounts.frameworkを追加する必要があります。

左サイドバーにある “TwitterApp” をクリックし、”TARGETS” の “TwitterApp” をクリックします。


“Build Phases” をクリックし、”Link Binary With Libraries” の左側にある三角形をクリックして開き、”+”ボタンをクリックします。


“Accounts.framework” をクリックして、右下の Add ボタンをクリックします。



これにより、Accounts.framework が追加されます。



Twitterアカウントへのアクセスの許可を求めるコードを追加する

“TimelineViewController.m” をクリックして開きます。



“TimelineViewController.m”の先頭の方、

#import 

のすぐ下あたりに、以下のコードを追加します。

#import 



そこから少し下の方にいって、

- (void)viewDidLoad

と書かれているところを見つけましょう。



viewDidLoad とは

viewDidLoad はメソッドです。なので、viewDidLoadメソッドと呼びます。
画面が表示されるタイミングで、このviewDidLoadメソッドが呼び出されます。
よって、画面が表示されるタイミングで行いたい処理は、このviewDidLoadメソッド内に記述する必要があります。

viewDidLoadメソッドに、以下のようなコードを追加します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    ACAccountStore *accountStore = [[ACAccountStore alloc] init]; // 追加
	ACAccountType *twitterAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // 追加
    
    [accountStore requestAccessToAccountsWithType:twitterAccountType  // 追加
                            withCompletionHandler:^(BOOL granted, NSError *error)  // 追加
     { // 追加
         if (!granted) { // 追加
             NSLog(@"ユーザーがアクセスを拒否しました。"); // 追加
         }else{ // 追加
             NSLog(@"ユーザーがアクセスを許可しました。"); // 追加
         } // 追加
     }]; // 追加
}



この状態でXcodeのRunボタンをクリックして、アプリを実行してみましょう。



シミュレータ内でアプリが起動し、アプリからTwitterアカウントへのアクセスを許可して良いかを聞かれますので、OKをクリックします。



Xcodeの右下にあるConsole領域に、”ユーザーがアクセスを許可しました。” というメッセージが表示されます。



NSLog とは

コード中でNSLogを呼び出すと、NSLogに渡した文字列がXcodeのConsole領域に表示されます。
コードの動作を調査したり、コード内のデータを調査する時などに使用します。

Twitterアカウント情報にアクセスするコードを追加する

Twitterアカウント情報にアクセスするコードを追加します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
	ACAccountType *twitterAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
    [accountStore requestAccessToAccountsWithType:twitterAccountType
                            withCompletionHandler:^(BOOL granted, NSError *error)
     {
         if (!granted) {
             NSLog(@"ユーザーがアクセスを拒否しました。");
         }else{
             NSArray *twitterAccounts = [accountStore accountsWithAccountType:twitterAccountType]; // 追加
             NSLog(@"twitterAccounts = %@", twitterAccounts); // 追加
             if ([twitterAccounts count] > 0) { // 追加
                 ACAccount *account = [twitterAccounts objectAtIndex:0]; // 追加
                 NSLog(@"account = %@", account); // 追加
             } // 追加
         }
     }];
}



コードを追加したら、XcodeのRunボタンをクリックして、アプリを実行します。

アプリを実行すると、Xcodeのウィンドウの右下にあるConsole領域に、twitterAccountsの内容とaccountの内容が表示されます。



accountsWithAccountType:メソッドとは

accountsWithAccountType:メソッドを呼び出すと、アカウント情報が格納された配列を取得することができます。
ここでは、アカウント情報が格納された配列の0番目に入っているアカウント情報を、変数accountに入れています。
(もっとしっかりと作るのであれば、アカウント選択画面などが必要になるでしょう)

TwitterのAPIを呼び出すコードを追加する

TwitterのAPIを呼び出すコードを追加します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
	ACAccountType *twitterAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
    [accountStore requestAccessToAccountsWithType:twitterAccountType
                            withCompletionHandler:^(BOOL granted, NSError *error)
     { 
         if (!granted) { 
             NSLog(@"ユーザーがアクセスを拒否しました。"); 
         }else{ 
             NSArray *twitterAccounts = [accountStore accountsWithAccountType:twitterAccountType]; 
             if ([twitterAccounts count] > 0) { 
                 ACAccount *account = [twitterAccounts objectAtIndex:0];
                 NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/home_timeline.json"];  // 追加
                 TWRequest *request = [[TWRequest alloc] initWithURL:url  // 追加
                                                          parameters:nil // 追加
                                                       requestMethod:TWRequestMethodGET]; // 追加
                 [request setAccount:account]; // 追加
                 [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) // 追加
                  { // 追加
                      if(!responseData){ // 追加
                          NSLog(@"%@", error); // 追加
                      }else{ // 追加
                          NSLog(@"responseData = %@", responseData); // 追加
                      } // 追加
                  }]; // 追加
             } 
         } 
     }];
}



コードを追加したら、XcodeのRunボタンをクリックして、アプリを実行します。

アプリを実行すると、Xcodeのウィンドウの右下にあるConsole領域に、responseDataの内容が表示されます。



TWRequestクラスとは

TWRequestクラスは、Twitter APIを呼び出すのに使用するクラスです。
ここではタイムラインの情報を取ってくるためのURLを指定しています。

performRequestWithHandler:メソッドとは

performRequestWithHandler:メソッドを呼び出すと、TwitterのAPIを呼び出すことができます。
APIから受け取ったデータはresponseDataに収められます。
また、エラーの時は詳細な情報がerrorに収められています。

TwitterのAPIから受け取ったデータを変換するコードを追加する

TwitterのAPIから受け取ったデータをJSON形式に変換するコードを追加します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
	ACAccountType *twitterAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
    [accountStore requestAccessToAccountsWithType:twitterAccountType
                            withCompletionHandler:^(BOOL granted, NSError *error)
     { 
         if (!granted) { 
             NSLog(@"ユーザーがアクセスを拒否しました。"); 
         }else{ 
             NSArray *twitterAccounts = [accountStore accountsWithAccountType:twitterAccountType]; 
             if ([twitterAccounts count] > 0) { 
                 ACAccount *account = [twitterAccounts objectAtIndex:0];
                 NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/home_timeline.json"];
                 TWRequest *request = [[TWRequest alloc] initWithURL:url
                                                          parameters:nil
                                                       requestMethod:TWRequestMethodGET];
                 [request setAccount:account];
                 [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
                  {
                      if(!responseData){
                          NSLog(@"%@", error);
                      }else{
                          NSError* error; // 追加
                          NSArray *statuses = [NSJSONSerialization JSONObjectWithData:responseData // 追加
                                                                              options:NSJSONReadingMutableLeaves // 追加
                                                                                error:&error]; // 追加
                          if(statuses){ // 追加
                              NSLog(@"%@", statuses); // 追加
                          }else{ // 追加
                              NSLog(@"%@", error); // 追加
                          } // 追加
                      }
                  }];
             } 
         } 
     }];
}



コードを追加したら、XcodeのRunボタンをクリックして、アプリを実行します。

アプリを実行すると、Xcodeのウィンドウの右下にあるConsole領域に、statusesの内容が表示されます。



JSONObjectWithData:メソッドとは

JSONObjectWithData:メソッドを使うと、responseDataをJSON形式に変換することができます。
ここではTwitterのAPIから取得したタイムラインの情報を配列statusesに格納しています。

いかがでしたでしょうか?TwitterのAPIから、タイムラインの情報を取得することができました。

次回以降は、取得したタイムラインの情報を画面に表示するコードを追加していきます。お楽しみに!

書籍プレゼントもあり!第1回の記事はこちら。
【プレゼント有】ツイッターアプリを作ろう。誰でもわかるiPhone開発講座。第1回。 – AppBank

続きの記事はこちら。
【プレゼント有】ツイッターアプリを作ろう – 第3回。誰でもわかるiPhone開発講座。 – AppBank

参考になったらシェアお願いします!
▼新着記事やオススメ記事を投稿中!
Twitterをフォローする → AppBank(@appbank)
Facebookページをいいねする → AppBank
AppBankの事前登録サイト『ゲームコネクト
3Dコマンドバトルとフルボイスが可愛いオタクガールズRPG「ぱすてるメモリーズ」登場! 今なら事前登録するだけで、ガチャが引ける「想聖石」が手に入るぞ!

ぱすてるメモリーズ

AppBank 全力プッシュ!

オススメ