2013/02/20更新

[XCODE] LinkedInのAPIをiOSアプリから利用する

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
最近はSNSのAPIを利用するプログラムをiOSでいろいろと実装しています。
今日はその中で、LinkedInにAPI経由で記事を投稿する方法をブログに書きたいと思います。

画像


LinkedInのAPI

LinkedInとはビジネスパースン向け?のSNSで、情報をポストしたり人のフィードを読んだりしてコミュニケーションを取ることのできるSNSです。 ビジネス向けの情報が多い感じで、ビジネスパースン向けのSNSです。
そんなLinkedInへ外部アプリから投稿するために、 http://developer.linkedin.comには多くのAPIが用意されています。

今回はそのAPIの中から認証APIと投稿APIを使って、LinkedInにiPhoneアプリから投稿するための実装を行います。



LinkedInの認証APIを利用する

LinkedInの認証にはOAuth1.0が利用されています。
まずは、https://www.linkedin.com/secure/developerでLinkedInのAPIを利用するアプリケーションを登録して、ConsumerKeyとConsumerSecretを入手します。

そしてOAuth1.0認証のための実装を行います。
iOSでOAuth1.0認証を行う実装は、「[XCODE] iOSアプリでOAuth認証を行う、はてブAPIを利用する」にて紹介させて頂いておりますので、参照いただけると幸いです。gtm-oauthライブラリを利用した実装です。
LinkedInのAPIで投稿APIを用いたいので、上記リンク先実装の認証用URLとスコープには、以下のように指定します。
NSURL *requestURL = [NSURL URLWithString:@"https://api.linkedin.com/uas/oauth/requestToken"];
NSURL *accessURL = [NSURL URLWithString:@"https://api.linkedin.com/uas/oauth/accessToken"];
NSURL *authorizeURL = [NSURL URLWithString:@"https://www.linkedin.com/uas/oauth/authenticate"];
NSString *scope = @"rw_nus";



LinkedInへ投稿するAPIを利用する

続いて、LinkedInへの投稿APIの部分の実装です。
基本的な流れは、「APIに必要な情報をリクエストに設定する」 -> 「リクエストに認証情報を付与する」 -> 「送信する」という流れとなります。
// 未認証なら認証を行う。
if (![self isSignedIn]) {
  [self signIn];
  return;
}

// LinkedInへ投稿するリクエストを作成する。
NSURL *url = [NSURL URLWithString:@"http://api.linkedin.com/v1/people/~/shares"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
request.HTTPMethod = @"POST";
NSString *bodyString
  = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<share>"
  "<comment>{{:comment}}</comment>"
  "<content>"
  "<submitted-url>{{:url}}</submitted-url>"
  "</content>"
  "<visibility>"
  "<code>anyone</code>"
  "</visibility>"
  "</share>";

bodyString = [bodyString 
	stringByReplacingOccurrencesOfString:@"{{:comment}}" 
	withString:@"RestAPIのテスト投稿です"];
bodyString = [bodyString 
	stringByReplacingOccurrencesOfString:@"{{:url}}" 
	withString:@"http://www.yoheim.net/"];
[request setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];


// LinkedInでは下記ヘッダーを付与しないと、認証エラーとして返ってくる。
[request setValue:@"text/xml;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];  

// リクエストに認証情報を付与する。
[mAuth authorizeRequest:request];

// リクエストを送信する。
[NSURLConnection 
  sendAsynchronousRequest:request 
  queue:[[NSOperationQueue alloc] init] 
  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
  
  if (error) {
  // エラーが発生した場合には、エラー処理を行う。
  NSLog(@"error occured. reason = %@", error);
  NSLog(@"response code = %d", ((NSHTTPURLResponse *)response).statusCode);
  NSLog(@"response text = %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    if (error.code == -1012) {
	  // 認証エラーなので、再認証をする。
	  dispatch_async(dispatch_get_main_queue(), ^{
	    [self signIn];  
	  });
    }
  
  } else {
  // 処理成功
  NSLog(@"success!!");
  NSLog(@"responseData = %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
  }
}];
こんな感じでLinkedInへ投稿を行うことができます。



最後に

iOSでLinkedInのAPIを使った事例が少なくて、ちょっと大変。 特に、投稿APIのリクエストヘッダにContent-Typeを指定しないと認証エラーになる件は、問題を見つけるのに苦労しました。

今回のサンプルソースがどなたかの役に立てば良いなぁと思う今日この頃。
最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。