Twitterに画像をポストする事が出来るTwitpicというサービスがあるが、このTwitpicにiPhoneアプリから画像をアップロードする方法を以下に記載する。
まずTwitpicのAPIドキュメントを見ると、画像のアップロードはHTTPのPOSTを利用して出来ることが分かる。そこで、以前に紹介したCFNetwork APIのラッパーフレームワークASIHTTPRequestに、ASIFormDataRequestという便利なクラスがあるので、これを利用した方法を紹介したいと思う。
[事前準備]
1. ASIFormDataRequestクラスを使えるようにする
以下の記事内の[設定]に従いXCodeのプロジェクトを設定する。
2. XPathQueryを使えるようにする
TwitpicのAPIはレスポンスがXML形式のデータとなるため、今回はXMLをパースするためのライブラリXPathQueryを利用する。そこで、以下の記事内の[設定]に従いXCodeのプロジェクトを設定する。
以上で準備は終了である。
[実装方法]
今回はiPhoneアプリ内にバンドルした画像(test.jpg)をTwitpicにアップロードする方法を示す。具体的な実装は以下のような形になる。
#import "ASIFormDataRequest.h" #import "XPathQuery.h" - (void)uploadPhoto { NSURL *url = [NSURL URLWithString:@"http://twitpic.com/api/upload"]; ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease]; NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"]; NSData *twitpicImage = [NSData dataWithContentsOfFile:path]; // 送信メッセージに認証情報、画像データをセット [request setPostValue:@"tomute" forKey:@"username"]; [request setPostValue:@"mypassword" forKey:@"password"]; [request setData:twitpicImage forKey:@"media"]; // 画像のアップロード(同期処理) [request start]; // アップロード結果を確認 NSData *response = [request responseData]; NSArray *results = PerformXMLXPathQuery(response, @"/rsp/@stat"); if ([results count] != 0) { NSString *stat = [[results objectAtIndex:0] objectForKey:@"nodeContent"]; if ([stat isEqualToString:@"ok"]) { NSLog(@"%@", @"Succeeded in posting a photo!"); } else { NSLog(@"%@", @"Failed attempt to post a photo!"); } } }
また、Twitpicに画像を送信すると同時に、Twitterにもポストする事が可能なのだが、その場合には以下のように変更する。
- (void)uploadPhoto { //NSURL *url = [NSURL URLWithString:@"http://twitpic.com/api/upload"]; NSURL *url = [NSURL URLWithString:@"http://twitpic.com/api/uploadAndPost"]; ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease]; (snip) [request setPostValue:@"tomute" forKey:@"username"]; [request setPostValue:@"mypassword" forKey:@"password"]; [request setData:twitpicImage forKey:@"media"]; // 以下の行を追加してTwitterに投稿するメッセージを付加する [request setPostValue:@"This is a test to post an image to Twitter via TwitPic." forKey:@"message"]; (snip) }
[備考]
今回紹介した方法は画像のアップロードを同期処理で行うため、画像のアップロード中にアプリが固まってしまう。これを回避するためにはマルチスレッド化する必要があるのだが、その方法に関してはまた後日紹介したいと思う。
あと、投稿した画像をTwitpicでチェックしてみると、投稿元が"from api"と表示されていると思う。これを自分のアプリの名前に変更したい場合には、Twitpicのサポートチームにメールすれば良いようだ。詳しい情報は以下。
またimg.lyという写真共有サイトはTwitpicのAPIと完全互換のようなので(img.ly API Document)、上記方法がそのまま利用出来ると思われる(実際に試してはいない)。
[関連記事]