Sdílet prostřednictvím


Odeslání místního app oznámení z aplikací pro UWP jazyka C++

Oznámení app je zpráva, kterou může vaše app vytvořit a doručit uživateli, když nejsou momentálně uvnitř vašeho app.

Snímek obrazovky s oznámením app

Tento rychlý start vás provede postupem vytvoření, doručování a zobrazení oznámení windows 10 nebo Windows 11 app pomocí bohatého obsahu a interaktivních akcí. V tomto rychlém startu se používají místní oznámení, což je nejjednodušší oznámení k implementaci. Můžou odesílat oznámení všechny typy aplikací (WPF, UPW, WinForms, konzola).

Note

Termín "toast oznámení" se nahrazuje "app oznámením". Oba tyto termíny odkazují na stejnou funkci Windows, ale v průběhu času postupně přestaneme používat výraz "toast oznámení" v dokumentaci.

Important

Pokud píšete ne-UWP C++ app, projděte si dokumentaci pro C++ WRL. Pokud píšete C# app, projděte si dokumentaci jazyka C#.

Krok 1: Instalace balíčku NuGet

Oznámení app můžete vytvářet pomocí syntaxe tvůrce (Windows Community Toolkit, WCT) nebo pomocí XML. Pokud dáváte přednost tomu druhému, přejděte k kroku 2 a podívejte se na příklady kódu Bez syntaxe tvůrce.

V rámci řešení sady Visual Studio klikněte pravým tlačítkem na projekt, klikněte na Spravovat balíčky NuGet a vyhledejte a nainstalujte balíček NuGet Microsoft.Toolkit.Uwp.Notifications verze 7.0 nebo vyšší.

Tento balíček bude používat naše syntaxe Builderu příklady kódu. Tento balíček umožňuje vytvářet app oznámení bez použití XML.

Krok 2: Přidejte deklarace jmenného prostoru

using namespace Microsoft::Toolkit::Uwp::Notifications;

Krok 3: Odeslání app oznámení

Ve Windows 10 a Windows 11 se obsah app oznámení popisuje pomocí adaptivního jazyka, který umožňuje velkou flexibilitu s tím, jak oznámení vypadá. Další informace najdete v App dokumentaci k obsahu oznámení .

Začneme jednoduchým textovým oznámením. Vytvořte obsah oznámení (pomocí knihovny oznámení) a zobrazte oznámení. Všimněte si, že obor názvů je Microsoft.Toolkit.Uwp.Notifications.

jednoduché textové oznámení

Pokud nepoužíváte syntaxi tvůrce knihoven WCT Notifications, místo toho vytvoříte šablonu oznámení XML app , naplníte ji textem a hodnotami, sestavíte oznámení a zobrazíte ji.

// Construct the content and show the toast!
(ref new ToastContentBuilder())
    ->AddArgument("action", "viewConversation")
    ->AddArgument("conversationId", 9813)
    ->AddText("Andrew sent you a picture")
    ->AddText("Check this out, The Enchantments in Washington!")
    ->Show();

Krok 4: Zpracování aktivace

Když uživatel klikne na vaše oznámení (nebo na tlačítko na oznámení, které má aktivaci na popředí), bude vyvolána funkce appApp.xaml.cppOnActivated.

App.xaml.cpp

void App::OnActivated(IActivatedEventArgs^ e)
{
    // Handle notification activation
    if (e->Kind == ActivationKind::ToastNotification)
    {
        ToastNotificationActivatedEventArgs^ toastActivationArgs = (ToastNotificationActivatedEventArgs^)e;

        // Obtain the arguments from the notification
        ToastArguments^ args = ToastArguments::Parse(toastActivationArgs->Argument);

        // Obtain any user input (text boxes, menu selections) from the notification
        auto userInput = toastActivationArgs->UserInput;

        // TODO: Show the corresponding content
    }
}

Important

