从平台特定(UWP)PageRenderer导航并返回PCL页面

时间:2017-02-18 23:58:48

标签: xamarin.forms xamarin.auth xamarin.uwp

  • 我在PCL中有一个MainPage,然后导航到Platform Specific LoginButton上的登录页面单击事件
  • LoginPage继承自 特定于平台的PageRenderer,因为它需要特定于平台 对社交提供商的身份验证(Facebook,Google,Twitter, 微软等。)
  • 我正在使用Xamarin.Auth进行身份验证。
  • 在LoginPage的OnElementChanged事件中,它实例化 OAuth2Authenticator对象。
  • 成功实例化(基于 在提供者和应用程序的详细信息),它需要调用特定的UI 提供商。
  • 为此,我将auth.GetUI称为auth Xamarin.Auth.OAuth2Authenticator对象。

我有两个问题:

  1. 在UWP中,如何导航到提供程序登录UI?更具体地说,iOS和Android中以下代码片段在UWP中的等价物是什么?在iOS中,使用以下代码: PresentViewController(auth.GetUI(), true, null); 其中auth是Xamarin.Auth.OAuth2Authenticator对象。 在Android中使用以下内容: activity.StartActivity(auth.GetUI(activity));
  2. 我正在寻找UWP中的等效代码。请记住,这些调用是从LoginPage进行的,该LoginPage是从特定于平台的PageRenderer

    派生的
    1. 成功验证后如何导航回我的MainPage(在PCL中)?
    2. 代码基于以下来源的示例: http://www.c-sharpcorner.com/article/oauth-login-authenticating-with-identity-provider-in-xamarin-forms/

      这是我的LoginPage代码:

      using System;
      using Valufy;
      using Xamarin.Forms.Platform.UWP;
      using System.ComponentModel;
      using Valufy.UWP;
      using Valufy.AuthConfiguration;
      using Xamarin.Forms;
      [assembly: ExportRenderer(typeof(ProviderLoginPage), typeof(LoginRenderer))]
      
      namespace Valufy.UWP
      {
      class LoginRenderer: PageRenderer
      {
      protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Page> e)
      {
          base.OnElementChanged(e);
      
          //Get and Assign ProviderName from ProviderLoginPage
          ProviderLoginPage loginPage = (ProviderLoginPage)Element;
          string providername = loginPage.ProviderName;
      
              //Create OauthProviderSetting class with Oauth Implementation .Refer Step 6
              OAuthProviderSetting oauth = new OAuthProviderSetting();
      
                  Xamarin.Auth.OAuth2Authenticator auth = oauth.LoginWithProvider(providername);  
      
                  // After facebook,google and all identity provider login completed 
                  auth.Completed += Auth_Completed;
      
                  Type page_type = auth.GetUI();
      //////THIS IS WHERE I AM STUCK...HOW DO I GO TO THE PROVIDER AUTH UI ////////////
      
      //this.Frame.Navigate(page_type, auth);
      //parentPage.Navigation.PushModalAsync(auth.GetUI());
      
                  }
      
          }
      
          private void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
          {
              if (e.IsAuthenticated)
              {
                  OAuthConfig.User = new UserDetails();
                  // Get and Save User Details 
                  OAuthConfig.User.Token = e.Account.Properties["oauth_token"];
                  OAuthConfig.User.TokenSecret = e.Account.Properties["oauth_token_secret"];
                  OAuthConfig.User.TwitterId = e.Account.Properties["user_id"];
              OAuthConfig.User.ScreenName = e.Account.Properties["screen_name"];
      
      /////NOW, HOW GO I GO BACK TO THE CALLING PAGE IN PCL ///////////////////
      
          }
          else
          {
              // The user cancelled
      /////NOW, HOW GO I GO BACK TO THE CALLING PAGE IN PCL ///////////////////
      }
      }
      }
      }                
      

2 个答案:

答案 0 :(得分:1)

以下是导航到UWP的提供者登录的代码:                         WindowsPage windowsPage = new WindowsPage();

                _frame = windowsPage.Frame;
                if (_frame == null)
                {
                    _frame = new Windows.UI.Xaml.Controls.Frame
                    {
                        Language = global::Windows.Globalization.ApplicationLanguages.Languages[0]
                    };
                    windowsPage.Content = _frame;
                    SetNativeControl(windowsPage);
                }

                Type pageType = auth.GetUI();
                _frame.Navigate(pageType, auth);

要在成功验证后导航回我的页面,请输入以下代码:

private async void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
    {
        if (e.IsAuthenticated)
        {

            var request = new OAuth2Request("GET", new Uri("https://login.microsoftonline.com/common/oauth2/V2.0/token?oauth2_access_token=" + e.Account.Properties["access_token"]), null, e.Account);
            try
            {
                string response = await MSGetUserInfo(e.Account);


            }
            catch (System.OperationCanceledException)
            {
                                }
            catch (Exception ex)
            {
                                }
            this.Element.Navigation.PushModalAsync(new MainPage());


        }
        else
        {
            // The user cancelled
        }
    }

答案 1 :(得分:0)

  

1-在UWP中,如何导航到提供者登录UI

您需要创建一个UWP Page对象,您将用于在渲染器中显示的对象是您将用于执行导航的对象。

Type page_type = auth.GetUI();

page = new MyUWPLoginPage();

page.Frame.Navigate(page_type, auth);
  

2-如何在成功验证后导航回我的MainPage(在PCL中)?

有很多方法可以做到这一点,最简单的方法是在ProviderLoginPage类中创建一个公共方法,并从渲染器类中调用此方法并传入参数。

public class ProviderLoginPage: ContentPage
{
    ......

    public void AuthenticationCompleted(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
    {
        // Do your logic
    }

}

在使用元素的渲染器中:

private void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
{
    var xamElement = Element as ProviderLogin;

    xamElement?.AuthenticationCompleted(sender, e);
}

将所有逻辑移动到PCL类,这样就不必在每个渲染器上重复它。

这应该有所帮助。