2

カスタム ログイン ボタンを使用して Facebook ログインを実装しようとしました。すべてのセットアップ手順を完了しました。ボタンをタップすると、Web ビューが表示され、許可を与えるように求められます。

ただし、[完了](Web ビュー コントローラーの左上) をタップすると、完了ブロックが呼び出されますが、[キャンセル] または [OK] をタップすると、Web ビュー コントローラーは閉じられますが、完了ブロックは呼び出されませんか? ここに画像の説明を入力 使用したコードは次のとおりです。

    let fbLoginManager = FBSDKLoginManager()
    fbLoginManager.loginBehavior = .Native
    fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) in
        // put a breakpoint here but it won't stop here if I tap OK
        if error != nil {
            print(error.localizedFailureReason)
        } else if result.isCancelled {
            // dismiss view
        } else {
            let token = result.token.tokenString
            // do something with the token
        }
    }

編集1

AppDelegate の open url メソッドは次のとおりです。

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
    return application(app, openURL: url, sourceApplication: nil, annotation: [:])
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    if url.scheme == Key.FACEBOOK_URL_SCHEME {
        let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
        return handled
    }
    let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
    if let dynamicLink = dynamicLink {
        if let url = dynamicLink.url {
            if let paths = url.pathComponents{
                if paths.count > 2 {
                    let slug = paths[2]
                    if let book = AppManager.instance.findBookBySlug(slug) {
                        // Open detail book
                        self.openDetailBook(book)
                    } else {
                        self.openDetailBookWithSlug(slug)
                    }
                }
            }
        }
    }
    if url.scheme == Key.DEEP_LINK_URL_SCHEME {
        if let paths = url.pathComponents, host = url.host {
            if host == "truyen" {
                if paths.count > 1 {
                    let slug = paths[1]
                    if let book = AppManager.instance.findBookBySlug(slug) {
                        // Open detail book
                        self.openDetailBook(book)
                    } else {
                        self.openDetailBookWithSlug(slug)
                    }
                }
            }
        }
    }
    return true
}
4

3 に答える 3

2

このような状況に直面した場合は、Facebook SDK がオープン ソースであるため、自分でデバッグしてください。表示されているウィンドウは ですSFSafariViewController。これらのボタンのいずれかをタップすると、コールバックは によって処理されますSFSafariViewControllerSFSafariViewController delegateFacebook SDK でメソッドを探します。

ログイン コードを呼び出した後にブレークポイントを設定し、順を追って進むと、SFSafariViewController を使用するクラスに移動します。

これらのdelegateメソッドの 1 つに、open url メソッドの呼び出しがあります。アプリのデリゲート メソッドに同じ open URL メソッドを実装します。

あなたの場合、問題は間違った openURL メソッドを使用していることです。正しいものは

func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, 
     openURL: url, 
     sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
     annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
}
于 2016-07-28T11:25:36.343 に答える
2

Swift 3、このメソッドを削除するとうまくいきました、

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return application(app, open: url, sourceApplication: nil, annotation: [:])
}
于 2016-11-20T13:57:11.087 に答える
0

AppDelegate.m ファイルに Open url メソッドを追加し、そのメソッドにブレークポイントを配置します。

- (BOOL)application:(UIApplication *)application openURL:( NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication  annotation:annotation];
}
于 2016-07-28T11:02:53.220 に答える