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" }); 

和一切工作!希望這會幫助某人。