Přehled služby WNS (Windows Push Notification Services)

Služba WNS (Windows Push Notification Services) umožňuje vývojářům třetích stran odesílat informační zprávy, dlaždici, odznáček a nezpracované aktualizace ze své vlastní cloudové služby. To poskytuje mechanismus pro doručování nových aktualizací uživatelům výkonným a spolehlivým způsobem.

Jak to funguje

Následující diagram znázorňuje úplný tok dat pro odeslání nabízeného oznámení. Zahrnuje tyto kroky:

  1. Vaše aplikace požádá o kanál push oznámení od WNS.
  2. Windows požádá WNS o vytvoření kanálu oznámení. Tento kanál se vrátí do volajícího zařízení ve formě identifikátoru URI (Uniform Resource Identifier).
  3. Identifikátor URI kanálu oznámení vrátí služba WNS vaší aplikaci.
  4. Vaše aplikace odešle identifikátor URI do vaší vlastní cloudové služby. Identifikátor URI pak uložíte ve své vlastní cloudové službě, abyste měli přístup k identifikátoru URI při odesílání oznámení. Identifikátor URI je rozhraní mezi vaší vlastní aplikací a vaší vlastní službou; je vaší zodpovědností implementovat toto rozhraní s bezpečnými a zabezpečenými webovými standardy.
  5. Když má vaše cloudová služba aktualizaci, která se má odeslat, upozorní WNS pomocí identifikátoru URI kanálu. To se provádí vydáním požadavku HTTP POST, včetně datové části oznámení, přes SSL (Secure Sockets Layer). Tento krok vyžaduje ověření.
  6. Služba WNS obdrží požadavek a směruje oznámení na příslušné zařízení.

diagram toku dat pro push oznámení

Registrace aplikace a přijetí přihlašovacích údajů pro cloudovou službu

Než budete moct odesílat oznámení pomocí WNS, musí být vaše aplikace zaregistrovaná na řídicím panelu Storu, jak je popsáno tady.

Vyžádání kanálu oznámení

Note

Pokyny k žádostem o kanál v této části platí pro aplikace UWP, které používají CreatePushNotificationChannelForApplicationAsync. Pokud vytváříte desktopovou aplikaci Windows App SDK (WinUI 3, WPF nebo WinForms), použijte místo toho PushNotificationManager – podívejte se na rychlý start k oznámením Push.

Když se spustí aplikace, která dokáže přijímat push oznámení, musí nejprve prostřednictvím CreatePushNotificationChannelForApplicationAsync požádat o kanál oznámení. Úplný diskuzní a ukázkový kód najdete v tématu Jak požádat, vytvořit a uložit kanál oznámení. Toto rozhraní API vrátí identifikátor URI kanálu, který je jedinečně propojený s volající aplikací a její dlaždicí a prostřednictvím kterého se dají odesílat všechny typy oznámení.

Jakmile aplikace úspěšně vytvořila identifikátor URI kanálu, odešle ho do své cloudové služby spolu s všechna metadata specifická pro aplikaci, která by měla být přidružena k tomuto identifikátoru URI.

Důležité poznámky

  • Nezaručujeme, že identifikátor URI kanálu oznámení pro aplikaci zůstane vždy stejný. Doporučujeme, aby aplikace pokaždé, když se spustí, požádala o nový kanál a aktualizovala svou službu při změně identifikátoru URI. Vývojář by nikdy neměl upravovat identifikátor URI kanálu a měl by ho považovat za řetězec černého rámečku. V tuto chvíli vyprší platnost identifikátorů URI kanálu po 30 dnech. Pokud vaše aplikace Windows 10 bude pravidelně obnovovat svůj kanál na pozadí, můžete si stáhnout ukázku Push a pravidelná oznámení pro Windows 8.1 a znovu použít zdrojový kód nebo vzor, který ukazuje.
  • Rozhraní mezi cloudovou službou a klientskou aplikací je implementované vámi, vývojářem. Doporučujeme, aby aplikace prošla procesem ověřování s vlastní službou a přenášela data přes zabezpečený protokol, jako je HTTPS.
  • Je důležité, aby cloudová služba vždy zajistila, že identifikátor URI kanálu používá doménu "notify.windows.com". Služba by nikdy neměla odesílat nabízená oznámení do kanálu v žádné jiné doméně. Pokud by někdy došlo k ohrožení zpětného volání pro vaši aplikaci, mohl by útočník se zlými úmysly odeslat identifikátor URI kanálu pro falšování služby WNS. Bez kontroly domény by vaše cloudová služba mohla potenciálně odhalit informace tomuto útočníkovi bez vědomí. Subdoména identifikátoru URI kanálu se může změnit a při ověřování identifikátoru URI kanálu by se neměla brát v úvahu.
  • Pokud se vaše cloudová služba pokusí doručit oznámení do kanálu s vypršenou platností, služba WNS vrátí kód odpovědi 410. V reakci na tento kód by se vaše služba už neměla pokoušet odesílat oznámení na tento identifikátor URI.

