Simple gadget life programming diary

Simple gadget life の中の人によるプログラミングメモ

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

InstagramAPI
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でInstagramAPIを叩いて私のInstagramの情報を取得。
取得した情報からプロフィールの写真のアドレスを抜き出し、非同期で画像を取得。
エラーハンドリングは考慮できてないです。

作成したプログラムはgithubに置きました。
https://github.com/jtaka1012/OAuthTest