2016-03-26 9 views
4

あなたの助けを前にありがとう!SwiftのFacebookログイン後にSegueが起動しない

私は執筆中の迅速なアプリケーションでFacebookのログインを実装していますが、ログインが完了した後で、セグを実行する際に問題が発生しています。

FBSDKLoginButtonDelegateの一環として、私は二つの方法があります:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: 
FBSDKLoginManagerLoginResult!, error: NSError!) 
    {} 

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) 
    {} 

をログインボタンが正しく実装されて、私は権限/ FBトークンを読み取ることができていますし、上にこれを渡しますAmazon Cognito。

しかし、奇妙なことは、プログラムから別のビュー(コントローラ)にログインすることができないということです。

FBログインボタンを押すと、ユーザーはウェブブラウザ(Facebook SDKがこれをすべて処理する)に移動し、ログインが行われます。

私は同じように、セグエを配置する場合:)(loginButtonに

dispatch_async(dispatch_get_main_queue(), { 
     self.performSegueWithIdentifier("segueLoginViewtoHome", sender: nil }) 

Webブラウザがなくなったときに、それは決して真の実行(すなわち、ユーザーは、ログインボタンをビューに戻され、 segueが意図した新しいビューではない)。私はブラウザのウィンドウがログインボタン(とsegue)を含むビューに戻る前に行が実行されると信じていますが、プログラムが唯一のアクティブな状態になるようにプログラムに指示する方法はありません。セグを実行します。

ブラウザに切り替える必要がないloginButtonDidLogOut()に同じセグコードを入れると、「ログアウト」がシートにプッシュされた後にsegueが正常に実行されるためです画面の下からスライドします。

このビューコントローラは、ログアウト時に発生するようにコーディングされている場合、segueが正常に機能するように、デリゲートとして正しく設定されます。

お手数をおかけしますようお願い申し上げます。長くお詫び申し上げます。ありがとうございます!

答えて

12

この問題は、fbLoginSuccessというグローバルブール値をfalseに初期化して作成することで解決しました。 Facebookのログインが成功した場合は、segueを実行している場所でfbLoginSuccessをtrueに設定します。次に、viewDidAppear()をオーバーライドし、fbLoginSuccessがtrueの場合はそこでsegueを実行します。これは、viewDidAppear()がブラウザウィンドウから返された後に実行されるため、修正されています。これは必要なものです。

var fbLoginSuccess = false 

override func viewDidAppear(animated: Bool) { 
    if (FBSDKAccessToken.currentAccessToken() != nil && fbLoginSuccess == true) 
    { 
     performSegueWithIdentifier("loginSegue", sender: self) 
    } 
} 

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
    print("User Logged In") 

    if ((error) != nil) { 
     // Process error 
     print(error) 
    } 
    else if result.isCancelled { 
     // Handle cancellations 
    } 
    else { 
     fbLoginSuccess = true 
     // If you ask for multiple permissions at once, you 
     // should check if specific permissions missing 
     if result.grantedPermissions.contains("email") { 
      // Do work 
     } 
    } 
} 

希望します。

+0

完璧な呼び出しビューのDidAppearは私が必要とした方法でした。お手伝いありがとう! – kmypwn

+0

私が気づいた奇妙なことは、ユーザーがコードジェネレータを使用してログインする必要がある場合、セグが発生しないことです。何か案は? – kmypwn

+0

私は助けてうれしいです。コードジェネレータはどういう意味ですか?あなたは私に例を挙げることができますか? –

0

コメントする評判が十分ではありませんが、 'OR'コンパレータ '||'を変更すると、 AND '& &'にログインし、トークンが正常に機能していないかどうかを確認します。それ以外の場合は、何らかの理由でログインしたかどうかは関係ありません。ちょうど私の問題だったかもしれないが、他人を助ける希望。

関連する問題