Xamarin.Auth(Android) - Chrome自定义标签在重定向时不会关闭

时间:2017-07-27 12:33:29

标签: android google-chrome xamarin.forms xamarin.auth

我已经实施了Xamarin.Auth sample code,以便在Android上与google的身份提供商进行身份验证。我已成功使用设备的Chrome浏览器导航到Google登录页面,我可以在其中输入凭据。我已成功通过Google授权,但Chrome自定义标签在重定向回我的应用时并未关闭,即我在Chrome浏览器中查看谷歌搜索。如果我关闭浏览器,我可以再次看到我的应用,并显示从谷歌身份提供商返回的用户详细信息。

为什么Chrome的自定义标签不会从Google身份提供商重定向关闭,如何使用Xamarin Forms和Xamarin.Auth关闭它?

1 个答案:

答案 0 :(得分:8)

如果您在Android中的Xamarin.Auth示例中捕获Redirect(CustomUrlSchemeInterceptorActivity)的类中将此代码添加到OnCreate方法的末尾,则可以返回到您的应用程序

new Task(() =>{
         StartActivity(new Intent(Application.Context,typeof(MainActivity)));
     }).Start();

其中MainActivity是Android中主要Activity类的名称。 更确切地说,这是一个完整的类,您可以为每个截取的重定向继承

public class UrlSchemeInterceptor : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        try
        {
            base.OnCreate(savedInstanceState);

            // Convert Android.Net.Url to Uri
            var uri = new Uri(Intent.Data.ToString());
            new Task(() =>
            {
                var intent = new Intent(ApplicationContext, typeof(MainActivity));
                intent.AddFlags(ActivityFlags.IncludeStoppedPackages);
                intent.AddFlags(ActivityFlags.ReorderToFront);
                StartActivity(intent);

            }).Start();

            // Load redirectUrl page
            AuthenticationState.Authenticator.OnPageLoading(uri);
            Finish();

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

}

public class AuthenticationState
{
    public static WebAuthenticator Authenticator;
   /*This static field is used to store the object
   from OAuth1Authenticator or OAuth2Authenticator
   upon initialization in the UI (Xamarin forms or Android or iOS).
   For example:
   var authenticatorObject = new  OAuth2Authenticator (YOUR PARAMETERS);
   AuthenticationState.Authenticator = (WebAuthenticator)authenticatorObject;
    var presenter = new OAuthLoginPresenter();
        presenter.Login(authenticatorObject);
    */
}

例如在谷歌案例中

[Activity(Label = "YOURLABEL", NoHistory = true, LaunchMode = LaunchMode.SingleTop)]
[IntentFilter( new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
    DataSchemes = new[]
    {
        "com.googleusercontent.apps.",// YOUR GOOGLE ID INVERTED
    },
    DataPaths = new[]
    {
        "/oauth2redirect",
    })]
public class GoogleUrlSchemeInterceptorActivity : UrlSchemeInterceptor { }