Facebook 登录在 IOS SDK 中不起作用

Posted

技术标签:

【中文标题】Facebook 登录在 IOS SDK 中不起作用【英文标题】:Facebook Login not working in IOS SDK 【发布时间】:2017-06-08 11:20:59 【问题描述】:

我正在努力解决 Facebook 登录问题,昨天 Facebook 登录工作正常,但今天当我运行我的应用程序时它不工作不知道为什么,为什么它突然不工作我已经在 Facebook 中配置了与 Facebook 登录相关的所有内容开发控制台一切都配置好了 如果您有任何想法,请帮助我,我也已经启用了钥匙串共享。

Facebook 登录代码

@IBAction func onClickFacebookLoginAction(_ sender: Any) 

    var message = String()
    if Reachability.isConnectedToNetwork() == true

        let loginView:FBSDKLoginManager = FBSDKLoginManager()
        loginView.loginBehavior = FBSDKLoginBehavior.web
        loginView.logIn(withReadPermissions: ["email","public_profile","user_friends"], from: self, handler:  (result, error) in
            if(error != nil)

                print("Error while try to login with facebook-\(error?.localizedDescription)")
            else if (result?.isCancelled)!

                print("User cancel the facebook login")
            else

                if result?.grantedPermissions != nil
                    if (result?.grantedPermissions .contains("email"))!
                        self.ShowProgressHUD()
                        self.fetchUserInfo()
                    else
                        message = message.appending("Facebook email permission error")
                        self.showAlertMessage(message: message, title: "")
                    
                
            
        )
    


func fetchUserInfo() -> Void 

    if (FBSDKAccessToken.current() != nil) 

        let graphRequest:FBSDKGraphRequest = FBSDKGraphRequest(graphpath: "/me", parameters:["fields": "id, first_name, last_name, name, email, picture"])
        graphRequest.start(completionHandler:  (connection, result, error) in

            if(error != nil)

                self.showAlertMessage(message: (error?.localizedDescription)!, title: "")

            
            else
            
                 print("Result is:\(result)")
                self.dictionary = result as! [String : AnyObject]
                let name = self.dictionary["name"] as!String
                let email = self.dictionary["email"] as! String
                let token = FBSDKAccessToken.current().tokenString

                print("name is -\(name)")
                print("email is -\(email)")
                print("token is -\(token)")


                DispatchQueue.main.async 

                    let SelectionViewObj = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
                    self.navigationController?.pushViewController(SelectionViewObj, animated: true)
                
            
        )
    

【问题讨论】:

为什么graphPath参数值graphPath: "/me"之前有个/ @PraveenKumar 我只是按照一些教程和教程做同样的事情。 去掉斜线试试。在此处查看详细信息developers.facebook.com/docs/ios/graph 并参考此***.com/questions/31383578/… 结果不一样 如果它不起作用,请尝试我的答案,为我提供您遇到的问题 【参考方案1】:

这是我用来验证 facebook 的代码。它的工作原理就像一个魅力。只需检查或替换为这个。

self.fbLoginManager = FBSDKLoginManager.init()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.web
self.fbLoginManager.logIn(withReadPermissions: ["email"], from: self)  (result, error) -> Void in
    if (error == nil) 
        let fbloginresult : FBSDKLoginManagerLoginResult = result!
        if fbloginresult.grantedPermissions != nil && fbloginresult.grantedPermissions.contains("email") 
            if((FBSDKAccessToken.current()) != nil)
                FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"id, first_name, last_name, email, gender, birthday, location"]).start(completionHandler:  (connection, result, error) -> Void in
                    if error != nil 
                        print(error?.localizedDescription ?? "error in facebook login...!")
                        return
                    
                    if let dict = result as? NSDictionary 
                        print("facebook login result --->\n\(dict)")
                        guard let id = dict["id"] else 
                            print("Ooops... id = nil")
                            return
                        
                        //  let firstName: String = dict["first_name"] as? String ?? ""
                       // let lastName : String = dict["last_name"] as? String ?? ""
                      //  let email : String = dict["email"] as? String ?? ""

                        self.fbLoginManager.logOut()
                    
                )
            
         else 
            print("facebook ---> login canceled")
        
     else 
        print(error?.localizedDescription ?? "facebook login has error")
    

【讨论】:

我认为从 fb 开发者控制台中删除该项目并创建新项目并尝试这个.... 我的应用程序已在 App Store 上运行,现在我正在添加一些功能 【参考方案2】:

这就是我过去使用 Facebook 登录的方式,

@IBAction func act_loginFB(_ sender: UIButton) 
    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
    fbLoginManager.logIn(withReadPermissions: ["public_profile", "email",], from: self)  (result, error) -> Void in
        if (error == nil)
            let fbloginresult : FBSDKLoginManagerLoginResult = result!
            if(fbloginresult.grantedPermissions.contains("email"))
            
                self.getFBUserData()
            
        
    


func getFBUserData()
    if((FBSDKAccessToken.current()) != nil)
        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler:  (connection, result, error) -> Void in
            if (error == nil)
                //everything works print the user data
                print(result)
                let data: [String:AnyObject] = (result as? [String : AnyObject])!
                print(data)
                let email: String = data["email"]! as! String
                print(email)
            
        )
    

检查您在 info.plist 中添加了正确的 FacebookAppIDFacebookDisplayName

【讨论】:

我想打开登录行为,因为网络不想在 safari 浏览器中打开,在浏览器中它在我的代码中也可以正常工作 @Sanjeetverma 在此行之后添加fbLoginManager.loginBehavior = FBSDKLoginBehavior.web let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() 我在我的代码中也使用过,如果你愿意,那么你可以在我的问题中检查我上面的代码,好吧,让我先试试你的答案 如果我使用 safari 浏览器,一旦您尝试使用具有登录行为的代码,您会得到相同的结果吗 @Sanjeetverma 我认为您的代码没有错误,问题出在某个地方,请验证您是否按照教程中的每一步操作,否则请尝试其他操作。 facebook 登录的通用代码就是我上面提到的那个。通过网络浏览器或本机显示登录由您决定,可以从FBSDKLoginBehavior

以上是关于Facebook 登录在 IOS SDK 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 应用邀请在使用 Facebook SDK 4.X 的 iOS8 中不起作用?

获取 xmpp_login 访问令牌在 Facebook iOS SDK 中不起作用

Facebook 注销在新 SDK 中不起作用

Facebook 登录在 Twitter iOS 应用程序中不起作用

Facebook iOS SDK 登录不起作用 - NSException

登录后 Facebook IOS SDK 导航到另一个控制器不起作用