目前我正在尝试在我的Xamarin.Forms应用程序中添加Google身份验证,该应用程序使用Droid和iOS(无WP).
到目前为止,我正在关注here的指南.我正在使用Xamarin.Auth对Google进行身份验证.
这是我的源代码中的一部分.
private async void GoogleSheetsButton_Tapped() { string clientId = null; string redirectUri = null; if (Device.RuntimePlatform == Device.iOS) { clientId = Constants.iOSClientId; redirectUri = Constants.iOSRedirectUrl; } else if (Device.RuntimePlatform == Device.Android) { clientId = Constants.AndroidClientId; redirectUri = Constants.AndroidRedirectUrl; } var authenticator = new OAuth2Authenticator( clientId,null,Constants.Scope,new Uri(Constants.AuthorizeUrl),new Uri(redirectUri),new Uri(Constants.AccesstokenUrl),true); 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的“常量”类的来源
public static class Constants { public static string AppName = "...."; // OAuth // For Google login,configure at https://console.developers.google.com/ public static string iOSClientId = "6.....apps.googleusercontent.com"; public static string AndroidClientId = "6.....apps.googleusercontent.com"; // These values do not need changing public static string Scope = "https://www.googleapis.com/auth/userinfo.email"; public static string AuthorizeUrl = "https://accounts.google.com/o/oauth2/auth"; public static string AccesstokenUrl = "https://www.googleapis.com/oauth2/v4/token"; public static string UserInfoUrl = "https://www.googleapis.com/oauth2/v2/userinfo"; // Set these to reversed iOS/Android client ids,with :/oauth2redirect appended public static string iOSRedirectUrl = "com.googleusercontent.apps.6......h:/oauth2redirect"; public static string AndroidRedirectUrl = "com.googleusercontent.apps.6......l:/oauth2redirect"; }
>验证完成/错误的已实现方法的来源,实际上我仍然因为我的错误而无法点击
async void OnAuthCompleted(object sender,AuthenticatorCompletedEventArgs e) { var authenticator = sender as OAuth2Authenticator; if (authenticator != null) { authenticator.Completed -= OnAuthCompleted; authenticator.Error -= OnAuthError; } GoogleLoginUser user = null; if (e.IsAuthenticated) { var request = new OAuth2Request("GET",new Uri(Constants.UserInfoUrl),e.Account); var response = await request.GetResponseAsync(); if (response != null) { string userjson = await response.GetResponseTextAsync(); user = JsonConvert.DeserializeObject(userjson); } if (_account != null) { _store.Delete(_account,Constants.AppName); } await _store.SaveAsync(_account = e.Account,Constants.AppName); await displayAlert("Email address",user.Email,"OK"); } } void OnAuthError(object sender,AuthenticatorErrorEventArgs e) { var authenticator = sender as OAuth2Authenticator; if (authenticator != null) { authenticator.Completed -= OnAuthCompleted; authenticator.Error -= OnAuthError; } var message = e.Message; }
>我添加的Android MainActivity的来源
public class MainActivity : FormsAppCompatActivity { protected override void OnCreate(Bundle bundle) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(bundle); Forms.Init(this,bundle); global::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")] public class CustomUrlSchemeInterceptorActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); var uri = new Uri(Intent.Data.ToString()); AuthenticationState.Authenticator.OnPageLoading(uri); Finish(); } }
以下是我深入研究的主要文章=> 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
>之后我的问题解决了.
解决方法
维杰.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。