Musíte inicializovat svůj rámeček a aktivovat své okno, stejně jako v kódu OnLaunched. OnLaunched není volán, pokud uživatel klikne na vaše app oznámení, i když byl váš app zavřený a spouští se poprvé. Často doporučujeme kombinovat OnLaunched a OnActivated do vlastní OnLaunchedOrActivated metody, protože stejná inicializace musí nastat v obou případech.

Hloubková aktivace

Prvním krokem k tomu, aby bylo možné s oznámeními provádět akce, je přidat do oznámení některé parametry spuštění, aby app věděl/a, co má spustit, když uživatel klikne na oznámení. V tomto případě zahrnujeme některé informace, které nám později říkají, že bychom měli otevřít konverzaci, a víme, kterou konkrétní konverzaci otevřít.

// Construct the content and show the toast!
(ref new ToastContentBuilder())

    // Arguments returned when user taps body of notification
    ->AddArgument("action", "viewConversation")
    ->AddArgument("conversationId", 9813)

    ->AddText("Andrew sent you a picture")
    ->Show();

Přidání obrázků

Do oznámení můžete přidat bohatý obsah. Přidáme vložený obrázek a profilový obrázek (app nahrazení loga).

Note

Obrázky lze použít z balíčku app, z místního úložiště app nebo z webu. Od fall Creators Update můžou být webové obrázky až 3 MB na normálních připojeních a 1 MB u připojení účtovaných podle měr. Na zařízeních, na kterých ještě není spuštěná aktualizace Fall Creators Update, nesmí být webové obrázky větší než 200 kB.

Toast s obrázky
// Construct the content and show the toast!
(ref new ToastContentBuilder())
    ...

    // Inline image
    ->AddInlineImage(ref new Uri("https://picsum.photos/360/202?image=883"))

    // Profile (app logo override) image
    ->AddAppLogoOverride(ref new Uri("ms-appdata:///local/Andrew.jpg"), ToastGenericAppLogoCrop::Circle)

    ->Show();

Přidání tlačítek a vstupů

Můžete přidávat tlačítka a vstupní prvky, aby byla vaše oznámení interaktivní. Tlačítka můžou spustit popředí app, protokol nebo úkol na pozadí. Přidáme textové pole odpovědi, tlačítko To se mi líbí a tlačítko Zobrazit, které obrázek otevře.

toast Snímek obrazovky s oznámením se vstupy a tlačítky
// Construct the content
(ref new ToastContentBuilder())
    ->AddArgument("conversationId", 9813)
    ...

    // Text box for replying
    ->AddInputTextBox("tbReply", "Type a response")

    // Buttons
    ->AddButton((ref new ToastButton())
        ->SetContent("Reply")
        ->AddArgument("action", "reply")
        ->SetBackgroundActivation())

    ->AddButton((ref new ToastButton())
        ->SetContent("Like")
        ->AddArgument("action", "like")
        ->SetBackgroundActivation())

    ->AddButton((ref new ToastButton())
        ->SetContent("View")
        ->AddArgument("action", "view"))

    ->Show();

Aktivace tlačítek v popředí se zpracovává stejným způsobem jako hlavní text oznámení (vaše App.xaml.cpp OnActivated bude volána).

Zpracování aktivace na pozadí

Když v oznámení zadáte aktivaci app na pozadí (nebo na tlačítku uvnitř oznámení), úloha na pozadí se spustí místo aktivace popředí app.

Další informace o úlohách na pozadí najdete v článku Podporujte svou app pomocí úloh na pozadí.

Pokud cílíte na build 14393 nebo novější, můžete použít úlohy na pozadí v procesu, které výrazně zjednodušují věci. Mějte na paměti, že úlohy na pozadí v procesu nebudou spuštěny ve starších verzích Windows. V této ukázce kódu použijeme úlohu na pozadí procesu.

const string taskName = "ToastBackgroundTask";

// If background task is already registered, do nothing
if (BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name.Equals(taskName)))
    return;

// Otherwise request access
BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

// Create the background task
BackgroundTaskBuilder builder = new BackgroundTaskBuilder()
{
    Name = taskName
};

