2016-07-29 4 views
5

MineはObjective-CのiOSアプリでログイン機能のためにFacebook SDKを統合しています。iOSアプリケーションと統合されたfacebookログインページの間欠終了

私は私のボタンを表示するmainviewコントローラを持っています。ボタンをクリックすると、以下のコードがボタンハンドラ上で実行されます。それが断続的にFacebookのログインページがいくつかの時間のための無人/あるとして残されている場合のFacebookからログインページには、我々のアプリ内のWebViewに表示され

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
    [login 
    logInWithReadPermissions: @[@"public_profile", @"email"] 
    fromViewController:self 
    handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
     if (error) { 
      NSLog(@"Process error %@",error.description); 
     } 
     else if (result.isCancelled) { 
      NSLog(@"Cancelled"); 
     } 
     else { 
      if ([result.grantedPermissions containsObject:kEmail]) { 
       [self fetchfbUserInfo]; 
      } 
      else { 
       NSLog(@"User Declined permissions"); 
      } 
     } 
    }]; 

は、コンソールで次のエラーでを閉じます。

FBSDKLog:ERROR:SFSafariViewControllerの親ビュー コントローラが却下されました。これは、UIAlertControllerからのログイン をトリガしている場合に発生します。代わりに、一番上のビュー コントローラが時期尚早に解除されないようにしてください。

は、いくつかのリバースエンジニアリングを行なったし、FBSDKApplicationDelegateクラスのこのデリゲートメソッドは、エラーメッセージのために呼び出さ取得しなければならないことがわかりました。

- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated 
{ 
    if (_safariViewController) { 
    [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors 
          logEntry:@"**ERROR**:\n The SFSafariViewController's parent view controller was dismissed.\n" 
    "This can happen if you are triggering login from a UIAlertController. Instead, make sure your top most view " 
    "controller will not be prematurely dismissed."]; 
    [self safariViewControllerDidFinish:_safariViewController]; 
    } 
} 

なぜログインページについてどのような可能性のある原因(またはアプリの認証ページalreayログインしている場合)は、クローズ/それ自身に退去しますか?

+1

あなたが見つかりましたか?私は同じ問題を持っています – Laurent

+1

私は同じ問題を抱えています。 – erdemgc

+1

私は同じ問題、これのための任意の解決策がありますか? –

答えて

1

iOS 9以降のFB iOS SDKのデフォルト動作は、モバイルSafariを使用してユーザーを認証することです(ネイティブiOS FBアプリではなく)。ユーザーがFacebookであなたのアプリにログインしようとしたがモバイルSafari(Cookieなし)でFacebookにログインしたことがないと、Safariは「Facebookアプリでログインする」ようにユーザーに提示されたページを読み込みます。そのボタンをタップすると、ユーザーがFBネイティブアプリに移動し、Safariページが閉じられ(アプリがバックグラウンドに移動する)これは実際にはのログインフローをキャンセルし、FBSDKLoginManagerLoginResultブロックisCancelled == trueに戻ります。

ユーザがネイティブFBアプリケーションのアクセス権を受け入れてアプリに戻ると、fb<your-fb-app-id>:// url(アクセストークンを含む)でapplication:openURL:options:が呼び出されます。 FB SDKのログインガイドラインによると、このURLはに渡されるべきである。

[[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; 

しかしFBSDKApplicationDelegateちょうどURLを無視して、ログインフローは、あらかじめ「キャンセル」されたためNOを返します。

これはFB SDKの深刻なバグのようです。

私はこの問題に見つけた唯一の回避策はこれです:上記

- (BOOL) application:(UIApplication*)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options 
{ 
    BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; 
    if (!handled) { 
     NSMutableDictionary *launchOptions = [NSMutableDictionary new]; 
     launchOptions[UIApplicationLaunchOptionsSourceApplicationKey] = options[UIApplicationOpenURLOptionsSourceApplicationKey]; 
     launchOptions[UIApplicationLaunchOptionsAnnotationKey] = options[UIApplicationOpenURLOptionsAnnotationKey]; 
     launchOptions[UIApplicationLaunchOptionsURLKey] = url; 
     return [[FBSDKApplicationDelegate sharedInstance] application:application 
           didFinishLaunchingWithOptions:launchOptions]; 
    } 

    return handled; 
} 

は実際にFB SDK内のアクセストークンを格納します。

ログインフローを続行するには、FBSDKAccessTokenDidChangeの通知を確認することができます。この通知は、上記のFB URLの処理に続いて呼び出されます。

関連する問題