Ověřování cloudové služby

Výstraha

Tato část popisuje starší tok ověřování UWP pomocí identifikátoru Package SID a tajným klíčem získaným z řídicího panelu Microsoft Store, který se ověřuje pro login.live.com. Tento tok je specifický pro aplikace UWP zaregistrované prostřednictvím Partnerského centra a není kompatibilní s nabízenými oznámeními Windows App SDK.

Pokud vytváříte aplikaci WPF, WinForms nebo WinUI 3 pomocí Windows App SDK, použijte tok ověřování Azure Active Directory (Azure AD) popsaný v rychlém startu OznámeníPush.

Pokud chcete odeslat oznámení, musí být cloudová služba ověřená prostřednictvím služby WNS. Prvním krokem v tomto procesu je registrace aplikace na řídicím panelu Microsoft Store. Během procesu registrace má vaše aplikace identifikátor zabezpečení balíčku (SID) a tajný klíč. Tyto informace používá vaše cloudová služba k ověření ve službě WNS.

Schéma ověřování WNS se implementuje pomocí profilu přihlašovacích údajů klienta z protokolu OAuth 2.0 . Cloudová služba se ověřuje ve službě WNS zadáním přihlašovacích údajů (SID balíčku a tajného klíče). Výměnou obdrží přístupový token. Tento přístupový token umožňuje cloudové službě odeslat oznámení. Token se vyžaduje při každém požadavku na oznámení odeslané do služby WNS.

Na vysoké úrovni je informační řetězec následující:

  1. Cloudová služba odešle své přihlašovací údaje do WNS přes HTTPS za protokolem OAuth 2.0. Tím se služba ověřuje pomocí služby WNS.
  2. Služba WNS vrátí přístupový token, pokud ověřování proběhlo úspěšně. Tento přístupový token se použije ve všech následných žádostech o oznámení, dokud nevyprší platnost.

diagram pro ověřování cloudových služeb wns

V ověřování pomocí služby WNS odešle cloudová služba požadavek HTTP přes protokol SSL (Secure Sockets Layer). Parametry se zadají ve formátu application/x-www-form-urlencoded. Do pole "client_id" a tajný klíč do pole "client_secret" zadejte identifikátor SID balíčku, jak je znázorněno v následujícím příkladu. Podrobnosti o syntaxi najdete v referenci žádosti o přístupový token .

Note

Toto je jen příklad, nikoliv hotový kód k okamžitému použití ve vašem vlastním programu. 

 POST /accesstoken.srf HTTP/1.1
 Content-Type: application/x-www-form-urlencoded
 Host: https://login.live.com
 Content-Length: 211
 
 grant_type=client_credentials&client_id=ms-app%3a%2f%2fS-1-15-2-2972962901-2322836549-3722629029-1345238579-3987825745-2155616079-650196962&client_secret=Vex8L9WOFZuj95euaLrvSH7XyoDhLJc7&scope=notify.windows.com

Služba WNS ověří cloudovou službu a v případě úspěchu odešle odpověď 200 OK. Přístupový token se vrátí v parametrech zahrnutých v textu odpovědi HTTP pomocí typu média application/json. Jakmile vaše služba obdrží přístupový token, můžete odesílat oznámení.

Následující příklad ukazuje úspěšnou odpověď na ověření, včetně přístupového tokenu. Podrobnosti o syntaxi najdete v tématu žádosti o službu nabízených oznámení a hlaviček odpovědí.

 HTTP/1.1 200 OK   
 Cache-Control: no-store
 Content-Length: 422
 Content-Type: application/json
 
 {
     "access_token":"EgAcAQMAAAAALYAAY/c+Huwi3Fv4Ck10UrKNmtxRO6Njk2MgA=", 
     "token_type":"bearer"
 }

