Aracılığıyla paylaş


Windows Anında İletme Bildirimi Hizmetleri'ne (WNS) genel bakış

Windows Anında İletme Bildirimi Hizmetleri (WNS), üçüncü taraf geliştiricilerin kendi bulut hizmetlerinden bildirim, kutucuk, rozet ve ham güncelleştirmeler göndermesine olanak tanır. Bu, kullanıcılarınıza enerji tasarruflu ve güvenilir bir şekilde yeni güncellemeler sunmak için bir mekanizma sağlar.

Nasıl çalışır?

Aşağıdaki diyagramda anında iletme bildirimi göndermeye yönelik tam veri akışı gösterilmektedir. Aşağıdaki adımları içerir:

  1. Uygulamanız WNS'den bir anında iletme bildirimi kanalı istemektedir.
  2. Windows, WNS'den bir bildirim kanalı oluşturmasını ister. Bu kanal, çağrı cihazına Tekdüzen Kaynak Tanımlayıcısı (URI) biçiminde döndürülür.
  3. Bildirim kanalı URI'si, WNS tarafından uygulamanıza döndürülür.
  4. Uygulamanız URI'yi kendi bulut hizmetinize gönderir. Ardından, bildirim gönderirken URI'ye erişebilmek için URI'yi kendi bulut hizmetinizde depolarsınız. URI, kendi uygulamanızla kendi hizmetiniz arasındaki bir arabirimdir; bu arabirimi güvenli ve güvenli web standartlarıyla uygulamak sizin sorumluluğunuzdadır.
  5. Bulut hizmetinizde gönderilecek bir güncelleştirme olduğunda, kanal URI'sini kullanarak WNS'ye bildirim gönderir. Bu, Güvenli Yuva Katmanı (SSL) üzerinden bildirim yükü de dahil olmak üzere bir HTTP POST isteği gönderilerek yapılır. Bu adım kimlik doğrulaması gerektirir.
  6. WNS isteği alır ve bildirimi uygun cihaza yönlendirir.

anında iletme bildirimi için wns veri akışı diyagramını

Uygulamanızı kaydetme ve bulut hizmetinizin kimlik bilgilerini alma

WNS kullanarak bildirim gönderebilmeniz için uygulamanızın burada açıklandığı gibi Mağaza Panosu'na kaydedilmesi gerekir.

Bildirim kanalı isteme

Anında iletme bildirimleri alabilen bir uygulama çalıştığında, önce CreatePushNotificationChannelForApplicationAsyncaracılığıyla bir bildirim kanalı istemesi gerekiyor. Tam bir tartışma ve örnek kod için bkz. bildirim kanalı isteme, oluşturma ve kaydetme. Bu API, çağrı uygulamasına ve kutucuğuna benzersiz olarak bağlı olan ve tüm bildirim türlerinin gönderilebildiği bir kanal URI'sini döndürür.

Uygulama başarıyla bir kanal URI'sini oluşturduktan sonra, bu URI ile ilişkilendirilmesi gereken uygulamaya özgü meta verilerle birlikte bunu bulut hizmetine gönderir.

Önemli notlar

  • Bir uygulama için bildirim kanalı URI'sinin her zaman aynı kalacağını garanti etmeyiz. Uygulamanın her çalıştığında yeni bir kanal istemesini ve URI değiştiğinde hizmetini güncelleştirmesini öneririz. Geliştirici, kanal URI'sini hiçbir zaman değiştirmemeli ve bunu bir kara kutu dizesi olarak değerlendirmelidir. Şu anda kanal URI'lerinin süresi 30 gün sonra dolar. Windows 10 uygulamanız arka planda kanalını düzenli olarak yenileyecekse Windows 8.1 için Anında iletme ve düzenli bildirimler örneğini indirebilir ve kaynak kodunu ve/veya gösterdiği düzeni yeniden kullanabilirsiniz.
  • Bulut hizmeti ile istemci uygulaması arasındaki arabirim, geliştirici olan siz tarafından uygulanır. Uygulamanın kendi hizmetiyle bir kimlik doğrulama işlemi gerçekleştirmesini ve HTTPS gibi güvenli bir protokol üzerinden veri iletmesini öneririz.
  • Bulut hizmetinin her zaman kanal URI'sinin "notify.windows.com" etki alanını kullanmasını sağlaması önemlidir. Hizmet, başka bir etki alanındaki bir kanala asla bildirim göndermemelidir. Uygulamanızın geri arama adresi herhangi bir zamanda ele geçirilirse, kötü niyetli bir saldırgan WNS'yi taklit etmek için bir kanal URI'si gönderebilir. Bulut hizmetiniz etki alanını incelemeden bilgileri bilmeden bu saldırgana açıklayabilir. Kanal URI'sinin alt etki alanı değiştirilebilir ve kanal URI'sini doğrularken dikkate alınmamalıdır.
  • Bulut hizmetiniz süresi dolmuş bir kanala bildirim göndermeye çalışırsa WNS yanıt kodu 410'u döndürür. Bu koda yanıt olarak hizmetiniz artık bu URI'ye bildirim göndermeye çalışmamalıdır.

