まいまいワークス

主にiPhoneアプリの開発で考えた事、調べた事、感じた事などを記していきます。

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をセット)

plist.png

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アカウントでの認証。


  1. イントロダクション
  2. Twitterのアプリ登録
  3. Facebookのアプリ登録
  4. Parseの登録と設定
  5. Twitterアカウントでの認証
  6. Twitterのタイムライン投稿
  7. Facebookアカウントでの認証
  8. Facebookのフィード投稿