我仍然习惯于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.CategoryDe​​fault,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 1Link 2Link 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。而已。您应该能够使其正常运行。

维杰

10-07 13:55