Bulut hizmetinizin kimliğini doğrulama

Bildirim göndermek için bulut hizmetinin kimliğiniN WNS aracılığıyla doğrulanması gerekir. Bu işlemin ilk adımı, uygulamanızı Microsoft Store Panosu'na kaydettiğinizde gerçekleşir. Kayıt işlemi sırasında uygulamanıza paket güvenlik tanımlayıcısı (SID) ve gizli anahtar verilir. Bu bilgiler bulut hizmetiniz tarafından WNS ile kimlik doğrulaması yapmak için kullanılır.

WNS kimlik doğrulama düzeni, OAuth 2.0 protokolünden istemci kimlik bilgileri profili kullanılarak uygulanır. Bulut hizmeti kimlik bilgilerini (Paket SID ve gizli anahtar) sağlayarak WNS ile kimlik doğrulaması yapar. Karşılığında bir erişim belirteci alır. Bu erişim belirteci, bulut hizmetinin bildirim göndermesine olanak tanır. Belirteç, WNS'ye gönderilen her bildirim isteğinde gereklidir.

Bilgi zinciri üst düzeyde aşağıdaki gibidir:

  1. Bulut hizmeti, OAuth 2.0 protokolünü izleyerek kimlik bilgilerini HTTPS üzerinden WNS'ye gönderir. Bu, WNS ile hizmetin kimliğini doğrular.
  2. Kimlik doğrulaması başarılı olursa WNS bir erişim belirteci döndürür. Bu erişim belirteci süresi dolana kadar sonraki tüm bildirim isteklerinde kullanılır.

bulut hizmeti kimlik doğrulaması için wns diyagramı

WNS ile kimlik doğrulamasında, bulut hizmeti Güvenli Yuva Katmanı (SSL) üzerinden bir HTTP isteği gönderir. Parametreler "application/x-www-for-urlencoded" biçiminde sağlanır. Paket SID'nizi "client_id" alanında ve gizli anahtarınızı aşağıdaki örnekte gösterildiği gibi "client_secret" alanında sağlayın. Söz dizimi ayrıntıları için bkz. erişim belirteci isteği referansı.

Note

Bu yalnızca bir örnektir; kendi kodunuzda başarıyla kullanabileceğiniz kes ve yapıştır kodu değildir. 

 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

WNS, bulut hizmetinin kimliğini doğrular ve başarılı olursa "200 Tamam" yanıtı gönderir. Erişim belirteci, "application/json" medya türü kullanılarak HTTP yanıtının gövdesine dahil edilen parametrelerde döndürülür. Hizmetiniz erişim belirtecini aldıktan sonra bildirim göndermeye hazırsınız.

Aşağıdaki örnekte, erişim belirteci de dahil olmak üzere başarılı bir kimlik doğrulama yanıtı gösterilmektedir. Söz dizimi ayrıntıları için bkz. Anında iletme bildirimi hizmeti isteği ve yanıt üst bilgileri.

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

Önemli notlar

  • Bu yordamda desteklenen OAuth 2.0 protokolü, V16 taslak sürümünü izler.
  • Açıklamalar için OAuth İsteği (RFC), bulut hizmetine başvurmak için "istemci" terimini kullanır.
  • OAuth taslağı son haline getirildiğinde bu yordamda değişiklikler olabilir.
  • Erişim belirteci birden çok bildirim isteği için yeniden kullanılabilir. Bu, bulut hizmetinin birçok bildirim göndermek için yalnızca bir kez kimlik doğrulaması yapmasına olanak tanır. Ancak erişim belirtecinin süresi dolduğunda bulut hizmetinin yeni bir erişim belirteci almak için yeniden kimlik doğrulaması yapması gerekir.

Bildirim gönderme

Bulut hizmeti, kanal URI'sini kullanarak kullanıcı için bir güncelleştirme olduğunda bildirim gönderebilir.

