我目前正在开发一个应用程序,其中我们有一个名为“提示”的功能,本质上是微博。在这些基于html的博客中,您可以通过普通的超链接链接到我们的应用程序中存在的其他“内容”。
该应用程序设置为打开这些链接的URL方案,并且所有平台都有自己的代码,通过MessagingCenter将新uri汇集到xamarin表单应用程序中,MessagingCenter在App类中有一个订阅者,如下所示:
MessagingCenter.Subscribe(Current, DoshiMessages.NewUri, async (Application app, string uri) =>
{
var result = await HandleUriNavAsync(uri);
if (!result)
await Container.Resolve<IUserDialogs>().AlertAsync("Link was invalid");
});
哪个电话:
private async Task<bool> HandleUriNavAsync(string uri)
{
if (uri == null)
return false;
await NavigationService.NavigateAsync(new Uri(uri, UriKind.Absolute));
return true;
}
现在这对于绝对的uri来说效果很好但是如果我把它改成了
//Example: uri = www.example.com/main/nav/test?userid=0
private async Task<bool> HandleUriNavAsync(string uri)
{
if (uri == null)
return false;
//Example: relative = test?userid=0
var relative = uri.Split('/').Last();
await NavigationService.NavigateAsync(new Uri(relative, UriKind.Relative));
return true;
}
导航永远不会触发,但不会抛出异常并且任务成功完成(我已经检查过)。请注意,上面的代码在应用程序已经运行且已有活动的视图模型时执行。
有没有明显的东西,我做错了,是否有更好的方法来实现这一目标?
干杯!
所以我最终找到了一个非常好的解决方法。这有点粗略,但因为我的所有视图模型都继承了一个公共基类,所以我可以在Prism PageUtils的帮助下获得当前的viewmodel
MessagingCenter.Subscribe(Current, DoshiMessages.NewUri, async (Application app, string uri) =>
{
try
{
var relative = uri.Split('/').LastOrDefault();
if(relative != null)
{
var currentVM = PageUtilities.GetCurrentPage(MainPage).BindingContext as ViewModelBase;
await currentVM.HandleNewUriAsync(relative);
}
}
catch(Exception ex)
{
Crashes.TrackError(ex);
}
});
然后只需在当前视图模型中执行导航
public async Task HandleNewUriAsync(string uri)
{
await _navigationService.NavigateAsync(new Uri(uri, UriKind.Relative));
}