質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

【Objective-C】Facebook SDKを用いたログイン

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,595

score 36

質問を開いていただきありがとうございます。

Facebook SDKを使ったログインをアプリ内で実装しておりまして、シミュレータや自分の持っている実機でのテストはうまくいったのですが、他の実機でもテストしてみたところどうも上手くいかず、皆様のお知恵を借りられればと思い質問させていただきました。

【やりたいこと】
アプリ内でボタンをタップした際にFacebook認証を行い、得られたユーザー情報を使ってログイン処理をする。

【やったこと】
FacebookSDK.frameworkをプロジェクトに突っ込む

以下のコードを書く。

//AppDelegate.h
#import <FacebookSDK/FacebookSDK.h>

@property (strong, nonatomic) FBSession *session;
//AppDelegate.m - (BOOL)application:(UIApplication *)application             openURL:(NSURL *)url   sourceApplication:(NSString *)sourceApplication          annotation:(id)annotation {     // attempt to extract a token from the url     return [FBAppCall handleOpenURL:url                   sourceApplication:sourceApplication                         withSession:self.session]; } - (void)applicationDidBecomeActive:(UIApplication *)application {     [FBAppEvents activateApp];     [FBAppCall handleDidBecomeActiveWithSession:self.session]; } - (void)applicationWillTerminate:(UIApplication *)application {     [self.session close]; }

//ViewController.h
#import <FacebookSDK/FacebookSDK.h>

@interface ViewController : UIViewController<FBLoginViewDelegate>
//ViewController.m - (void)viewDidLoad {     [super viewDidLoad];   AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];         if (!appDelegate.session.isOpen) {             appDelegate.session = [[FBSession alloc] initWithPermissions:@[@"email"]];             if (appDelegate.session.state == FBSessionStateCreatedTokenLoaded) {                 [appDelegate.session openWithCompletionHandler:^(FBSession *session,                                                                  FBSessionState state,                                                                  NSError *error){                     [FBSession setActiveSession:session];                                      }];             }         } } - (void)login:(UIButton *)sender{     AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];     if (appDelegate.session.isOpen) {         // Facebookログアウト(sessionクリア)処理         [appDelegate.session closeAndClearTokenInformation];     } else {         if (appDelegate.session.state != FBSessionStateCreated) {             appDelegate.session = [[FBSession alloc] initWithPermissions:@[@"email"]];         }         [appDelegate.session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {             if (status == FBSessionStateOpen) {             // 成功時                 [FBSession setActiveSession:session];                                  FBRequestConnection *requestConnection = [[FBRequestConnection alloc] init];                 requestConnection.errorBehavior = FBRequestConnectionErrorBehaviorRetry    | FBRequestConnectionErrorBehaviorReconnectSession;                                  FBRequest *request = [FBRequest requestForGraphPath:@"me"];                 [requestConnection addRequest:request completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {                     if (!error) {                                               /*ログイン処理等*/                                                 }                 }];                 [requestConnection start];             }         }];     } }


【結果】
ボタンタップ後、一瞬Facebookに飛ぶものの認証画面(「以下の許可を求めています」)は表示されず、すぐにアプリに戻る。
アプリ側では特にエラーが吐き出されるわけでもなく、ただ /*ログイン処理等*/ に記述した処理がなされていない(要はFacebookに飛ぶ前となにも変わらない)状態です。

NSLogを立ててみてみると、どうやら status == FBSessionStateOpen が成立していないため処理がされていないようでした。

実機でもうまく動作するものとしないものがあるようなのですが、すべてのデバイスでの動作を保証したいです。

どのようにすればよいでしょうか。
助言をいただけると幸いです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

こちらの質問について自己解決したので締めさせていただきます。

原因はXcodeとFacebook Developersで入力したBundle Identifierが違っていたというなんともお粗末なものでした・・・。
ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る