C# Xamarin.Essentials.WebAuthenticator.AuthenticateAsync在Android上成功登录Facebook后不会关闭弹出窗口

C# Xamarin.Essentials.WebAuthenticator.AuthenticateAsync在Android上成功登录Facebook后不会关闭弹出窗口,c#,android,facebook,xamarin,C#,Android,Facebook,Xamarin,我在Xamarin创建了一个facebook登录服务。在UWP应用程序中,一切正常。我还实现了Android所需的选项(带意图的回调活动)。Facebook登录页面将正确显示。登录成功,并重定向到已配置的成功页面。问题是,在Android上,成功页面出现后,登录窗口没有关闭,Xamarin代码没有捕获access_令牌。在UWP中,一切都正常工作。 在服务中,我调用方法RequestFacebookToken打开登录窗口并请求访问令牌 这是我的facebook服务: public class F

我在Xamarin创建了一个facebook登录服务。在UWP应用程序中,一切正常。我还实现了Android所需的选项(带意图的回调活动)。Facebook登录页面将正确显示。登录成功,并重定向到已配置的成功页面。问题是,在Android上,成功页面出现后,登录窗口没有关闭,Xamarin代码没有捕获access_令牌。在UWP中,一切都正常工作。 在服务中,我调用方法RequestFacebookToken打开登录窗口并请求访问令牌

这是我的facebook服务:

public class FacebookService
{
    public const string CALLBACK_SCHEME = "https";

    private readonly HttpClient _httpClient;
    private const string _fbOauthEndpoint = "https://www.facebook.com/v7.0/dialog/oauth?";
    private const string CALLBACK_URI = "https://www.facebook.com/connect/login_success.html";
    private const string _fbAPI_URI = "https://graph.facebook.com/v2.8/";
    private string _fbAccessToken;
    private readonly string _AppId;