Důležité poznámky

  • Protokol OAuth 2.0 podporovaný v tomto postupu se řídí konceptem verze V16.
  • Požadavek OAuth pro komentáře (RFC) používá termín "klient" k odkazování na cloudovou službu.
  • Po dokončení konceptu OAuth může dojít ke změnám tohoto postupu.
  • Přístupový token je možné znovu použít pro více žádostí o oznámení. Cloudová služba se tak může ověřit jen jednou, aby odeslala mnoho oznámení. Když však vyprší platnost přístupového tokenu, musí se cloudová služba znovu ověřit, aby získala nový přístupový token.

Odeslání oznámení

Pomocí identifikátoru URI kanálu může cloudová služba odeslat oznámení vždy, když má pro uživatele aktualizaci.

Přístupový token popsaný výše je možné znovu použít pro více žádostí o oznámení; Cloudový server není nutný k vyžádání nového přístupového tokenu pro každé oznámení. Pokud vypršela platnost přístupového tokenu, žádost o oznámení vrátí chybu. Doporučujeme, abyste se nepokoušli znovu odeslat oznámení vícekrát, pokud je přístupový token odmítnut. Pokud k této chybě dojde, budete muset požádat o nový přístupový token a znovu odeslat oznámení. Přesný kód chyby najdete v části Žádosti o službu nabízených oznámení a hlavičky odpovědi.

  1. Cloudová služba provede HTTP POST na adresu URI kanálu. Tento požadavek musí být proveden přes PROTOKOL SSL a obsahuje potřebné hlavičky a datovou část oznámení. Autorizační hlavička musí obsahovat získaný přístupový token pro autorizaci.

    Tady je uvedený příklad požadavku. Podrobnosti o syntaxi najdete v tématu žádosti o službu nabízených oznámení a hlaviček odpovědí.

    Podrobnosti o vytváření datové části oznámení najdete v tématu Quickstart: Nabízená oznámení v Windows App SDK. Datová část dlaždice, informační zprávy nebo oznámení odznaku se poskytuje jako obsah XML, který odpovídá příslušnému definovanému schématu adaptivních dlaždic nebo schématu starších dlaždic. Datová část nezpracovaného oznámení nemá zadanou strukturu. Je striktně definována aplikací.

     POST https://cloud.notify.windows.com/?token=AQE%bU%2fSjZOCvRjjpILow%3d%3d HTTP/1.1
     Content-Type: text/xml
     X-WNS-Type: wns/tile
     Authorization: Bearer EgAcAQMAAAAALYAAY/c+Huwi3Fv4Ck10UrKNmtxRO6Njk2MgA=
     Host: cloud.notify.windows.com
     Content-Length: 24
    
     <body>
     ....
    
  2. Služba WNS potvrzuje přijetí oznámení a informuje, že bude doručeno při další dostupné příležitosti. Služba WNS ale neposkytuje kompletní potvrzení, že vaše oznámení zařízení nebo aplikace obdržela.

Tento diagram znázorňuje tok dat:

WNS diagram pro odeslání oznámení

Důležité poznámky

  • Služba WNS nezaručuje spolehlivost nebo latenci oznámení.
  • Oznámení by nikdy neměla obsahovat důvěrné, citlivé ani osobní údaje.
  • Aby bylo možné odeslat oznámení, musí se cloudová služba nejprve ověřit pomocí služby WNS a přijmout přístupový token.
  • Přístupový token umožňuje cloudové službě odesílat oznámení jenom do jedné aplikace, pro kterou byl token vytvořen. Jeden přístupový token se nedá použít k odesílání oznámení napříč více aplikacemi. Pokud tedy vaše cloudová služba podporuje více aplikací, musí při odesílání oznámení do každého URI kanálu poskytnout správný přístupový token pro danou aplikaci.
  • Když je zařízení offline, WNS ve výchozím nastavení uloží jeden z jednotlivých typů oznámení (dlaždice, oznámení, informační zpráva) pro každý identifikátor URI kanálu a žádná nezpracovaná oznámení.
  • Ve scénářích, kdy je obsah oznámení přizpůsobený uživateli, služba WNS doporučuje, aby cloudová služba tyto aktualizace okamžitě po přijetí odeslala. Mezi příklady tohoto scénáře patří aktualizace informačního kanálu sociálních médií, pozvánky k okamžité komunikaci, oznámení o nových zprávách nebo upozornění. Jako alternativu můžete mít scénáře, ve kterých se stejná obecná aktualizace často dodává velké podmnožině uživatelů; Například aktuální informace o počasí, akciích a novinkách. Pokyny služby WNS určují, že frekvence těchto aktualizací by měla být maximálně jedna každých 30 minut. Koncový uživatel nebo WNS mohou rozhodnout, že častější rutinní aktualizace jsou zneužití.
  • Windows Notification Platform udržuje pravidelné datové připojení se službou WNS, aby byl soket aktivní a v pořádku. Pokud nejsou k dispozici žádné aplikace, které požadují nebo používají kanály oznámení, soket se nevytvořil.