// Assign the toast action trigger
builder.SetTrigger(new ToastNotificationActionTrigger());

// And register the task
BackgroundTaskRegistration registration = builder.Register();

Pak v App.xaml.cs přepište metodu OnBackgroundActivated. Pak můžete načíst předdefinované argumenty a vstup uživatele, podobně jako při aktivaci na popředí.

App.xaml.cs

protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    var deferral = args.TaskInstance.GetDeferral();

    switch (args.TaskInstance.Task.Name)
    {
        case "ToastBackgroundTask":
            var details = args.TaskInstance.TriggerDetails as ToastNotificationActionTriggerDetail;
            if (details != null)
            {
                string arguments = details.Argument;
                var userInput = details.UserInput;

                // Perform tasks
            }
            break;
    }

    deferral.Complete();
}

Nastavení času vypršení platnosti

Ve Windows 10 a 11 se všechna app oznámení po zavření nebo ignorování uživatelem přesunou do Centra akcí, aby si uživatelé mohli prohlédnout vaše oznámení, jakmile zmizí.

Pokud je však zpráva ve vašem oznámení relevantní jenom po určitou dobu, měli byste pro oznámení nastavit dobu app vypršení platnosti, aby uživatelé neviděli zastaralé informace z vašeho app. Pokud je například povýšení platné jenom 12 hodin, nastavte dobu vypršení platnosti na 12 hodin. V následujícím kódu nastavíme dobu vypršení platnosti na 2 dny.

Note

Výchozí a maximální doba vypršení platnosti místních app oznámení je 3 dny.

// Create toast content and show the toast!
(ref new ToastContentBuilder())
    ->AddText("Expires in 2 days...")
    ->Show(toast =>
    {
        toast->ExpirationTime = DateTime::Now->AddDays(2);
    });

Zadání primárního klíče pro oznámení app

Pokud chcete oznámení, které odesíláte, odebrat nebo nahradit prostřednictvím kódu programu, musíte k zadání primárního klíče pro oznámení použít vlastnost Tag (a volitelně také vlastnost Skupina). Potom můžete tento primární klíč v budoucnu použít k odebrání nebo nahrazení oznámení.

Další podrobnosti o nahrazení nebo odebrání již doručených app oznámení najdete v tématu Rychlý start: Správa toast oznámení v Centru akcí (XAML).

Kombinace značek a skupin funguje jako složený primární klíč. Skupina je obecnější identifikátor, kde můžete přiřadit skupiny jako "wallPosts", "messages", "friendRequests" atd. Značka by pak měla jednoznačně identifikovat samotné oznámení ze skupiny. Pomocí obecné skupiny pak můžete odebrat všechna oznámení z této skupiny pomocí rozhraní RemoveGroup API.

// Create toast content and show the toast!
(ref new ToastContentBuilder())
    ->AddText("New post on your wall!")
    ->Show(toast =>
    {
        toast.Tag = "18365";
        toast.Group = "wallPosts";
    });

Vymazání oznámení

Aplikace zodpovídají za odebrání a vymazání vlastních oznámení. Po spuštění app automaticky nevymažeme vaše oznámení.

Systém Windows automaticky odebere oznámení pouze v případě, že uživatel explicitně klikne na oznámení.

Tady je příklad toho, co by mělo zasílání zpráv app dělat...

  1. Uživatel obdrží více app oznámení o nových zprávách v konverzaci.
  2. Uživatel klepne na jedno z těchto oznámení a otevře konverzaci.
  3. Prvek app otevře konverzaci a pak vymaže všechna oznámení pro tuto konverzaci (pomocí RemoveGroup ve app-skupině zadané pro tuto konverzaci).
  4. Centrum akcí nyní správně odráží stav oznámení, protože v něm nezůstala žádná zastaralá oznámení týkající se této konverzace.

Další informace o vymazání všech oznámení nebo odebrání konkrétních oznámení najdete v tématu Rychlý start: Správa toast oznámení v Centru akcí (XAML).

ToastNotificationManagerCompat::History->Clear();

Resources