OAuthConsumerの基本的な使い方を説明します。
OAuthConsumerの基本的な使い方
OAuthConsumerは公式のドキュメント類が少なく、使い方について書かれたドキュメントもUsingOAuthConsumerくらいしか見当たりません。残念ながらこのチュートリアルも若干説明が不十分な部分があったり、サンプルコードはメモリーリークしまくりのコードになっているので、参考程度にみてあとは実際にコードを読むか使ってみて使い方を覚えていくしかありません。
上記チュートリアルを参考に、メモリーリーク等の問題を直したプログラムは下記のような形になります。
#import "OAuthConsumer.h" ... // サービスからアプリ用に割り当てられたKeyとSecret NSString* consumerKey = @"12345"; NSString* consumerSecret = @"abcdef"; // API問い合わせにつかうクライアント単位のKeyとSecret NSString* tokenKey = nil; NSString* tokenSecret = nil; OAConsumer *consumer = [[[OAConsumer alloc] initWithKey:consumerKey secret:consumerSecret] autorelease]; OAToken* token = tokenKey ? [[[OAToken alloc] initWithKey:tokenKey secret:tokenSecret] autorelease] : nil; // リクエストを生成する OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] consumer:consumer token:token realm:nil signatureProvider:nil] autorelease]; // リクエストを実行する OADataFetcher* fetcher = [[[OADataFetcher alloc] init] autorelease]; [fetcher fetchDataWithRequest:request delegate:self didFinishSelector:@selector(requestTokenTicket:didFinishWithData:) didFailSelector:@selector(requestTokenTicket:didFailWithError:)];
リクエストの発行
OAuthでの認証にはアプリケーション単位で使用するConsumer key / secretとクライアント(ユーザ)単位で使用するAccess token key / secretがありますが、OAuthConsumerでもそれぞれを管理するOAConsumerクラスとOATokenクラスが用意されています。初回サーバーにアクセスする時など、まだTokenがないときはtokenなしでリクエストを生成できます。
リクエスト(OAMutableURLRequest)を生成したら、最終的にはOADataFetcherクラスを使ってサーバーと通信をします。
通信結果の取得
OADataFetcherクラスはデリゲートの機構を用いて結果を返してくれます。デリゲートメソッドは呼び出し時にセレクタを自分で指定する形になります。
- (void)requestTokenTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data { NSString *response = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; NSLog(@"Response: %@", response); } - (void)requestTokenTicket:(OAServiceTicket *)ticket didFailWithError:(NSError*)error { NSLog(@"Error: %@", error); }
改良
OAuthConsumer自体の使い方は基本的にはこんな感じなのですが、実際に使ってみるとこのままの形で使うのはなかなか使い勝手がよくないので、普段僕はブロック対応のラッパーを作って使っています。次のポストでそのラッパーについて説明します。
「Objective-CでOAuthその2」への1件のフィードバック