    public FacebookService(string AppID)
    {
        this._AppId = AppID;

        _httpClient = new HttpClient
        {
            BaseAddress = new Uri(_fbAPI_URI)
        };
        _httpClient.DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task RequestFacebookToken()
    {
        WebAuthenticatorResult res = null;
        try
        {
            string state = Convert.ToBase64String(Encoding.Unicode.GetBytes(DateTime.Now.Ticks.ToString()));
            //  if (Device.RuntimePlatform == Device.UWP)
            //  {
            res = await WebAuthenticator.AuthenticateAsync(new Uri($"{_fbOauthEndpoint}client_id={this._AppId}&display=popup&response_type=token&redirect_uri={CALLBACK_URI}&state={state}"), new Uri($"{CALLBACK_URI}"));
            /*      }
                    else
                    {
                        res = await WebAuthenticator.AuthenticateAsync(new Uri($"{_fbOauthEndpoint}client_id={this._AppId}&response_type=token&redirect_uri={CALLBACK_URI}&state={state}"), new Uri($"{CALLBACK_URI}"));
                    }*/
        }
        catch (Exception e)
        {

        }

        this._fbAccessToken = res?.AccessToken;
    }

    public async Task<FacebookProfile> GetUserFromFacebookAsync()
    {
        var result = await GetAsync<dynamic>("me", "fields=first_name,last_name,email,gender,picture.width(100).height(100)");
        if (result == null)
        {
            throw new Exception("User from this token not exist");
        }

        var account = new FacebookProfile()
        {
            Email = result.email,
            FirstName = result.first_name,
            LastName = result.last_name,
            Picture = result.picture.data.url,
            Gender = result.gender
        };

        return account;
    }

    private async Task<T> GetAsync<T>(string endpoint, string args = null)
    {
        var response = await _httpClient.GetAsync($"{endpoint}?access_token={this._fbAccessToken}&{args}");
        var result = await response.Content.ReadAsStringAsync();
        if (!response.IsSuccessStatusCode)
            return default(T);
        return JsonConvert.DeserializeObject<T>(result);
    }
}
公共类FacebookService
{
公用常量字符串回调\u SCHEME=“https”;
私有只读HttpClientu HttpClient;
私有常量字符串fbOauthEndpoint=”https://www.facebook.com/v7.0/dialog/oauth?";
私有常量字符串回调_URI=”https://www.facebook.com/connect/login_success.html";
私有常量字符串_fbAPI_URI=”https://graph.facebook.com/v2.8/";
私有字符串\u fbAccessToken;
私有只读字符串_AppId;
公共FacebookService(字符串AppID)
{
这是._AppId=AppId;
_httpClient=新的httpClient
{
BaseAddress=新Uri(\u fbAPI\u Uri)
};
_httpClient.DefaultRequestHeaders
接受
.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
}
公共异步任务RequestFacebookToken()
{
WebAuthenticatorResult res=null;
尝试
{
字符串状态=Convert.ToBase64String(Encoding.Unicode.GetBytes(DateTime.Now.Ticks.ToString());
//if(Device.RuntimePlatform==Device.UWP)
//  {
res=wait WebAuthenticator.authenticateSync(新Uri($“{fbOauthEndpoint}客户端id={this.{uAppID}&display=popup&response\uType=token&redirect\uURI={CALLBACK\uURI}&state={state}”)、新Uri($“{CALLBACK CALLBACK\uURI}”);
/*      }
其他的
{
res=wait WebAuthenticator.authenticateSync(新Uri($“{fbOauthEndpoint}客户端id={this.\uAppID}&response\uType=token&redirect\uURI={CALLBACK\uURI}&state={state}”)、新Uri($“{CALLBACK\uURI}”);
}*/
}
捕获(例外e)
{
}
此.fbAccessToken=res?.AccessToken;
}
公共异步任务GetUserFromFacebookAsync()
{
var result=await GetAsync(“我”,“字段=名字、姓氏、电子邮件、性别、图片.宽度(100).高度(100)”);
如果(结果==null)
{
抛出新异常(“此令牌中的用户不存在”);
}
var帐户=新的FacebookProfile()
{
Email=result.Email,
FirstName=result.first\u name,
LastName=result.last_name,
Picture=result.Picture.data.url,
性别=结果
};
返回帐户;
}
专用异步任务GetAsync(字符串端点,字符串args=null)
{
var response=await_httpClient.GetAsync($“{endpoint}?access_token={this.\u fbAccessToken}&{args}”);
var result=await response.Content.ReadAsStringAsync();
如果(!response.issucessStatusCode)
返回默认值(T);
返回JsonConvert.DeserializeObject(结果);
}
}
您是否知道,登录成功后登录窗口未关闭的原因是什么


提前谢谢

您可以使用Plugin.facebook客户端登录facebook

 public async Task LoginAsync()
        {
        FacebookResponse<bool> response = await CrossFacebookClient.Current.LoginAsync(permisions);
            switch(response.Status)
        {
            case FacebookActionStatus.Completed:
                IsLoggedIn = true;
                OnLoadDataCommand.Execute(null);
                break;
            case FacebookActionStatus.Canceled:
            
                break;
            case FacebookActionStatus.Unauthorized:
                await App.Current.MainPage.DisplayAlert("Unauthorized", response.Message, "Ok");
                break;
            case FacebookActionStatus.Error:
                await App.Current.MainPage.DisplayAlert("Error", response.Message,"Ok");
                break;
        }

        }
public异步任务LoginAsync()
        {
FacebookResponse response=等待CrossFacebookClient.Current.LoginAsync(权限);
            开关(响应状态)
{
案例FacebookActionStatus。已完成:
IsLoggedIn=真;
OnLoadDataCommand.Execute(null);
打破
案例FacebookActionStatus。已取消:
打破
案例FacebookActionStatus。未经授权:
等待App.Current.MainPage.DisplayAlert(“未经授权”,响应。消息,“确定”);
打破
案例FacebookActionStatus。错误:
等待App.Current.MainPage.DisplayAlert(“错误”,响应,消息,“确定”);
打破
}

        }

您可以从下面的链接下载源文件:

这在Android上运行良好。但是,它在UWP上崩溃。但是在UWP中我使用了我的解决方案,在Android和IOS中我使用了这个解决方案。:-)因此这是一个双赢的解决方案。