Dela via


Starta en app för resultat

viktiga API:er

Lär dig hur du startar en app från en annan app och utbyter data mellan de två. Detta kallas att starta en app för resultat. Exemplet här visar hur du använder LaunchUriForResultsAsync för att starta en app för resultat.

Nya API:er för app-till-app-kommunikation i Windows 10 gör det möjligt för Windows-appar (och Windows-webbappar) att starta en app och utbyta data och filer. På så sätt kan du skapa kombinationslösningar från flera appar. Med hjälp av dessa nya API:er kan komplexa uppgifter som skulle ha krävt att användaren använder flera appar nu hanteras sömlöst. Din app kan till exempel starta en app för sociala nätverk för att välja en kontakt eller starta en utcheckningsapp för att slutföra en betalningsprocess.

Den app som du ska starta för resultat kallas för den lanserade appen. Appen som startar appen kallas den anropande appen. I det här exemplet skriver du både den anropande appen och den lanserade appen.

Steg 1: Registrera protokollet som ska hanteras i appen som du ska starta för resultat

I filen Package.appxmanifest i den lanserade appen lägger du till ett protokolltillägg i <avsnittet Program> . Exemplet här använder ett fiktivt protokoll med namnet test-app2app.

Attributet ReturnResults i protokolltillägget accepterar något av följande värden:

I det här exemplet på protokolltillägg kan appen endast startas för resultat. Detta förenklar logiken i metoden OnActivated , som beskrivs nedan, eftersom vi bara måste hantera fallet "startad för resultat" och inte på andra sätt som appen kan aktiveras på.

<Applications>
   <Application ...>

     <Extensions>
       <uap:Extension Category="windows.protocol">
         <uap:Protocol Name="test-app2app" ReturnResults="always">
           <uap:DisplayName>Test app-2-app</uap:DisplayName>
         </uap:Protocol>
       </uap:Extension>
     </Extensions>

   </Application>
</Applications>

Steg 2: Åsidosätt program.OnActivated i appen som du ska starta för resultat

Om den här metoden inte redan finns i den lanserade appen skapar du den i den App klass som definierats i App.xaml.cs.

I en app där du kan välja dina vänner i ett socialt nätverk kan den här funktionen vara där du öppnar vänväljarsidan. I nästa exempel visas en sida med namnet LaunchedForResultsPage när appen aktiveras för resultat. Kontrollera att med hjälp av-instruktionen finns överst i filen.

using Windows.ApplicationModel.Activation;
...
protected override void OnActivated(IActivatedEventArgs args)
{
    // Window management
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
    }

    // Code specific to launch for results
    var protocolForResultsArgs = (ProtocolForResultsActivatedEventArgs)args;
    // Open the page that we created to handle activation for results.
    rootFrame.Navigate(typeof(LaunchedForResultsPage), protocolForResultsArgs);

    // Ensure the current window is active.
    Window.Current.Activate();
}
using namespace winrt::Windows::ApplicationModel::Activation;
...
protected override void OnActivated(IActivatedEventArgs args)
{
    // Window management
    Frame rootFrame{ nullptr };
    auto content = Window::Current().Content();
    if (content)
    {
        rootFrame = content.try_as<Frame>();
    }
    
    if (rootFrame == null)
    {
        rootFrame = Frame();
        Window::Current().Content(rootFrame);
    }

    // Code specific to launch for results
    auto protocolForResultsEventArgs{ args.as<ProtocolForResultsActivatedEventArgs>() };
    // Open the page that we created to handle activation for results.
    rootFrame.Navigate(xaml_typename<LaunchedForResultsPage>(), protocolForResultsArgs);

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

Eftersom protokolltillägget i filen Package.appxmanifest anger ReturnResults som alltid, kan den visade koden casta args direkt till ProtocolForResultsActivatedEventArgs med säkerhet om att endast ProtocolForResultsActivatedEventArgs skickas till OnActivated för den här appen. Om din app kan aktiveras på andra sätt än att starta för resultat kan du kontrollera om egenskapen IActivatedEventArgs.Kind returnerar ActivationKind.ProtocolForResults för att avgöra om appen startades för resultat.

Steg 3: Lägg till ett ProtocolForResultsOperation-fält i appen som du startar för resultat

private Windows.System.ProtocolForResultsOperation _operation = null;
Windows::System::ProtocolForResultsOperation _operation = nullptr;

Du använder fältet ProtocolForResultsOperation för att signalera när den lanserade appen är redo att returnera resultatet till den anropande appen. I det här exemplet läggs fältet till i klassen LaunchForResultsPage eftersom du slutför åtgärden launch-for-results från den sidan och behöver åtkomst till den.

Steg 4: Åsidosätt OnNavigatedTo() i appen som du startar för resultat

Åsidosätt metoden OnNavigatedTo på den sida som du kommer att visa när appen startas för resultat. Om den här metoden inte redan finns skapar du den i klassen för sidan som definieras i <sidnamn>.xaml.cs. Kontrollera att följande med hjälp av-instruktionen finns överst i filen:

using Windows.ApplicationModel.Activation
using namespace winrt::Windows::ApplicationModel::Activation;

Objektet NavigationEventArgs i metoden OnNavigatedTo innehåller data som skickas från den anropande appen. Data får inte överstiga 100 KB och lagras i ett ValueSet-objekt .

I den här exempelkoden förväntar sig den lanserade appen att data som skickas från den anropande appen ska finnas i en ValueSet under en nyckel med namnet TestData, eftersom det är vad exemplets anropande app kodas för att skicka.

using Windows.ApplicationModel.Activation;
...
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var protocolForResultsArgs = e.Parameter as ProtocolForResultsActivatedEventArgs;
    // Set the ProtocolForResultsOperation field.
    _operation = protocolForResultsArgs.ProtocolForResultsOperation;

    if (protocolForResultsArgs.Data.ContainsKey("TestData"))
    {
        string dataFromCaller = protocolForResultsArgs.Data["TestData"] as string;
    }
}
...
private Windows.System.ProtocolForResultsOperation _operation = null;
using namespace winrt::Windows::ApplicationModel::Activation;
...
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    auto protocolForResultsArgs = e.Parameter().try_as<ProtocolForResultsActivatedEventArgs>();
    // Set the ProtocolForResultsOperation field.
    _operation = protocolForResultsArgs.ProtocolForResultsOperation();

    if (protocolForResultsArgs.Data().HasKey("TestData"))
    {
        string dataFromCaller{ unbox_value<hstring>(protocolForResultsArgs.Data().Lookup("TestData")) };
    }
}
...
Windows::System::ProtocolForResultsOperation _operation = nullptr;

