我正在使用 Parse 后端开发 Xamarin.Forms 应用程序。我正在尝试集成Facebook Android SDK进入那个。我想要做的是在每个设备上获取 native 访问 token ,并将该访问 token 推送到 Parse.com。为此,我需要使用 Xamarin 的官方 facebook sdk 绑定(bind)。我为此使用依赖注入(inject)。所以我有 IFacebookService
public interface IFacebookService
{
Task<string> GetFacebookToken();
void LogOut();
}
在每个平台上,我实现 FacebookService 并注入(inject)该实现。在 iOS 上我没有遇到任何问题。在 Android 上,问题是即使显示了 facebook UI,我也没有在 FacebookService 的实现中收到回调。我认为这与 Android 如何管理回调以及 Xamarin.Forms 如何创建 Activity 有关。让我看一下代码。以下是请求 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 Form 初始化方法的地方
//Setup Xamarin forms
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new FormsApp());
在 FormsApp 中注册的初始页面称为 LoginPage。所以我相信它是作为主 Activity 中的 fragment 加载的。所以,也许我需要做这样的事情
LoginManager.Instance.LogInWithReadPermissions(LOGIN_PAGE_FRAGMENT,......);
因为在facebook sdk中,activity和fragment有单独的版本。我不知道如何获取LOGIN_PAGE_FRAGMENT
,甚至问题可能出在其他地方,我不明白。
您有什么想法会导致该问题吗?
最佳答案
我已经解决了这个问题!我发现了类似的东西 here
虽然我的方法有点不同,但主要问题是我需要将 OnActivityResult
的实现添加到 MainActivity 中,并在 MainActivity 内创建 CallbackManager
并委托(delegate) >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" });
一切顺利!希望这会对某人有所帮助。
关于android - Xamarin Forms 和 Facebook Android SDK 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776463/