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