Facebook Login 中的取消按钮使用 Swift 崩溃了吗?

Posted

技术标签:

【中文标题】Facebook Login 中的取消按钮使用 Swift 崩溃了吗?【英文标题】:Cancel button in Facebook Login using Swift crashes? 【发布时间】:2015-12-22 05:53:46 【问题描述】:

我刚刚按照教程使用 swift 和 parse 制作 Facebook 登录按钮。我按下登录按钮,第一次成功登录。之后,当我再次运行应用程序并再次按下登录按钮时,我会看到下图所示的屏幕: login page

当我按下 OK 时一切都很好,然后我转到下一个 viewContoller,问题是在我按下取消按钮后,应用程序崩溃了。您能否给我一些提示,为什么会发生这种情况?

import UIKit
import Parse
import ParseFacebookUtilsV4
import ParseTwitterUtils
var userName: String = ""
class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
    

    @available(ios 8.0, *)
    @IBAction func signInButtonTapped(sender: AnyObject) 

        PFFacebookUtils.logInInBackgroundWithReadPermissions([], block:  (user: PFUser?, error: NSError?) -> Void in

            if (error != nil)
            
                //Display an alert message
                var myAlert = UIAlertController(title: "Alert", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)

                let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)

                myAlert.addAction(okAction);

                self.presentViewController(myAlert, animated: true, completion: nil)

                return
            

            if(FBSDKAccessToken.currentAccessToken() != nil) 
                userName = (PFUser.currentUser()?.objectId)!

                let protectedPage = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedPageViewController") as! ProtectedPageViewController
                let protectedPageNav = UINavigationController(rootViewController: protectedPage)
                let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
                var window = UIApplication.sharedApplication().keyWindow
                    window?.rootViewController = protectedPageNav
            
        )   
    

【问题讨论】:

【参考方案1】:

在 PFFacebookUtils.logInInInBackgroundWithReadPermissions 块中仍然存在的 OK 或 Cancel 期间,当您点击它时没有问题,因为它调用了

if (error != nil)
             

当你点击“取消”时,下面的方法可能会被调用,

 if(FBSDKAccessToken.currentAccessToken() != nil)  

因为令牌已经有效,请查看!

【讨论】:

所以,如果我没记错的话,你的建议是 if(FBSDKAccessToken.currentAccessToken() != nil) 我应该有 if(FBSDKAccessToken.currentAccessToken() != nil) else ,然后在 else 部分将用户重定向到应用的第一页? 实际上,如果用户取消,Facebook 登录功能可以选择。那应该叫。我在下一个答案中显示我的代码。【参考方案2】:

这里我通过objective c代码使用了Facebook登录,你可以在这里得到重点,

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
      [login
       logInWithReadPermissions:  @[@"public_profile",@"email",@"user_friends"]
       fromViewController:self
       handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 
             if (error) 
                   STOP_LOAD;
                   NSLog(@"Process error");
                   NSLog(@"%@",error);
                   TOAST_FOR_TRY_AGAIN;
                   /*
                   UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Please Try Again"
                                                                 message:nil
                                                                delegate:self
                                                       cancelButtonTitle:@"Ok"
                                                       otherButtonTitles: nil];
                   [alert show];
                    */
              else if (result.isCancelled)
             
                    STOP_LOAD;
                   NSLog(@"Cancelled");
              else
             
                   NSLog(@"Logged in");
                   NSLog(@"Result=%@",result);

                   [[[FBSDKGraphRequest alloc] initWithGraphpath:@"me" parameters:@ @"fields": @"id,first_name,middle_name,last_name,name,picture,email"]
                    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
                    
                          NSLog(@"Facebook result=%@",result);
                         if (!error)
                          


                           else 

                                NSLog(@"An error occurred getting friends: %@", [error localizedDescription]);
                          
                    ];
             
       ];

【讨论】:

以上是关于Facebook Login 中的取消按钮使用 Swift 崩溃了吗?的主要内容,如果未能解决你的问题,请参考以下文章

错误:解组时找不到类:com.facebook.login.Login 客户端请求

Facebook 连接对话框未关闭

iOS Facebook 登录按钮与 swift

Facebook Javascript SDK - Fb.login 在浏览器内置的 Facebook 上不起作用

PhoneGap Facebook Connect 没有回拨

Parse.FacebookUtils.logIn 是不是只允许通过弹出框登录 Facebook?