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
に、正常に値が返ってくることと、
返ってきた値でちゃんと画像が上がっていること
が確認できました。