1

我正在使用Parse后端的Xamarin.Forms应用程序。我正在尝试将Facebook Android SDK整合到那。我想要做的是在每台设备上本地获取访问令牌,并将该访问令牌推送到Parse.com。为此,我需要使用Xamarin官方Facebook sdk绑定。我使用依赖注入。所以我有IFacebookServiceXamarin Forms和Facebook Android SDK问题

public interface IFacebookService 
{ 
    Task<string> GetFacebookToken(); 
    void LogOut(); 
} 

而且每个平台上我实现FacebookService并注入该实现。在iOS上我没有问题。在Android上,问题是,即使显示了Facebook UI,我也没有在我的FacebookService实现中收到回调。我认为这与Android管理回调以及Xamarin.Forms如何创建活动有关。让我通读代码。下面是代码的请求登录从Facebook

var callbackManager = CallbackManagerFactory.Create(); 
//Here I instantiate my own implementation of IFacebookCallback 
//nothing fancy here, I've just implemented the required methods with Console.WriteLine(); 
var loginCallback = new FacebookCallback(() => _loginInProgress = false); 
//Register callbackManager and my instance of loginCallback 
LoginManager.Instance.RegisterCallback (callbackManager, loginCallback); 
//Here is the important part. I need an activity to show the login UI 
//Xamarin forms provides me with this method. 
var activity = Xamarin.Forms.Forms.Context as Activity; 
//I request login 
LoginManager.Instance.LogInWithReadPermissions(activity, new string[] { "public_profile", "email", "user_friends" }); 

所以部分,我相信这个问题是此行

var activity = Xamarin.Forms.Forms.Context as Activity; 

在调试器中我看到,返回MainActivity,这是我的入口点内(MainLauncher = true),并在我打电话Xamarin窗体的初始化方法

//Setup Xamarin forms 
global::Xamarin.Forms.Forms.Init(this, bundle); 
LoadApplication(new FormsApp()); 

是在FormsApp注册的初始页面调用LoginPage。所以我相信它在主要活动中被加载为片段。所以,也许我需要做这样的事情

LoginManager.Instance.LogInWithReadPermissions(LOGIN_PAGE_FRAGMENT,......); 

因为在Facebook SDK中有活动和片段的单独版本。我不知道如何得到LOGIN_PAGE_FRAGMENT,甚至可能是其他地方的问题,我不明白。 你有什么想法可以导致这个问题?

回答

1

我解决了这个问题!我发现了类似的东西here 尽管我的方法有点不同,但主要问题是我需要将执行OnActivityResult添加到MainActivity中,并在MainActivity中创建CallbackManager,并将OnActivityResult委托给CallbackManager。因此,在MainActivity我加入这个属性

public ICallbackManager CallbackManager { get; private set; } 

然后我重写OnActivityResult这样

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) 
{ 
    base.OnActivityResult(requestCode, resultCode, data); 
    CallbackManager.OnActivityResult(requestCode, (int)resultCode, data); 
} 

然后我把它换成以前的登录密码与此

var loginCallback = new FacebookCallback(() => _loginInProgress = false); 
var activity = Xamarin.Forms.Forms.Context as MainActivity; 
LoginManager.Instance.RegisterCallback (activity.CallbackManager, loginCallback); 
LoginManager.Instance.LogInWithReadPermissions(activity, new string[] { "public_profile", "email", "user_friends" }); 

和一切工作!希望这会帮助某人。