如何获取 Facebook 登录令牌,在“您已经授权 APPName”Facebook 中单击“确定”按钮后

Posted

技术标签:

【中文标题】如何获取 Facebook 登录令牌,在“您已经授权 APPName”Facebook 中单击“确定”按钮后【英文标题】:How to get Facebook login token, after OK button clicked in "You have Already Authorized APPName" facebook 【发布时间】:2016-12-23 06:48:47 【问题描述】:

我正在使用具有 androidios 项目的 xamarin.forms PCL

以下是步骤:

我没有在我的 iphone 上使用 facebook 应用程序登录。

当我尝试注册 facebook 时,safari 打开,弹出消息打开“你已经授权 APPName”

我点击确定按钮,然后再次弹出“在 APPName 中打开页面”。我点击确定按钮

我得到 token = null 和 Iscancel = true;

下面是我的代码:

public class FacebookLoginButtonRenderer : ButtonRenderer


    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    
        base.OnElementChanged(e);
        if (Control != null)
        
            UIButton button = Control;

            button.TouchUpInside += delegate
            
                HandleFacebookLoginClicked();
            ;
        
    

    private void HandleFacebookLoginClicked()
    
        LoginManager manager = new LoginManager();
        manager.Init();
        manager.LogOut();
        manager.LoginBehavior = LoginBehavior.SystemAccount;

        manager.LogInWithReadPermissions(new string[]  "public_profile", "email", "user_birthday" , (result, error) =>
          
              if (error != null)
              
                  App.OnFacebookAuthFailed();
                  return;
              
              else if (result.IsCancelled)
              
                 return;
              
              else 
                  var UserToken = result.Token.TokenString;
                  if (UserToken != null)
                  
                      var request = new Facebook.CoreKit.GraphRequest("/me?fields=id,email,first_name,last_name,gender,birthday", null, UserToken, null, "GET");
                      request.Start((connection, result1, error1) =>
                      
                          if (error1 != null)
                          
                              new UIAlertView("Error...", error.Description, null, "Ok", null).Show();
                              return;
                          
                          var obj = result1 as NSDictionary;
                          FBModel fb = new FBModel();

                          fb.ID = obj["id"].ToString();
                          fb.Name = obj["first_name"].ToString();
                          fb.Email = obj["email"].ToString();
                          fb.LastName = obj["last_name"].ToString();
                          fb.Gender = obj["gender"].ToString();
                          if (obj.ContainsKey(new NSString("birthday")))
                          
                              var birthdate = obj["birthday"].ToString();
                              fb.Age = DateTime.Today.Year - Convert.ToInt32(birthdate.Split('/')[2]);
                          
                          else
                          
                              fb.Age = 25;
                          

                          App.OnFacebookIOSAuthSuccess(fb);
                      );

                  
              
          );
    

当我登录 Facebook 应用程序时,此代码完美运行。

请建议我哪里出错了。 如何获取令牌?

【问题讨论】:

【参考方案1】:

1)打开Safari浏览器

2)注销 Facebook

3) 打开应用程序并再次登录 Facebook

   private void HandleFacebookLoginClicked()

   LoginManager login = new LoginManager(); 
   login.LogInWithReadPermissions(readPermissions.ToArray(),
   delegate(LoginManagerLoginResult result, NSError error)

 
    if (error != null)
     
      App.OnFacebookAuthFailed();
     
    else if (result.IsCancelled)
     
       App.OnFacebookAuthFailed();
     
     else
     
       var accessToken = result.Token;
       App.OnFacebookAuthSuccess(accessToken.TokenString);
      
      );
    


     public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    

       FBSettings.DefaultAppID = FacebookAppId;
       FBSettings.DefaultDisplayName = FacebookAppName;


        return base.FinishedLaunching(app, options);
    


    public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
    
        base.OpenUrl(application, url, sourceApplication, annotation);
        return FBSession.ActiveSession.HandleOpenURL(url);
    

    public override void OnActivated(UIApplication application)
    
        base.OnActivated(application);
        // We need to properly handle activation of the application with regards to SSO
        // (e.g., returning from iOS 6.0 authorization dialog or from fast app switching).
        FBSession.ActiveSession.HandleDidBecomeActive();
    

【讨论】:

我按照你说的做了改变,但我仍然得到了 result.IsCancelled = true 和 result.Token = null。 你添加了这个 FBSettings.DefaultAppID = FacebookAppId; FBSettings.DefaultDisplayName = FacebookAppName; 我正在使用 xamarin.facebook.IOS。我没有在该 DLL 中获得 FBSettings.DefaultAppID 属性。你能分享代码吗? 我正在发送 GitHub 代码,请查看github.com/IdoTene/XamarinFormsNativeFacebook 谢谢。您发送的链接不使用 xamarin.facebook.ios。它使用 MonoTouch.FacebookConnect。 1)我可以从哪里得到这个 MonoTouch.FacebookConnect dll。 2)这个问题可以通过xamarin.facebook.ios dll解决吗

以上是关于如何获取 Facebook 登录令牌,在“您已经授权 APPName”Facebook 中单击“确定”按钮后的主要内容,如果未能解决你的问题,请参考以下文章

Android Facebook通过访问令牌获取登录的电子邮件地址

iOS:通过自动登录获取 Facebook 访问令牌

Facebook - 如何获得永久用户访问令牌[重复]

SwiftUI Facebook 登录:如何在视图中获取 Facebook id?

Facebook Phonegap 插件 - 能够登录(似乎)但无法获取访问令牌

如何从 Facebook 登录 sdk 中删除 ProgressBar