Как работать с URI-приложением URI, которое использует Windows Template Studio

В соответствии с Microsoft Docs вы можете обрабатывать приложения URI с этим кодом

protected override void OnActivated(IActivatedEventArgs args)
{
  if (args.Kind == ActivationKind.Protocol)
  {
     ProtocolActivatedEventArgs eventArgs = args as ProtocolActivatedEventArgs;
     // TODO: Handle URI activation
     // The received URI is eventArgs.Uri.AbsoluteUri
  }
 }

Но это было, когда приложение создается из шаблона по умолчанию. Мой проект UWP создан с помощью Windows Template Studio, и в настоящее время я полагаю, что место, куда я должен поместить этот код, теперь

protected override async void OnActivated(IActivatedEventArgs args)
{
    await ActivationService.ActivateAsync(args);
}

Что приводит к этому..

public async Task ActivateAsync(object activationArgs)
{
    if (IsInteractive(activationArgs))
    {
       // Initialize things like registering background task before the app is loaded
       await InitializeAsync();
       // Do not repeat app initialization when the Window already has content,
       // just ensure that the window is active
       if (Window.Current.Content == null)
       {
           // Create a Frame to act as the navigation context and navigate to the first page
           Window.Current.Content = _shell;
           NavigationService.Frame.NavigationFailed += (sender, e) =>
           {
                throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
           };
           NavigationService.Frame.Navigated += OnFrameNavigated;
           if (SystemNavigationManager.GetForCurrentView() != null)
           {
                SystemNavigationManager.GetForCurrentView().BackRequested += OnAppViewBackButtonRequested;
           }
        }
     }
     var activationHandler = GetActivationHandlers().FirstOrDefault(h => h.CanHandle(activationArgs);
     if (activationHandler != null)
     {
         await activationHandler.HandleAsync(activationArgs);
     }
     if (IsInteractive(activationArgs))
     {
         var defaultHandler = new DefaultLaunchActivationHandler(_defaultNavItem);
         if (defaultHandler.CanHandle(activationArgs))
         {
             await defaultHandler.HandleAsync(activationArgs);
         }
         // Ensure the current window is active
         Window.Current.Activate();
         // Tasks after activation
         await StartupAsync();
      }
 }

Пожалуйста, если кто-то использовал Windows Template Studio раньше. Пожалуйста, скажите мне, как обращаться с Ури в этом коде. Я не знаю, где его вставить. В настоящее время мое приложение запускается на пустой странице при запуске из Uri.

1 ответ

Решение

Не уверен, что вы все еще ищете это, но я только что понял это.

Следуйте инструкциям в документации для добавления аутентификации в ваше приложение здесь: https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-windows-store-dotnet-get-started-users

Но с двумя отличиями:

Во-первых, не изменяйте свой метод OnNavigatedTo на MainPage.cs, поскольку в документах указано, что вам нужно сделать это, оставьте его по умолчанию.

и затем в вашем ActivationService.cs измените следующее:

        if (IsInteractive(activationArgs))
        {
            var defaultHandler = new DefaultLaunchActivationHandler(_defaultNavItem);
            if (defaultHandler.CanHandle(activationArgs))
            {
                await defaultHandler.HandleAsync(activationArgs);
            }

            // Ensure the current window is active
            Window.Current.Activate();

            // Tasks after activation
            await StartupAsync();
        }

добавив это:

            if (((IActivatedEventArgs)activationArgs).Kind == ActivationKind.Protocol)
            {
                var protocolEventArgs = activationArgs as ProtocolActivatedEventArgs;
                App.<<YOUR_CLOUD_SERVICE_NAME_HERE>>.ResumeWithURL(protocolEventArgs.Uri);
            }

Это результат:

        if (IsInteractive(activationArgs))
        {
            var defaultHandler = new DefaultLaunchActivationHandler(_defaultNavItem);
            if (defaultHandler.CanHandle(activationArgs))
            {
                await defaultHandler.HandleAsync(activationArgs);
            }

            if (((IActivatedEventArgs)activationArgs).Kind == ActivationKind.Protocol)
            {
                var protocolEventArgs = activationArgs as ProtocolActivatedEventArgs;
                App.KPMPClient.ResumeWithURL(protocolEventArgs.Uri);
            }

            // Ensure the current window is active
            Window.Current.Activate();

            // Tasks after activation
            await StartupAsync();
        }

Надеюсь, это поможет. Получил удовольствие для меня:)

Другие вопросы по тегам