iPhoneアプリでOAuth2.0認証からInstagramのAPIを叩いて情報を取得するまで。
InstagramなのでOAuthは2.0。
Webへのアクセスは有名ドコロのライブラリを使用。
使用するライブラリ
OAuth2 : OAuth2Client
HTTP通信 : AFNetworking
画像の非同期ダウンロード : SDWebImage
各ライブラリの詳細については以下の参考情報を参照。
参考情報
OAuth2
Selection 9: iOSでOAuth2認証を行う(feedlyクライアントの作成)
HTTP通信、画像の非同期ダウンロード
DeNAのiOSエンジニア内で利用頻度の高いライブラリをランキング化してみました #iOS #DeNA|CodeIQ MAGAZINE
InstagramのAPI
Instagram APIの使い方まとめ(サンプルコード付)
プログラム起動前に実施すること
クライアントIDとクライアントシークレットを設定すること
AppDelegate.m //clientId static NSString * const kOauth2ClientClientId = @"xxx"; //クライアントIDを設定 //Client Secret static NSString * const kOauth2ClientClientSecret = @"xxx"; //クライアントシークレットを設定
少しつまづいた所
OAuth2Client
クライアントIDやクライアントシークレットをセットするメソッドが参考情報と異なります。
keyChainGroupというトークンの情報をキーチェーンに保存するときに一意に識別するためのキー情報を設定する必要があります。ここの例では"hoge"としています。
AppDelegate.m + (void)initialize { NSString *authUrl = [kOauth2ClientBaseUrl stringByAppendingString:kOauth2ClientAuthUrl]; NSString *tokenUrl = [kOauth2ClientBaseUrl stringByAppendingString:kOauth2ClientTokenUrl]; [[NXOAuth2AccountStore sharedStore] setClientID:kOauth2ClientClientId secret:kOauth2ClientClientSecret scope:[NSSet setWithObjects:kOauth2ClientScopeUrl, nil] authorizationURL:[NSURL URLWithString:authUrl] tokenURL:[NSURL URLWithString:tokenUrl] redirectURL:[NSURL URLWithString:kOauth2ClientRedirectUrl] keyChainGroup:@"hoge" forAccountType:kOauth2ClientAccountType]; }
AFNetworking
GETで情報を取得する際のパラメータへの設定方法。
NSDictionaryでパラメータ名をキーに、値をキーに対する情報として定義
作成した情報をアクセスメソッドのparametersにセットする
ViewController.m - (void)p_getUserProfile:(NXOAuth2Account *)account { //get user profile on feedly user NSLog(@"account info : %@", account); NSLog(@"accessToken=%@",account.accessToken.accessToken); // AFNetworkingライブラリ使用箇所 // AFHTTPRequestOperationManagerを利用して、InstagramからJSONデータを取得する AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //get profile NSDictionary *params = @{@"access_token":account.accessToken.accessToken}; [manager GET:@"https://api.instagram.com/v1/users/27069716/" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 通信に成功した場合の処理 NSLog(@"responseObject: %@", responseObject); NSString *url = responseObject[@"data"][@"profile_picture"]; NSURL *imageURL = [NSURL URLWithString:url]; // SDWebImage使用箇所 UIImage *placeholderImage = [UIImage imageNamed:nil]; [_imageView setImageWithURL:imageURL placeholderImage:placeholderImage]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // エラーの場合はエラーの内容をコンソールに出力する NSLog(@"Error: %@", error); }]; }
初期画面でSign Inボタン押下でアクセストークン取得。
Get InformationでInstagramのAPIを叩いて私のInstagramの情報を取得。
取得した情報からプロフィールの写真のアドレスを抜き出し、非同期で画像を取得。
エラーハンドリングは考慮できてないです。
作成したプログラムはgithubに置きました。
https://github.com/jtaka1012/OAuthTest