Steg 5: Skriv kod för att returnera data till den anropande appen

I den lanserade appen använder du ProtocolForResultsOperation för att returnera data till den anropande appen. I den här exempelkoden skapas ett ValueSet-objekt som innehåller värdet som ska returneras till den anropande appen. Fältet ProtocolForResultsOperation används sedan för att skicka värdet till den anropande appen.

    ValueSet result = new ValueSet();
    result["ReturnedData"] = "The returned result";
    _operation.ReportCompleted(result);
    ValueSet result;
    result.Insert("ReturnedData", "The returned result");
    _operation.ReportCompleted(result);

Steg 6: Skriv kod för att starta appen för resultat och hämta returnerade data

Starta appen inifrån en asynkron metod i din anropande app enligt den här exempelkoden. Observera med användning av-instruktioner, som krävs för att koden ska kompilera:

using System.Threading.Tasks;
using Windows.System;
...

async Task<string> LaunchAppForResults()
{
    var testAppUri = new Uri("test-app2app:"); // The protocol handled by the launched app
    var options = new LauncherOptions();
    options.TargetApplicationPackageFamilyName = "67d987e1-e842-4229-9f7c-98cf13b5da45_yd7nk54bq29ra";

    var inputData = new ValueSet();
    inputData["TestData"] = "Test data";

    string theResult = "";
    LaunchUriResult result = await Windows.System.Launcher.LaunchUriForResultsAsync(testAppUri, options, inputData);
    if (result.Status == LaunchUriStatus.Success &&
        result.Result != null &&
        result.Result.ContainsKey("ReturnedData"))
    {
        ValueSet theValues = result.Result;
        theResult = theValues["ReturnedData"] as string;
    }
    return theResult;
}

I det här exemplet skickas en ValueSet som innehåller nyckeln TestData till den lanserade appen. Den lanserade appen skapar en ValueSet med en nyckel med namnet ReturnedData som innehåller resultatet som returneras till anroparen.

Du måste skapa och distribuera den app som du ska starta för att få resultat innan du kör din samtalsapp. Annars kommer LaunchUriResult.Status att rapportera LaunchUriStatus.AppUnavailable.

Du behöver familjenamnet för den lanserade appen när du anger TargetApplicationPackageFamilyName. Ett sätt att hämta familjenamnet är att göra följande anrop inifrån den lanserade appen:

string familyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;

Anmärkningar

Exemplet i de här instruktionerna ger en "hello world"-introduktion till att starta en app för att uppnå resultat. Det viktigaste att tänka på är att det nya LaunchUriForResultsAsync-API :et låter dig starta en app asynkront och kommunicera via klassen ValueSet . Dataöverföring via en ValueSet är begränsad till 100 KB. Om du behöver skicka större mängder data kan du dela filer med hjälp av klassen SharedStorageAccessManager för att skapa filtoken som du kan skicka mellan appar. Med en ValueSet med namnet inputDatakan du till exempel lagra token i en fil som du vill dela med den lanserade appen:

inputData["ImageFileToken"] = SharedStorageAccessManager.AddFile(myFile);

Skicka den sedan till den lanserade appen via LaunchUriForResultsAsync.