iPhoneでOAuthとtwitpicへの投稿を行う

OAuthは以前にandroidではやったことがあったのですが、

Iphoneでは作ったことが無かったので、

実装してみました。

OAuth認証は、

http://d.hatena.ne.jp/nakamura001/20100519/1274287901

のページの事を行うのみでした。(非常に参考になりました!)

Twitter-OAuth-iPhoneが強力すぎですね・・。

それに加え、twitterアプリでは良くある、

twitpicへの画像の投稿を出来るようにしようと思いました。

(実際には、twitpicのapiへ画像を投げて、返ってきたアドレスと、

メッセージを合わせて投稿(update)する、という流れになりますね。)

これも、調べるとGSTwitPicEngineというライブラリがあり、

http://github.com/Gurpartap/GSTwitPicEngine/blob/master/README.md

に書いてある、

・ASIHTTPRequest

・yajl & yajl-objc

・OARequestHeader

(※あと、既存のフレームワークにある「libz.dylib」も入れる必要がありました。)

などを入れた上、自分の環境では、以下の2点をさらに書き換える必要がありました。

■1

OARequestHeader.hで"OAToken.h"

のインポートをしているのですが、

関数「parameters」が、ライブラリ「Twitter-OAuth-iPhone」の方で既にリンクしている

OAToken.hに含まれておらず、エラーになってしまい、

TWITPIC_API_VERSIONを1にしないと動作の確認が出来ませんでした。

(OAToken.hの過去のバージョンにはあったのかもしません・・。)

version1はOAuth、version2はOAuth Echoでやり取りするようになっており、

1は互換性の理由で残されているだけなので(いつ廃止されるとは書いていませんが)、

今はこれで良いとしても、いつかは2に変更する必要がありますね・・。

■2

OAuthTwitterDemoViewController.m

の、viewDidAppearに、処理を書いていくのですが、

- (void) viewDidAppear: (BOOL)animated {

if (_engine) return;

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];

_engine.consumerKey = kOAuthConsumerKey;

_engine.consumerSecret = kOAuthConsumerSecret;

UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

if (controller)

[self presentModalViewController: controller animated: YES];

else {

//[_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];

self.twitpicEngine = (GSTwitPicEngine *)[GSTwitPicEngine twitpicEngineWithDelegate:self];

OAToken *token = [[[OAToken alloc] initWithKey:_engine._accessToken.key secret:_engine._accessToken.secret] autorelease];

[twitpicEngine setAccessToken:token];

[twitpicEngine uploadPicture:[UIImage imageNamed:@"test.png"] withMessage:@"Hello world!"];

}

}

の様にしました。

プログラム内の、「_engine」(SA_OAuthTwitterEngine型)の中の、

TwitterへOAuthして返ってきて格納されている、keyとsecretを参照したかったので、

OAToken *_accessToken; プロパティを、

@private指定ではなく、外部から参照出来るように書き換えました。

で、

「_engine._accessToken.key」

「_engine._accessToken.secret」

というようにアクセスし、「OAToken *token」を作ってます。

上記で、あとはセットしていたdelegate

- (void)twitpicDidFinishUpload:(NSDictionary *)response

- (void)twitpicDidFailUpload:(NSDictionary *)error

に、正常に値が返ってくることと、

返ってきた値でちゃんと画像が上がっていること

http://twitpic.com/2jostm

が確認できました。