저는 Xamarin.Forms 및 Xamarin.Auth를 사용하여 Facebook으로 로그인하는 응용 프로그램을 구축하고 있습니다. 여기 Xamarin.Forms PopModalAsync가 작동하지 않습니다.
내가 뭘하는지입니다 :App.cs :
public App()
{
if (IsAuthenticated)
{
MainPage = new NavigationPage(new DetailPage());
}
else {
MainPage = new NavigationPage(new WelcomePage());
}
}
public Action SuccessfulLoginAction
{
get
{
return new Action(() => MainPage.Navigation.PopModalAsync());
}
}
WelcomePage :
using System;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace Project
{
public class WelcomePage : ContentPage
{
public WelcomePage()
{
var login = new Button { Text = "Login" };
login.Clicked += async (sender, e) =>
{
await Navigation.PushModalAsync(new LoginPage());
};
Content = new StackLayout
{
BackgroundColor = Color.FromHex("F0C640"),
Padding = new Thickness(10, 40, 10, 10),
Children = {
new Label { Text = "Welcome", FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), HorizontalTextAlignment = TextAlignment.Center, TextColor = Color.White },
new Label { Text = "Please login", FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), HorizontalTextAlignment = TextAlignment.Center, TextColor = Color.White },
login
}
};
}
}
}
LoginPage :
using Xamarin.Forms;
using System.Threading.Tasks;
namespace Project
{
public class LoginPage : ContentPage
{
}
}
LoginRenderer :
using System;
using Xamarin.Auth;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using Project;
using Project.iOS;
[assembly: ExportRenderer(typeof(LoginPage), typeof(LoginPageRenderer))]
namespace Project.iOS
{
public class LoginPageRenderer : PageRenderer
{
bool IsShown;
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
// Fixed the issue that on iOS 8, the modal wouldn't be popped.
// url : http://stackoverflow.com/questions/24105390/how-to-login-to-facebook-in-xamarin-forms
if (!IsShown)
{
IsShown = true;
var auth = new OAuth2Authenticator(
clientId: App.Instance.OAuthSettings.ClientId, // your OAuth2 client id
scope: App.Instance.OAuthSettings.Scope, // The scopes for the particular API you're accessing. The format for this will vary by API.
authorizeUrl: new Uri(App.Instance.OAuthSettings.AuthorizeUrl), // the auth URL for the service
redirectUrl: new Uri(App.Instance.OAuthSettings.RedirectUrl)); // the redirect URL for the service
auth.Completed += (sender, eventArgs) =>
{
// We presented the UI, so it's up to us to dimiss it on iOS.
DismissViewController (true, null);
if (eventArgs.IsAuthenticated)
{
Console.WriteLine("Authenticated!!!!");
App.Instance.SaveToken(eventArgs.Account.Properties["access_token"]);
App.Instance.SuccessfulLoginAction.Invoke();
}
else {
Console.WriteLine("Not authenticated!!!!");
App.Instance.CanceledLoginAction.Invoke();
}
};
PresentViewController(auth.GetUI(), true, null);
}
}
}
}
모든 것이 잘 작동하며, Facebook 콘텐츠 및 로그인으로 모달 페이지를 표시 할 수 있습니다. 인증이 완료되면 auth.Completed 이벤트를 통해 App.Instance.SuccessfulLoginAction.Invoke();를 호출합니다. 그러나 App.cs의 MainPage.Navigation.PopModalAsync()는 모달 페이지를 닫지 않습니다.
모달 페이지가 시작 페이지에서 열리고 App.cs 파일에서 닫으려고합니다. 동일한 객체를 참조하지 않아서 여기에서 닫을 수 없습니까? 플랫폼 별 렌더러를 만들 때 모달 페이지를 닫으려면 어떻게해야합니까?
이 모달 페이지를 닫으려면 어떻게해야합니까? App.cs
이후
public void HandleLoginSucceeded(object sender, EventArgs e)
{
MainPage = new WelcomePage();
}
이 진입 점입니다 난 그냥 새를 가리 키도록 MainPage를 재설정 : I 인증을 위해 내 샘플에서 인증을 처리하는 방법을
감사