我仍然习惯于Xamarin.Forms,而且我已经很基础了。我针对该问题浏览了许多文章,但最终无法解决。所以...
目前,我正在尝试在使用Droid和iOS(无WP)的Xamarin.Forms应用程序中添加Google身份验证。
到目前为止,我正在遵循here的指南。我正在使用Xamarin.Auth对Google进行身份验证。
这是我的源代码的一部分。
私人异步void GoogleSheetsButton_Tapped()
{
字符串clientId = null;
字符串redirectUri = null;
如果(Device.RuntimePlatform == Device.iOS)
{
clientId = Constants.iOSClientId;
redirectUri = Constants.iOSRedirectUrl;
}
否则,如果(Device.RuntimePlatform == Device.Android)
{
clientId = Constants.AndroidClientId;
redirectUri = Constants.AndroidRedirectUrl;
}
var authenticator =新的OAuth2Authenticator(
clientId,
空值,
常量范围
新的Uri(Constants.AuthorizeUrl),
新的Uri(redirectUri),
新的Uri(Constants.AccessTokenUrl),
空值,
真正);
authenticator.Completed + = OnAuthCompleted;
authenticator.Error + = OnAuthError;
AuthenticationState.Authenticator = authenticator;
var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
presenter.Login(authenticator);
}
问题出在我的方法完成工作之后。所以在我的最后一行之后:
presenter.Login(authenticator);
一切正常,并进行调试我正在跟踪编译器退出方法,没有任何错误,但是随后我收到异常,您可以看到here。它是“没有兼容的代码正在运行”。
以下是有关我的源代码的更多信息:
用于客户端ID和URL的“常量”类的源
公共静态类常量
{
公共静态字符串AppName =“ ....”;
// OAuth
//对于Google登录,请在https://console.developers.google.com/上进行配置
公共静态字符串iOSClientId =“ 6 ..... apps.googleusercontent.com”;
公共静态字符串AndroidClientId =“ 6 ..... apps.googleusercontent.com”;
//这些值不需要更改
公共静态字符串Scope =“ https://www.googleapis.com/auth/userinfo.email”;
公共静态字符串AuthorizeUrl =“ https://accounts.google.com/o/oauth2/auth”;
公共静态字符串AccessTokenUrl =“ https://www.googleapis.com/oauth2/v4/token”;
公共静态字符串UserInfoUrl =“ https://www.googleapis.com/oauth2/v2/userinfo”;
//将这些设置为反向的iOS / Android客户端ID,并附加:/ oauth2redirect
公共静态字符串iOSRedirectUrl =“ com.googleusercontent.apps.6 ...... h:/ oauth2redirect”;
公共静态字符串AndroidRedirectUrl =“ com.googleusercontent.apps.6 ...... l:/ oauth2redirect”;
}
身份验证完成/错误的实现方法的来源,实际上由于我的错误我仍然无法击中
异步void OnAuthCompleted(对象发送者,AuthenticatorCompletedEventArgs e)
{
var authenticator =发送者为OAuth2Authenticator;
如果(验证者!= null)
{
authenticator.Completed-= OnAuthCompleted;
authenticator.Error-= OnAuthError;
}
GoogleLoginUser用户= null;
如果(已验证)
{
var request = new OAuth2Request(“ GET”,new Uri(Constants.UserInfoUrl),null,e.Account);
var response =等待请求。GetResponseAsync();
如果(响应!= null)
{
字符串userJson =等待响应.GetResponseTextAsync();
用户= JsonConvert.DeserializeObject(userJson);
}
如果(_account!= null)
{
_store.Delete(_account,Constants.AppName);
}
等待_store.SaveAsync(_account = e.Account,Constants.AppName);
等待DisplayAlert(“电子邮件地址”,user.Email,“确定”);
}
}
void OnAuthError(对象发送者,AuthenticatorErrorEventArgs e)
{
var authenticator =发送者为OAuth2Authenticator;
如果(验证者!= null)
{
authenticator.Completed-= OnAuthCompleted;
authenticator.Error-= OnAuthError;
}
var message = e.Message;
}
我在其中添加的Android MainActivity的来源
公共类MainActivity:FormsAppCompatActivity
{
受保护的重写void OnCreate(捆绑包)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
Forms.Init(this,bundle);
全局:: Xamarin.Auth.Presenters.XamarinAndroid.AuthenticationConfiguration.Init(this,bundle);
MobileBarcodeScanner.Initialize(Application);
LoadApplication(new App());
}
}
UrlSchemeInterceptorActivity的来源
[Activity(Label =“ CustomUrlSchemeInterceptorActivity”,NoHistory = true,LaunchMode = LaunchMode.SingleTop)]
[IntentFilter(new [] {Intent.ActionView},Categories = new [] {Intent.CategoryDefault,Intent.CategoryBrowsable},DataSchemes = new [] {“ com.googleusercontent.apps.6 ...... l”} ,DataPath =“ / oauth2redirect”)]
公共类CustomUrlSchemeInterceptorActivity:活动
{
受保护的重写void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
var uri = new Uri(Intent.Data.ToString());
AuthenticationState.Authenticator.OnPageLoading(uri);
完();
}
}
这是我深入研究的主要文章=> Link 1,Link 2和Link 3,但仍然无法解决问题。
我不确定错误是从哪里来的,或者我可以继续调试它来解决问题。
提前致谢
解
在Android项目属性内将android编译器更改为Android 7.0。 Screenshot
确保在Android Manifest中,您的目标是SDK版本。 Screenshot
将所有“ Xamarin.Android。*” nuget软件包更新为最低版本25.4.0.1。目前最有可能达到23.3.0。我发现依赖更新存在问题,因此我进行了手动上传。我去手动下载了每个软件包,并将其移到packages文件夹。然后,我创建了自己的软件包源,并为我的文件夹软件包提供了路径,并用它来安装已经下载的NuGet软件包。 Screenshot
之后,我的问题解决了。
最佳答案
请将您的Android SDK更新为API 24或更高版本,并将其设置为项目的编译版本。并将更新的自定义选项卡及其依赖项的引用程序集更新到v25.x.x。而已。您应该能够使其正常运行。
维杰