RSSの再配信を受け取るiPhoneアプリを作る(1)

今回は溜めたRSSを再配信し、受け取るアプリケーションを作成します。
■完成予定イメージ
■サーバ側の作成
DBから記事を取得してjsonで返却するプログラムです。
ドキュメントルート(デフォルトでは/var/www/html/)に置いてください。
SQLはツイート数の多い順に抽出していますが、リクエストパラメータに応じて並び順や抽出日時のパターンを変えることができるようにしておくと便利です。
<?php $pdo = new PDO("mysql:dbname=rss", "user", "password"); $sql = "select feedno, url, title, twitter, facebook, hatena, updatedate from article order by twitter desc"; $array_row = array(); foreach ($pdo->query($sql) as $row) { $array_row[] = array( 'feedno' => $row['feedno'] ,'url' => $row['url'] ,'title' => $row['title'] 'twitter' => $row['twitter'] ,'facebook' => $row['facebook'] ,'hatena' => $row['hatena'] ,'updatedate' => $row['updatedate']; ) } header('Content-Type: application/json; charset=utf-8'); echo json_encode($array_row); ?>
■クライアント側の作成
クライアントはiPhoneアプリにします。
統合開発環境はXCodeです。2014年5月時点で最新の5.1.1を使用します。
■プロジェクト作成
XCodeを起動し、Fileメニューから「New」→「Project」で「Tabbed Application」を選択します。プロジェクト名は適当に付けてください。
プロジェクトが作成されるので、画面左のツリー(Project Navigator)から「Main.storyboard」を選択すると、ViewControllerが「FirstViewController」 と「SecondViewController」の2つがある状態になっていると思います。
今回は「FirstViewController」を使用してtwitterでのツイート順に記事を表示してみます。
画面右下のオブジェクトライブラリから、TableViewを選択し、FirstViewControllerにドラッグ&ドロップします。
同様にTableViewCellをTableViewにドラッグ&ドロップします。
TableViewCellに、タイトルやツイート数などを表示するラベルをはります。
■セル用のクラスの作成
Fileメニューから「New」→「File」で「Cocoa Touch」の「Objective-C class」を選択します。
クラス名の入力画面が表示されるので、クラス名はArticleTableViewCellとし、親クラスにはUITableViewCellを入力します。
■ArticleTableViewCellのひも付け
Main.storyboardでTableViewCellを選択し、画面右上「Attributes Inspector」のIdentifierに「Article」を入力します。(下図)
※ウィンドウが表示されていない場合は「View」メニューの「Utilities」→「Show Attributes Inspector」で表示されます
同様に、画面右上の「Identity Inspector」でCustom Classに「ArticleTableViewCell」を選択します。
※ウィンドウが表示されていない場合は「View」メニューの「Utilities」→「Show Identity Inspector」で表示されます
これでStoryboard上のTableViewCellと、ArticleTableViewCellが紐付けることができました。
■Delegateに指定
TableViewCを選択し、画面右上の「Connections Inspector」でdataSourceとdelegateにFirstViewControllerを指定します。(下図)
ざっくり言うと、delegate = TableViewのイベントを制御するクラス、dataSource = TableViewのデータを制御するクラス となります。
(詳細はAppleの開発者サイトで確認してください。)
■ArticleTableViewCellの実装
ArticleTableViewCell.h
#import <UIKit/UIKit.h> @interface ArticleTableViewCell : UITableViewCell{ IBOutlet UILabel *titleLabel; IBOutlet UILabel *feednameLabel; IBOutlet UILabel *updatedateLabel; IBOutlet UILabel *twitterLabel; } -(void)setLabel:(NSString *) title feedname:(NSString *)feedname updatedate:(NSString *)updatedate twitter:(NSString *)twitter; @end
ここでは
・ラベルに文字列を設定するメソッドの定義
・ラベルの定義
をしています。
ArticleTableViewCell.m
#import "ArticleTableViewCell.h" @implementation ArticleTableViewCell -(void)setLabel:(NSString *) title feedname:(NSString *)feedname updatedate:(NSString *)updatedate twitter:(NSString *)twitter{ feednameLabel.text = feedname; titleLabel.text = title; updatedateLabel.text = updatedate; twitterLabel.text = twitter; } @end
ラベルに文字列を設定するメソッドの実装をしています。
■FirstViewControllerの実装
FirstViewController.h
#import <UIKit/UIKit.h> #import "ArticleTableViewCell.h" @interface FirstViewController : UIViewController{ NSMutableArray *_objects; } @end
_objectsにTableViewに記事情報を保持するようにします。
FirstViewController.m
#import "FirstViewController.h" @interface FirstViewController () @end @implementation FirstViewController - (void)viewDidLoad { [super viewDidLoad]; // 記事を受け取る NSURL *url = [NSURL URLWithString:@"http://[ip-address]/rss.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSURLResponse *response = nil; NSError *error = nil; NSData *jsonData = [NSURLConnection sendSynchronousRequest : request returningResponse : &response error : &error]; // JSON のオブジェクトは NSDictionary に変換されている NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error]; _objects = [[NSMutableArray alloc] init]; for (NSDictionary *obj in dic){ [_objects addObject:obj]; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ArticleTableViewCell *article = [tableView dequeueReusableCellWithIdentifier:@"Article"]; NSDictionary *obj = _objects[indexPath.row]; [article setLabel:[obj objectForKey:@"title"] feedname:[obj objectForKey:@"feedname"] updatedate:[obj objectForKey:@"updatedate"] twitter:[obj objectForKey:@"twitter"]]; return article; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return _objects.count; } @end
viewDidLoad
・サーバから記事情報を取得し、_objectsに保持します。
cellForRowAtIndexPath
・IndexPathで指定された位置のセルを作成し、返却します。
numberOfRowsInSection
・セルの数を返却します。
■Main.storyboardとラベルのひも付け
FirstViewController.hに定義しているUILabelとStoryboardのラベルを紐付けます。
■動作確認
エミュレータで実行すると、記事を上手く表示することができました。
基本的な部分はできたので、次回はアプリを完成させます。