有没有办法在mvvmcross框架中通过Facebook验证用户?我目前正在尝试使用Mobile Azure Service对Facebook进行身份验证,但我没有任何成功。如果不使用mvvmcross,我可以进行身份验证。
谢谢! 标记
答案 0 :(得分:6)
在MVVM意义上我发现的是不,你不能。 Facebook登录页面上的属性不具有可绑定性,也不应该是最佳对象,并且最好将其视为控制之外的模态视图
我要做的是将其视为关注点,并使用Xamarin.Auth进行身份验证。
作为一个例子,假设你有一个LoginView和LoginViewModel。
LoginView提供标准登录电子邮件/密码,但有一个选项(按钮)可通过Facebook进行身份验证
从该视图连接到facebooklogin按钮的touchupinside事件
this.btnFacebookLogin.TouchUpInside += (object sender, EventArgs e) =>
{
DoFacebookLogin ();
}
然后在你的DoFacebookLogin方法中“呈现”这里描述的facebook的viewcontroller https://github.com/xamarin/Xamarin.Auth/blob/master/GettingStarted.md
例如:
private void DoFacebookLogin ()
{
var auth = new OAuth2Authenticator (
clientId: "yournumericclientidhere",
scope: "",
authorizeUrl: new Uri ("https://m.facebook.com/dialog/oauth/"),
redirectUrl: new Uri ("http://www.facebook.com/connect/login_success.html"));
auth.AllowCancel = true;
auth.Completed += (sender, eventArgs) => {
DismissViewController (false, null);
if (eventArgs.IsAuthenticated) {
string user = eventArgs.Account.Serialize ();
var messenger = Mvx.Resolve<IMvxMessenger> ();
messenger.Publish (new FacebookLoggedIn (user));
} else {
// Cancelled here
}
};
var vc = auth.GetUI ();
this.PresentViewController (vc, true, null);
}
取消不需要处理,因为模态viewcontroller会将你带回LoginView
如果成功解除了viewcontroller,那么我会使用mvx对eventaggregator(plugins.messenger)的解释来向viewmodel发送一条消息,告知facebook模式视图已关闭,可以通过该消息传递帐户详细信息 - accesstoken等回到viewmodel按你的意愿去做。
查看(如上所述):
string user = eventArgs.Account.Serialize();
var messenger = Mvx.Resolve<IMvxMessenger> ();
messenger.Publish (new FacebookLoggedIn (user));
PCL中的消息类:
public class FacebookLoggedIn : MvxMessage
{
public FacebookLoggedIn(object sender) : base(sender) {}
}
ViewModel也在您的PCL中:
public LoginViewModel()
{
var messenger = Mvx.Resolve<IMvxMessenger> ();
user = messenger.SubscribeOnMainThread<FacebookLoggedIn> (OnFacebookLoggedIn);
}
private void OnFacebookLoggedIn (FacebookLoggedIn MvxMessage)
{
... do something with the accesstoken? call your IUserService etc
ShowViewModel<MainViewModel> ();
}
由于您正在解雇facebook viewcontroller,您会在自动导航到MainView之前发现自己回到loginview上
在您的视图项目中,您需要确保加载插件,否则在构建视图模型期间会收到错误,因此在setup.cs中
protected override void InitializeLastChance ()
{
Cirrious.MvvmCross.Plugins.Messenger.PluginLoader.Instance.EnsureLoaded();
base.InitializeLastChance ();
}
此外,您还可以在本地存储帐户凭据,这在AccountStore.Create()下的Xamarin.Auth链接中有所描述。保存。请注意,如果您收到平台不支持的异常,请将PLATFORM_IOS作为预处理程序指令添加到您的项目中。
我意识到这个问题已经有几个月的历史了,但是由于谷歌的价格很高,我认为我会提供一个答案,因为没有任何