Yukarıda açıklanan erişim belirteci birden çok bildirim isteği için yeniden kullanılabilir; bulut sunucusunun her bildirim için yeni bir erişim belirteci istemesi gerekmez. Erişim belirtecinin süresi dolduysa bildirim isteği bir hata döndürür. Erişim belirteci reddedilirse bildiriminizi birden çok kez yeniden göndermeyi denememenizi öneririz. Bu hatayla karşılaşırsanız yeni bir erişim belirteci istemeniz ve bildirimi yeniden göndermeniz gerekir. Kesin hata kodu için bkz. Anında iletme bildirimi yanıt kodları.

  1. Bulut hizmeti, kanal URI'sine bir HTTP POST yapar. Bu istek SSL üzerinden yapılmalıdır ve gerekli üst bilgileri ve bildirim yükünü içerir. Yetkilendirme üst bilgisi, yetkilendirme için alınan erişim belirtecini içermelidir.

    Burada örnek bir istek gösterilmiştir. Söz dizimi ayrıntıları için bkz.anında iletme bildirimi yanıt kodları .

    Bildirim yükünü oluşturma hakkında ayrıntılı bilgi için bkz. Hızlı Başlangıç: push bildirimi gönderme. Kutucuk, bildirim veya rozet anında iletme bildiriminin içeriği, ilgili tanımlı Uyarlamalı kutucuklar şemasına uygun veya Eski kutucuklar şemasınauygun XML içeriği olarak sağlanır. Ham bildirimin yükü belirtilen bir yapıya sahip değil. Kesinlikle sadece uygulama tarafından tanımlanır.

     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. WNS, bildirimin alındığını ve bir sonraki kullanılabilir fırsatta teslim edildiğini belirtmek için yanıt verir. Ancak WNS, bildiriminizin cihaz veya uygulama tarafından alındığına ilişkin uçtan uca onay sağlamaz.

Bu diyagramda veri akışı gösterilmektedir:

Bildirim göndermek için wns diyagramı

Önemli notlar

  • WNS, bildirimin güvenilirliğini veya gecikme süresini garanti etmez.
  • Bildirimler hiçbir zaman gizli, hassas veya kişisel veriler içermemelidir.
  • Bildirim göndermek için bulut hizmetinin önce WNS ile kimlik doğrulaması yapması ve erişim belirteci alması gerekir.
  • Erişim belirteci, bulut hizmetinin yalnızca belirtecin oluşturulduğu tek uygulamaya bildirim göndermesine izin verir. Birden çok uygulamada bildirim göndermek için bir erişim belirteci kullanılamaz. Bu nedenle, bulut hizmetiniz birden çok uygulamayı destekliyorsa, her kanal URI'sine bildirim gönderirken uygulama için doğru erişim belirtecini sağlaması gerekir.
  • Cihaz çevrimdışı olduğunda, WNS varsayılan olarak her kanal URI'sinde her bildirim türünden (kutucuk, rozet, toast) birini depolar ve ham bildirim depolamaz.
  • Bildirim içeriğinin kullanıcıya kişiselleştirilmiş olduğu senaryolarda WNS, bulut hizmetinin bu güncelleştirmeler alındığında bu güncelleştirmeleri hemen göndermesini önerir. Bu senaryoya örnek olarak sosyal medya akışı güncelleştirmeleri, anlık iletişim davetleri, yeni ileti bildirimleri veya uyarılar verilebilir. Alternatif olarak, aynı genel güncelleştirmenin sık sık kullanıcılarınızın büyük bir alt kümesine teslim olduğu senaryolarınız olabilir; örneğin, hava durumu, hisse senedi ve haber güncelleştirmeleri. WNS yönergeleri, bu güncelleştirmelerin sıklığının en fazla 30 dakikada bir olması gerektiğini belirtir. Son kullanıcı veya WNS, daha sık yapılan rutin güncelleştirmelerin kötü amaçlı olduğunu belirleyebilir.
  • Windows Bildirim Platformu, yuvayı canlı ve sağlıklı tutmak için WNS ile düzenli bir veri bağlantısı tutar. Bildirim kanallarını isteyen veya kullanan uygulama yoksa yuva oluşturulmaz.

Karo ve rozet bildirimlerinin süresinin dolması