Vypršení platnosti oznámení o dlaždicích a odznáčcích

Ve výchozím nastavení vyprší platnost dlaždicových a odznakových oznámení tři dny po stažení. Po vypršení platnosti oznámení se obsah odebere z dlaždice nebo fronty a už se uživateli nezobrazuje. Osvědčeným postupem je nastavit vypršení platnosti (s využitím času, který dává smysl pro vaši aplikaci) na všech oznámeních o dlaždicích a odznáček, aby se obsah dlaždice neuchovával déle, než je relevantní. Explicitní doba vypršení platnosti je nezbytná pro obsah s definovanou životností. To také zajišťuje odebrání zastaralého obsahu, pokud cloudová služba přestane odesílat oznámení nebo pokud se uživatel po delší dobu odpojí od sítě.

Vaše cloudová služba může nastavit vypršení platnosti pro každé oznámení nastavením hlavičky X-WNS-TTL HTTP tak, aby určila dobu (v sekundách), po které bude oznámení platné. Další informace najdete v tématu žádost o službu push oznámení a hlavičky odpovědi.

Například během aktivního obchodního dne burzovního trhu můžete nastavit vypršení platnosti aktualizace akcií na dvojnásobek odesílajícího intervalu (například jednu hodinu po potvrzení, pokud odesíláte oznámení každých půl hodiny). V dalším příkladu může aplikace zpráv určit, že jeden den je vhodnou dobou vypršení platnosti pro denní aktualizaci dlaždice zpráv.

Push oznámení a spořič baterie

Spořič baterie prodlužuje životnost baterie omezením aktivity na pozadí na zařízení. Windows 10 umožňuje uživateli nastavit spořič baterie tak, aby se automaticky zapnul, když baterie klesne pod zadanou prahovou hodnotu. Pokud je spořič baterie zapnutý, příjem push oznámení je zakázán, aby se ušetřila energie. Existuje však několik výjimek. Následující nastavení spořiče baterie ve Windows 10 (které najdete v nastavení Windows) umožňují vaší aplikaci přijímat push oznámení, i když je spořič baterie aktivní.

  • Povolit push oznámení z libovolné aplikace během používání spořiče baterie: Toto nastavení umožňuje všem aplikacím přijímat push oznámení, když je spořič baterie zapnutý. Toto nastavení platí jenom pro Windows 10 pro desktopové edice (Home, Pro, Enterprise a Education).
  • Vždy povoleno: Toto nastavení umožňuje konkrétním aplikacím běžet na pozadí, zatímco spořič baterie je zapnutý – včetně příjmu nabízených oznámení. Tento seznam udržuje uživatel ručně.

Neexistuje způsob, jak zkontrolovat stav těchto dvou nastavení, ale můžete zkontrolovat stav úsporného režimu baterie. V systému Windows 10 použijte vlastnost EnergySaverStatus ke kontrole stavu spořiče baterie. Aplikace může také používat událost EnergySaverStatusChanged k detekci změn ve spořiči baterie.

Pokud vaše aplikace hodně závisí na nabízených oznámeních, doporučujeme uživatelům oznámit, že nemusí dostávat oznámení, když je spořič baterie zapnutý, a aby mohli snadno upravit nastavení spořič baterie. Pomocí schématu URI nastavení baterie v Windows ms-settings:batterysaver-settings můžete poskytnout pohodlný odkaz na nastavení Windows.

Tip

Při upozorňování uživatele na nastavení spořiče baterie doporučujeme poskytnout způsob, jak zprávu v budoucnu zrušit. Například zaškrtávací políčko dontAskMeAgainBox v následujícím příkladu zachová předvolbu uživatele v LocalSettings.

