从平台特定(UWP)Pagerenderer导航,然后返回到PCL页面


  • 我在PCL中有一个主页,然后导航到特定平台登录页面上的loginbutton点击事件
  • 登录页是从平台特定的pagerenderer,因为它需要特定平台对社会提供商的身份验证(Facebook,Google,Twitter,Microsoft等)
  • 我正在使用Xamarin.auth进行身份验证。
  • 在登录页的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));

我正在寻找UWP中的等效代码。请记住,这些电话是由登录页进行的,该登录页是从平台特定的Pagerenderer

中得出的
  1. 成功身份验证后,如何导航到我的主页(在PCL中)?

该代码基于以下来源的样本:http://www.c-sharpcorner.com/article/oauth-login-authenticating-with-indentity-provider-in-xamarin-forms/

这是我的登录代码:

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 ///////////////////
}
}
}
}                

这是导航到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-在UWP中,如何导航到提供商登录UI

您需要创建一个UWP页面对象,在渲染器中显示的相同对象是您将使用导航的对象。

Type page_type = auth.GetUI();
page = new MyUWPLoginPage();
page.Frame.Navigate(page_type, auth);

2-成功身份验证后如何导航到我的主页(在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类,因此您不必在每个渲染器上重复它。

这应该有帮助。

相关内容

  • 没有找到相关文章

最新更新