Varsayılan olarak, kutucuk ve rozet bildirimleri indirildikten üç gün sonra sona erer. Bir bildirimin süresi dolduğunda içerik kutucuktan veya kuyruktan kaldırılır ve artık kullanıcıya gösterilmez. Kutucuğunuzun içeriğinin ilgili olandan daha uzun süre kalıcı olmaması için tüm kutucuk ve rozet bildirimlerinde bir süre sonu (uygulamanız için anlamlı bir zaman kullanarak) ayarlamak en iyi yöntemdir. Açık bir süre sonu süresi, süresi tanımlanmış içerik için gereklidir. Bu, bulut hizmetiniz bildirim göndermeyi durdurursa veya kullanıcı ağ bağlantısını uzun bir süre için keserse eski içeriğin kaldırılmasını da sağlar.

Bulut hizmetiniz, bildiriminizin gönderildikten sonra geçerli kalacağı süreyi (saniye olarak) belirtmek üzere X-WNS-TTL HTTP üst bilgisini ayarlayarak her bildirim için bir süre sonu ayarlayabilir. Daha fazla bilgi için bkz. bildirim iletme hizmeti isteği ve yanıt üst bilgileri.

Örneğin, bir borsanın etkin işlem günü boyunca hisse senedi fiyat güncelleştirmesinin süre sonunu, gönderme aralığınızın iki katı olarak ayarlayabilirsiniz (örneğin, yarım saatte bir bildirim gönderiyorsanız alındıktan bir saat sonra). Başka bir örnek olarak, bir haber uygulaması bir günlük haber kutucuğu güncelleştirmesi için uygun bir son kullanma süresi olduğunu belirleyebilir.

Anında iletme bildirimleri ve pil tasarrufu

Pil tasarrufu, cihazdaki arka plan etkinliğini sınırlayarak pil ömrünü uzatır. Windows 10, pil belirtilen eşiğin altına düştüğünde kullanıcının pil tasarrufunu otomatik olarak açmasını sağlar. Pil tasarrufu açık olduğunda, enerji tasarrufu sağlamak için anında iletme bildirimlerinin alınması devre dışı bırakılır. Ancak bunun birkaç istisnası vardır. Aşağıdaki Windows 10 pil tasarrufu ayarları (Windows Ayarları'nda bulunur), pil tasarrufu açık olsa bile uygulamanızın anında iletme bildirimleri almasına olanak sağlar.

  • Pil tasarrufu sırasında herhangi bir uygulamadan anında iletme bildirimlerine izin ver: Bu ayar, pil tasarrufu açıkken tüm uygulamaların anında iletme bildirimleri almasını sağlar. Bu ayarın yalnızca masaüstü sürümleri (Home, Pro, Enterprise ve Education) için Windows 10 için geçerli olduğunu unutmayın.
  • Her zaman izin verilir: Bu ayar, anında iletme bildirimleri almak da dahil olmak üzere pil tasarrufu açıkken belirli uygulamaların arka planda çalışmasını sağlar. Bu liste kullanıcı tarafından el ile korunur.

Bu iki ayarın durumunu denetlemenin hiçbir yolu yoktur, ancak pil tasarrufu durumunu de kontrol edebilirsiniz. Windows 10'da, pil tasarrufu durumunu denetlemek için EnergySaverStatus özelliğini kullanın. Uygulamanız, pil tasarrufundaki değişiklikleri dinlemek için EnergySaverStatusChanged olayını da kullanabilir.

Uygulamanız yoğun olarak anında iletme bildirimlerine bağımlıysa, kullanıcılara pil tasarrufu açıkken bildirim almayabileceklerini bildirmenizi ve pil tasarrufu ayarlarını ayarlamalarını kolaylaştırmalarını öneririz. Windows'da pil tasarrufu ayarları URI şemasını kullanarak, ms-settings:batterysaver-settingsWindows Ayarları'na uygun bir bağlantı sağlayabilirsiniz.

Tip

Kullanıcıya pil tasarrufu ayarları hakkında bilgi verirken, gelecekte iletiyi gizlemenin bir yolunu sağlamanızı öneririz. Örneğin, aşağıdaki örnekteki dontAskMeAgainBox onay kutusu, kullanıcının tercihini LocalSettingsiçinde saklar.

Aşağıda, Windows 10'da pil tasarrufunun açık olup olmadığını denetlemeye yönelik bir örnek verilmiştir. Bu örnek kullanıcıya bildirir ve Ayarlar'ı pil tasarrufu ayarlarına başlatır. , dontAskAgainSetting kullanıcının yeniden bildirim almak istememesi durumunda iletiyi gizlemesine olanak tanır.

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.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/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.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::Windows::UI::Xaml;
using namespace winrt::Windows::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));
        }
    }
}

Bu örnekte öne çıkan ContentDialog için XAML budur.

<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>