Tady je příklad, jak zkontrolovat, jestli je v Windows 10 zapnutý spořič baterie. Tento příklad upozorní uživatele a otevře Nastavení, kde lze upravit nastavení spořiče baterie. Umožňuje dontAskAgainSetting uživateli potlačit zprávu, pokud nechce být znovu upozorněn.

using System;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Navigation;
using Windows.System;
using Windows.System.Power;
...
...
async public void CheckForEnergySaving()
{
   //Get reminder preference from LocalSettings
   bool dontAskAgain;
   var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
   object dontAskSetting = localSettings.Values["dontAskAgainSetting"];
   if (dontAskSetting == null)
   {  // Setting does not exist
      dontAskAgain = false;
   }
   else
   {  // Retrieve setting value
      dontAskAgain = Convert.ToBoolean(dontAskSetting);
   }
   
   // Check if battery saver is on and that it's okay to raise dialog
   if ((PowerManager.EnergySaverStatus == EnergySaverStatus.On)
         && (dontAskAgain == false))
   {
      // Check dialog results
      ContentDialogResult dialogResult = await saveEnergyDialog.ShowAsync();
      if (dialogResult == ContentDialogResult.Primary)
      {
         // Launch battery saver settings (settings are available only when a battery is present)
         await Launcher.LaunchUriAsync(new Uri("ms-settings:batterysaver-settings"));
      }

      // Save reminder preference
      if (dontAskAgainBox.IsChecked == true)
      {  // Don't raise dialog again
         localSettings.Values["dontAskAgainSetting"] = "true";
      }
   }
}
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Storage.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.System.Power.h>
#include <winrt/Microsoft.UI.Xaml.h>
#include <winrt/Microsoft.UI.Xaml.Controls.h>
#include <winrt/Microsoft.UI.Xaml.Navigation.h>
using namespace winrt;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Storage;
using namespace winrt::Windows::System;
using namespace winrt::Windows::System::Power;
using namespace winrt::Microsoft::UI::Xaml;
using namespace winrt::Microsoft::UI::Xaml::Controls;
using namespace winrt::Windows::UI::Xaml::Navigation;
...
winrt::fire_and_forget CheckForEnergySaving()
{
    // Get reminder preference from LocalSettings.
    bool dontAskAgain{ false };
    auto localSettings = ApplicationData::Current().LocalSettings();
    IInspectable dontAskSetting = localSettings.Values().Lookup(L"dontAskAgainSetting");
    if (!dontAskSetting)
    {
        // Setting doesn't exist.
        dontAskAgain = false;
    }
    else
    {
        // Retrieve setting value
        dontAskAgain = winrt::unbox_value<bool>(dontAskSetting);
    }

    // Check whether battery saver is on, and whether it's okay to raise dialog.
    if ((PowerManager::EnergySaverStatus() == EnergySaverStatus::On) && (!dontAskAgain))
    {
        // Check dialog results.
        ContentDialogResult dialogResult = co_await saveEnergyDialog().ShowAsync();
        if (dialogResult == ContentDialogResult::Primary)
        {
            // Launch battery saver settings
            // (settings are available only when a battery is present).
            co_await Launcher::LaunchUriAsync(Uri(L"ms-settings:batterysaver-settings"));
        }

        // Save reminder preference.
        if (dontAskAgainBox().IsChecked())
        {
            // Don't raise the dialog again.
            localSettings.Values().Insert(L"dontAskAgainSetting", winrt::box_value(true));
        }
    }
}

Toto je XAML pro ContentDialog uvedený v tomto příkladu.

<ContentDialog x:Name="saveEnergyDialog"
               PrimaryButtonText="Open battery saver settings"
               SecondaryButtonText="Ignore"
               Title="Battery saver is on."> 
   <StackPanel>
      <TextBlock TextWrapping="WrapWholeWords">
         <LineBreak/><Run>Battery saver is on and you may 
          not receive push notifications.</Run><LineBreak/>
         <LineBreak/><Run>You can choose to allow this app to work normally
         while in battery saver, including receiving push notifications.</Run>
         <LineBreak/>
      </TextBlock>
      <CheckBox x:Name="dontAskAgainBox" Content="OK, got it."/>
   </StackPanel>
</ContentDialog>