使用 Xamarin.Forms 和 MvvmCross UWP 从另一个应用程序打开应用程序

Open app from another app with Xamarin.Forms and MvvmCross UWP

从另一个应用程序打开应用程序可以像这样完成:

public async Task<bool> LaunchUriAsync(string objectNumber)
{
  var option = new LauncherOptions();
  option.UI.PreferredPlacement = Placement.Right;
  option.DesiredRemainingView = ViewSizePreference.UseMore;
  return await Launcher.LaunchUriAsync(buildObjectAccessUri(objectNumber), option);
}


private static Uri buildObjectAccessUri(string objectId)
{
  return new Uri(String.Format("{0}://{1}/{2}", "myapp", "data", objectId), UriKind.Absolute);
}

在我执行的命令中:

await MyLauncherService.LaunchUriAsync("whatever");

在打开的应用程序中我有一个自定义开始

public class CustomAppStart : MvxAppStart
{
    protected override async Task NavigateToFirstViewModel(object hint = null)
    {
        // hint here is type of `Windows.ApplicationModel.Activation.ProtocolActivatedEventArgs`
    }
}

对象 hint 似乎是 Windows.ApplicationModel.Activation.ProtocolActivatedEventArgs

的类型

UWP项目App.xaml.cs

sealed partial class App
{
    public App()
    {
      InitializeComponent();
    }  
}

public abstract class UwpApp : MvxApplication<Setup<Core.App>, Core.App>
{
    private ILoggerService mLoggerService;
    public UwpApp()
    {
      UnhandledException += (sender, args) =>
      {
        mLoggerService = Mvx.IoCProvider.Resolve<ILoggerService>();
        if (mLoggerService == null)
        {
          return;
        }
        mLoggerService.Fatal("Unhandled exception!", args.Exception);
      };

      DebugSettings.BindingFailed += (sender, args) => Debug.WriteLine(args.Message);
      TaskScheduler.UnobservedTaskException += (sender, args) =>
      {
        mLoggerService = Mvx.IoCProvider.Resolve<ILoggerService>();
        if (mLoggerService == null)
        {
          return;
        }
        foreach (var ex in args.Exception.Flatten().InnerExceptions)
        {
          mLoggerService.Error(ex.Message + " StackTrace:" + ex.StackTrace);
        }
        args.SetObserved();
      };
      Suspending += OnSuspending;
      ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.Auto;
    }
    protected override void OnSuspending(object sender, SuspendingEventArgs e)
    {
      var deferral = e.SuspendingOperation.GetDeferral();
      deferral.Complete();
    }
}

为什么我得到那个?

我希望是字符串...

错在哪里?

我正在使用最新版本的 xamarin 和 mvvm cross

在您的 MvxApplication 中,您可以重写 GetAppStartHint 以处理进入该方法的对象,并 return 一个您期望的字符串。

类似于:

public abstract class UwpApp : MvxApplication<Setup<Core.App>, Core.App>
{
    protected override object GetAppStartHint(object hint = null)
    {
        // process hint
        //return string
    }
}