Twitter/Facebookのアカウントで認証して、アプリからタイムライン/フィードに投稿する[#5]〜Twitterアカウントでの認証〜
基本的な設定
//ParseとFacebookのSDKをimport #import <Parse/Parse.h> #import <FacebookSDK/FacebookSDK.h> //アプリ起動時の設定 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ //Parse初期設定 [Parse setApplicationId:@"ParseのアプリケーションID" clientKey:@"Parseのクライアントキー"]; [PFUser enableAutomaticUser]; PFACL *defaultACL = [PFACL ACL]; [PFACL setDefaultACL:defaultACL withAccessForCurrentUser:YES]; // Facebook [PFFacebookUtils initializeFacebook]; //Twitter [PFTwitterUtils initializeWithConsumerKey:@"twitterのConsumerKey" consumerSecret:@"twitterのconsumerSecret"]; return YES; } - (void)applicationDidBecomeActive:(UIApplication *)application { //この行を追加 [FBAppCall handleDidBecomeActiveWithSession:[PFFacebookUtils session]]; } //このメソッドを追加 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication withSession:[PFFacebookUtils session]]; }
基本的な設定をAppDelegateで行います。
Facebookの固有情報はここではなくてinfo.plistで設定します。
FacebookAppID
という項目を作成し、ここにFacebookのアプリケーションIDを設定。
FacebookDisplayName
という項目を作成し、ここにDisplay Nameを設定。
あとはURLスキームの項目を作成し上記のアプリケーションIDの先頭にfbをつけたモノを設定します。(例:アプリケーションIDが1234567890の場合fb1234567890をセット)
Twitter認証
//認証を行うviewControllerで以下をインポート #import <Parse/Parse.h> #import <FacebookSDK/FacebookSDK.h> #import <AFNetworking/AFNetworking.h> -(void)twitter{ [PFTwitterUtils logInWithBlock:^(PFUser *user, NSError *error) { if (!user) { if (!error) { NSLog(@"Twitter ログインをユーザーがキャンセル"); } else { NSLog(@"Twitter ログイン中にエラーが発生: %@", error); } } else if (user.isNew) { NSLog(@"Twitter サインアップ & ログイン完了!"); } else { NSLog(@"Twitter ログイン完了!"); } NSLog(@"sessionToken=%@",user.sessionToken); NSLog(@"isNew=%d",user.isNew); NSLog(@"username=%@",user.username); }]; }
サインアップおよびログインは上記のような形で行います。
user.isNew
の値が1なら新規登録扱いになっています。
user.sessionToken
でトークンが取得できます。
Twitter各種情報取得
認証が完了したので、APIを叩いて(APIにアクセスして)各種情報を取得してみましょう。
//スクリーンネーム取得用 -(void)info{ // AFHTTPRequestOperationManagerの定義 AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSString* url = @"https://api.twitter.com/1.1/account/settings.json"; //NSMutableURLRequestにメソッド(GET)、URLを設定 NSMutableURLRequest *infoRequest = [manager.requestSerializer requestWithMethod:@"GET" URLString:url parameters:nil error:nil]; //認証 [[PFTwitterUtils twitter] signRequest:infoRequest]; //送信! AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:infoRequest success:^(AFHTTPRequestOperation* operation, id responseObject){ NSLog(@"success!"); //いろいろな値が取れているのでここで確認してみる NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil]; NSLog(@"dict=%@",dict); //いま、ほしい値はscreen_name NSLog(@"screenName=%@",dict[@"screen_name"]); }failure:^(AFHTTPRequestOperation* operation, NSError* error){ NSLog(@"operation=%@",operation); NSLog(@"eror=%@",error); }]; [manager.operationQueue addOperation:operation]; }
ここで得られたscreen nameを使って、以下のAPIを叩いてみましょう。
//ユーザーネームとかアイコンURLとか取得 -(void)lookup{ // AFHTTPRequestOperationManagerの定義 AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSString* url = @"https://api.twitter.com/1.1/users/lookup.json"; //SCREEN_NAMEにはhttps://api.twitter.com/1.1/account/settings.jsonで取得したscreen nameを代入する NSMutableDictionary* param = @{@"screen_name":SCREEN_NAME}.mutableCopy; //NSMutableURLRequestにメソッド(POST)、URL、パラメータを設定 NSMutableURLRequest *lookupRequest = [manager.requestSerializer requestWithMethod:@"POST" URLString:url parameters:param error:nil]; //認証 [[PFTwitterUtils twitter] signRequest:lookupRequest]; //送信! AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:lookupRequest success:^(AFHTTPRequestOperation* operation, id responseObject){ NSLog(@"success!"); //いろいろな値が取れているのでここで確認してみる NSArray* array = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil]; NSLog(@"array=%@",array); //ユーザーネーム NSLog(@"name=%@",array[0][@"name"]); //アイコン(小)URL NSLog(@"imageURL=%@",array[0][@"profile_image_url"]); //アイコン(大)URL NSLog(@"imageURL=%@",[array[0][@"profile_image_url"] stringByReplacingOccurrencesOfString:@"_normal" withString:@""]); }failure:^(AFHTTPRequestOperation* operation, NSError* error){ NSLog(@"operation=%@",operation); NSLog(@"eror=%@",error); }]; [manager.operationQueue addOperation:operation]; }
この出力はarray形式になっていますが、これはscreen name
をコンマ区切りで100個まで指定できるため、このようなかたちになっていると思います。
次回はfacebookアカウントでの認証。