Öğretici: Belirli Windows Phone cihazlar için Azure Notification Hubs'ı kullanarak anında iletme bildirimleriTutorial: Push notifications to specific Windows Phone devices by using Azure Notification Hubs

Bu öğreticide, belirli Windows Phone 8 veya Windows Phone 8.1 Scihazlara anında iletme bildirimleri göndermek için Azure Notification Hubs’ın nasıl kullanılacağı gösterilmektedir.This tutorial shows you how to use Azure Notification Hubs to send push notifications to specific Windows Phone 8 or Windows Phone 8.1 devices. Windows Phone 8.1’i (Silverlight olmayan) hedefliyorsanız bu öğreticinin Windows Evrensel sürümüne bakın.If you are targeting Windows Phone 8.1 (non-Silverlight), see the Windows Universal version of this tutorial.

Bildirim hub’ında bir kayıt oluştururken bir veya daha fazla etiketi dahil ederek bu senaryoyu etkinleştirirsiniz.You enable this scenario by including one or more tags when creating a registration in the notification hub. Bir etikete bildirimler gönderildiğinde, etikete kaydolan tüm cihazlar bildirimi alır.When notifications are sent to a tag, all devices that have registered for the tag receive the notification. Etiketler hakkında daha fazla bilgi için bkz. Kayıtlardaki etiketler.For more information about tags, see Tags in registrations.

Not

Notification Hubs Windows Phone SDK'sı, Windows Anında Bildirim Hizmeti'ni (WNS) Windows Phone 8.1 Silverlight uygulamaları ile kullanmayı desteklemez.The Notification Hubs Windows Phone SDK does not support using the Windows Push Notification Service (WNS) with Windows Phone 8.1 Silverlight apps. WNS’yi (MPNS yerine) Windows Phone 8.1 Silverlight uygulamaları ile kullanmak için REST API’ler kullanan [Notification Hubs - Windows Phone Silverlight öğreticisini] izleyin.To use WNS (instead of MPNS) with Windows Phone 8.1 Silverlight apps, follow the [Notification Hubs - Windows Phone Silverlight tutorial], which uses REST APIs.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:In this tutorial, you learn how to:

  • Mobil uygulamaya kategori seçimi eklemeAdd category selection to the mobile app
  • Etiketlerle bildirimlere kaydolmaRegister for notifications with tags
  • Etiketli bildirimler göndermeSend tagged notifications
  • Uygulamayı test edinTest the app

ÖnkoşullarPrerequisites

Tamamlamak Öğreticisi: Azure Notification Hubs'ı kullanarak anında iletme bildirimleri için Windows Phone uygulamaları.Complete the Tutorial: Push notifications to Windows Phone apps by using Azure Notification Hubs. Bu öğreticide, ilginizi çeken son dakika haberi kategorilerine kaydolabilmeniz ve yalnızca bu kategoriler için anında iletme bildirimleri alabilmeniz için mobil uygulamayı güncelleştirirsiniz.In this tutorial, you update the mobile application so that you can register for breaking news categories you are interested in, and receive only push notifications for those categories.

Mobil uygulamaya kategori seçimi eklemeAdd category selection to the mobile app

İlk adım, mevcut ana sayfanıza kullanıcının kaydolunacak kategorileri seçmesini sağlayan UI öğeleri eklemektir.The first step is to add the UI elements to your existing main page that enable the user to select categories to register. Bir kullanıcı tarafından seçilen kategoriler cihazda depolanır.The categories selected by a user are stored on the device. Uygulama başlatıldığında, etiketler olarak seçilen kategorilerle bildirim hub’ınızda bir cihaz kaydı oluşturulur.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Açık MainPage.xaml dosya sonra Değiştir Grid adlı öğe TitlePanel ve ContentPanel aşağıdaki kod ile:Open the MainPage.xaml file, then replace the Grid elements named TitlePanel and ContentPanel with the following code:

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock Text="Breaking News" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
        <TextBlock Text="Categories" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>
    
    <Grid Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <CheckBox Name="WorldCheckBox" Grid.Row="0" Grid.Column="0">World</CheckBox>
        <CheckBox Name="PoliticsCheckBox" Grid.Row="1" Grid.Column="0">Politics</CheckBox>
        <CheckBox Name="BusinessCheckBox" Grid.Row="2" Grid.Column="0">Business</CheckBox>
        <CheckBox Name="TechnologyCheckBox" Grid.Row="0" Grid.Column="1">Technology</CheckBox>
        <CheckBox Name="ScienceCheckBox" Grid.Row="1" Grid.Column="1">Science</CheckBox>
        <CheckBox Name="SportsCheckBox" Grid.Row="2" Grid.Column="1">Sports</CheckBox>
        <Button Name="SubscribeButton" Content="Subscribe" HorizontalAlignment="Center" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Click="SubscribeButton_Click" />
    </Grid>
    
  2. Adlı bir sınıf ekleyin Notifications projeye.Add a class named Notifications to the project. Ekleme public sınıf tanımına değiştiricisi.Add the public modifier to the class definition. Ardından, aşağıdaki ekleyin using deyimleri yeni dosya için:Then, add the following using statements to the new file:

    using Microsoft.Phone.Notification;
    using Microsoft.WindowsAzure.Messaging;
    using System.IO.IsolatedStorage;
    using System.Windows;
    
  3. Yeni içine aşağıdaki kodu kopyalayın Notifications sınıfı:Copy the following code into the new Notifications class:

    private NotificationHub hub;
    
    // Registration task to complete registration in the ChannelUriUpdated event handler
    private TaskCompletionSource<Registration> registrationTask;
    
    public Notifications(string hubName, string listenConnectionString)
    {
        hub = new NotificationHub(hubName, listenConnectionString);
    }
    
    public IEnumerable<string> RetrieveCategories()
    {
        var categories = (string)IsolatedStorageSettings.ApplicationSettings["categories"];
        return categories != null ? categories.Split(',') : new string[0];
    }
    
    public async Task<Registration> StoreCategoriesAndSubscribe(IEnumerable<string> categories)
    {
        var categoriesAsString = string.Join(",", categories);
        var settings = IsolatedStorageSettings.ApplicationSettings;
        if (!settings.Contains("categories"))
        {
            settings.Add("categories", categoriesAsString);
        }
        else
        {
            settings["categories"] = categoriesAsString;
        }
        settings.Save();
    
        return await SubscribeToCategories();
    }
    
    public async Task<Registration> SubscribeToCategories()
    {
        registrationTask = new TaskCompletionSource<Registration>();
    
        var channel = HttpNotificationChannel.Find("MyPushChannel");
    
        if (channel == null)
        {
            channel = new HttpNotificationChannel("MyPushChannel");
            channel.Open();
            channel.BindToShellToast();
            channel.ChannelUriUpdated += channel_ChannelUriUpdated;
    
            // This is optional, used to receive notifications while the app is running.
            channel.ShellToastNotificationReceived += channel_ShellToastNotificationReceived;
        }
    
        // If channel.ChannelUri is not null, complete the registrationTask here.  
        // If it is null, the registrationTask will be completed in the ChannelUriUpdated event handler.
        if (channel.ChannelUri != null)
        {
            await RegisterTemplate(channel.ChannelUri);
        }
    
        return await registrationTask.Task;
    }
    
    async void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
    {
        await RegisterTemplate(e.ChannelUri);
    }
    
    async Task<Registration> RegisterTemplate(Uri channelUri)
    {
        // Using a template registration to support notifications across platforms.
        // Any template notifications that contain messageParam and a corresponding tag expression
        // will be delivered for this registration.
    
        const string templateBodyMPNS = "<wp:Notification xmlns:wp=\"WPNotification\">" +
                                            "<wp:Toast>" +
                                                "<wp:Text1>$(messageParam)</wp:Text1>" +
                                            "</wp:Toast>" +
                                        "</wp:Notification>";
    
        // The stored categories tags are passed with the template registration.
    
        registrationTask.SetResult(await hub.RegisterTemplateAsync(channelUri.ToString(),
            templateBodyMPNS, "simpleMPNSTemplateExample", this.RetrieveCategories()));
    
        return await registrationTask.Task;
    }
    
    // This is optional. It is used to receive notifications while the app is running.
    void channel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
    {
        StringBuilder message = new StringBuilder();
        string relativeUri = string.Empty;
    
        message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
    
        // Parse out the information that was part of the message.
        foreach (string key in e.Collection.Keys)
        {
            message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
    
            if (string.Compare(
                key,
                "wp:Param",
                System.Globalization.CultureInfo.InvariantCulture,
                System.Globalization.CompareOptions.IgnoreCase) == 0)
            {
                relativeUri = e.Collection[key];
            }
        }
    
        // Display a dialog of all the fields in the toast.
        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            MessageBox.Show(message.ToString());
        });
    }
    

    Bu sınıf, bu cihazın alacağı haber kategorilerini depolamak için yalıtılmış depolamayı kullanır.This class uses the isolated storage to store the categories of news that this device is to receive. Ayrıca bir şablon bildirim kaydı kullanılarak bu kategorilere kaydolma yöntemlerini de içerir.It also contains methods to register for these categories using a template notification registration.

  4. İçinde App.xaml.cs proje dosyası, aşağıdaki özelliği ekleyin App sınıfı.In the App.xaml.cs project file, add the following property to the App class. <hub name> ve <connection string with listen access> yer tutucularını, daha önce edindiğiniz bildirim hub'ı adınız ve DefaultListenSharedAccessSignature bağlantı dizeniz ile değiştirin.Replace the <hub name> and <connection string with listen access> placeholders with your notification hub name and the connection string for DefaultListenSharedAccessSignature that you obtained earlier.

    public Notifications notifications = new Notifications("<hub name>", "<connection string with listen access>");
    

    Not

    Bir istemci uygulaması ile dağıtılmış kimlik bilgileri genellikle güvenli olmadığından yalnızca istemci uygulamanızla dinleme erişimi için anahtarı dağıtmanız gerekir.Because credentials that are distributed with a client app are not generally secure, you should only distribute the key for listen access with your client app. Dinleme erişimi, uygulamanızın bildirimlere kaydolmasını sağlar, ancak mevcut kayıtlar değiştirilemez ve bildirimler gönderilemez.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. Tam erişim anahtarı, güvenli bir arka uç hizmetinde bildirimler göndermek ve mevcut kayıtları değiştirmek için kullanılır.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  5. İçinde MainPage.xaml.cs, aşağıdaki satırı ekleyin:In the MainPage.xaml.cs, add the following line:

    using Windows.UI.Popups;
    
  6. MainPage.xaml.cs proje dosyasına aşağıdaki yöntemi ekleyin:In the MainPage.xaml.cs project file, add the following method:

    private async void SubscribeButton_Click(object sender, RoutedEventArgs e)
    {
        var categories = new HashSet<string>();
        if (WorldCheckBox.IsChecked == true) categories.Add("World");
        if (PoliticsCheckBox.IsChecked == true) categories.Add("Politics");
        if (BusinessCheckBox.IsChecked == true) categories.Add("Business");
        if (TechnologyCheckBox.IsChecked == true) categories.Add("Technology");
        if (ScienceCheckBox.IsChecked == true) categories.Add("Science");
        if (SportsCheckBox.IsChecked == true) categories.Add("Sports");
    
        var result = await ((App)Application.Current).notifications.StoreCategoriesAndSubscribe(categories);
    
        MessageBox.Show("Subscribed to: " + string.Join(",", categories) + " on registration id : " +
            result.RegistrationId);
    }
    

    Bu yöntem kategoriler kullanır ve bir liste oluşturur Notifications sınıf listesi yerel depolama alanında depolayın ve karşılık gelen kaydetmek için bildirim hub'ınızla etiketler.This method creates a list of categories and uses the Notifications class to store the list in the local storage and register the corresponding tags with your notification hub. Kategoriler değiştirildiğinde kayıt yeni kategorilerle yeniden oluşturulur.When categories are changed, the registration is recreated with the new categories.

Uygulamalarınız artık bir kategori kümesini cihazdaki yerel depolama alanında depolayabilir ve kullanıcının kategori seçimini her değiştirmesinde bildirim hub’ına kaydolabilir.Your app is now able to store a set of categories in local storage on the device and register with the notification hub whenever the user changes the selection of categories.

Bildirimlere kaydolmaRegister for notifications

Bu adımlar, yerel depolama alanında depolanan kategorileri kullanarak başlatma sırasında bildirim hub’ına kaydolur.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Not

Microsoft Anında Bildirim Hizmeti (MPNS) tarafından atanan kanal URI’si her zaman değişebileceğinden, bildirim hatalarını önlemek için sık sık bildirimlere kaydolmanız gerekir.Because the channel URI assigned by the Microsoft Push Notification Service (MPNS) can change at any time, you should register for notifications frequently to avoid notification failures. Bu örnek, uygulama her başlatıldığında bildirimlere kaydolur.This example registers for notifications every time that the app starts. Sık sık çalıştırılan uygulamalar için, önceki kayıttan bu yana bir günden az zaman geçtiyse bant genişliğini korumak için günde birkaç kere kaydı atlayabilirsiniz.For apps that are run frequently, more than once a day, you can probably skip registration to preserve bandwidth if less than a day has passed since the previous registration.

  1. App.xaml.cs dosyasını açın ve eklemek async değiştiriciyi Application_Launching yöntemi ve Notification Hubs kayıt, eklenen kod Değiştir Notification Hubs’ı kullanmaya başlama aşağıdaki kod ile:Open the App.xaml.cs file and add the async modifier to Application_Launching method and replace the Notification Hubs registration code that you added in Get started with Notification Hubs with the following code:

    private async void Application_Launching(object sender, LaunchingEventArgs e)
    {
        var result = await notifications.SubscribeToCategories();
    
        if (result != null)
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show("Registration Id :" + result.RegistrationId, "Registered", MessageBoxButton.OK);
            });
    }
    

    Bu kod, uygulama her başlatıldığında uygulamanın yerel depolama alanından kategorileri aldığından ve bu kategorilere kayıt isteğinde bulunduğundan emin olur.This code makes sure that every time the app starts it retrieves the categories from local storage and requests a registration for these categories.

  2. MainPage.xaml.cs proje dosyasında uygulayan aşağıdaki kodu ekleyin OnNavigatedTo yöntemi:In the MainPage.xaml.cs project file, add the following code that implements the OnNavigatedTo method:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var categories = ((App)Application.Current).notifications.RetrieveCategories();
    
        if (categories.Contains("World")) WorldCheckBox.IsChecked = true;
        if (categories.Contains("Politics")) PoliticsCheckBox.IsChecked = true;
        if (categories.Contains("Business")) BusinessCheckBox.IsChecked = true;
        if (categories.Contains("Technology")) TechnologyCheckBox.IsChecked = true;
        if (categories.Contains("Science")) ScienceCheckBox.IsChecked = true;
        if (categories.Contains("Sports")) SportsCheckBox.IsChecked = true;
    }
    

    Bu kod, önceden kaydedilmiş kategorilerin durumuna göre ana sayfayı güncelleştirir.This code updates the main page based on the status of previously saved categories.

Uygulama artık tamamlanmıştır ve kullanıcının kategori seçimini her değiştirmesinde bildirim hub’ına kaydolmak için kullanılan cihazın yerel depolama alanında bir kategori kümesini depolayabilir.The app is now complete and can store a set of categories in the device local storage used to register with the notification hub whenever the user changes the selection of categories. Daha sonra bu uygulamaya kategori bildirimleri gönderebilen bir arka uç tanımlayın.Next, define a backend that can send category notifications to this app.

Etiketli bildirimler göndermeSend tagged notifications

Bu bölümde, son dakika haberlerini .NET konsol uygulamasından etiketli şablon bildirimleri olarak yollarsınız.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. Visual Studio'da yeni bir görsel oluşturun C# konsol uygulaması: bir.In Visual Studio, create a new Visual C# console application: a. Menüsünde dosya > yeni > proje.On the menu, select File > New > Project. b.b. Genişletin Visual C# seçip Windows Masaüstü.Expand Visual C#, and select Windows Desktop. c.c. Seçin konsol uygulaması (.NET Framework) şablonları listesinde.Select Console App (.NET Framework) in the list of templates. d.d. Girin bir adı uygulama için.Enter a name for the app. e.e. Seçin bir klasör uygulama için.Select a folder for the app. f.f. Seçin Tamam projeyi oluşturmak için.Select OK to create the project.

  2. Visual Studio ana menüden Araçları > NuGet Paket Yöneticisi > Paket Yöneticisi Konsolu ve ardından konsol penceresinde aşağıdaki dizeyi girin:On the Visual Studio main menu, select Tools > NuGet Package Manager > Package Manager Console and then, in the console window, enter the following string:

    Install-Package Microsoft.Azure.NotificationHubs
    
  3. Enter tuşunu seçin.Select Enter.
    Bu eylem Microsoft.Azure.Notification Hubs NuGet paketi kullanarak Azure Notification Hubs SDK'sına bir başvuru ekler.This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.Notification Hubs NuGet package.

  4. Program.cs dosyasını açın ve aşağıdaki using deyimini ekleyin:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  5. Program sınıfında, aşağıdaki yöntemi ekleyin veya zaten mevcutsa değiştirin:In the Program class, add the following method, or replace it if it already exists:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Bu kod, dize dizisindeki altı etiketin her biri için bir şablon bildirimi gönderir.This code sends a template notification for each of the six tags in the string array. Etiketlerin kullanılması, cihazların yalnızca kayıtlı kategoriler için bildirim almasını sağlar.The use of tags ensures that devices receive notifications only for the registered categories.

  6. Önceki kodda, <hub name> ve <connection string with full access> yer tutucularını bildirim hub'ı adınız ve bildirim hub’ınızın panosundaki DefaultFullSharedAccessSignature bağlantı dizeniz ile değiştirin.In the preceding code, replace the <hub name> and <connection string with full access> placeholders with your notification hub name and the connection string for DefaultFullSharedAccessSignature from the dashboard of your notification hub.

  7. Ana yöntemine aşağıdaki satırları ekleyin:In the Main method, add the following lines:

    SendTemplateNotificationAsync();
    Console.ReadLine();
    
  8. Konsol uygulamasını oluşturun.Build the console app.

Uygulamayı test edinTest the app

  1. Visual Studio’da F5 tuşuna basarak uygulamayı derleyin ve başlatın.In Visual Studio, press F5 to compile and start the app.

    Kategoriler ile mobil uygulama

    Uygulama kullanıcı arabirimi, abone olunacak kategorileri seçmenize olanak sağlayan iki durumlu düğmeler sağlar.The app UI provides a set of toggles that lets you choose the categories to subscribe to.

  2. Bir veya daha fazla kategori iki durumlu düğmesini etkinleştirin ve Abone ol’a tıklayın.Enable one or more categories toggles, then click Subscribe.

    Uygulama, seçilen kategorileri etiketlere dönüştürür ve bildirim hub’ından seçilen etiketler için yeni bir cihaz kaydı ister.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. Kayıtlı kategoriler döndürülür ve bir iletişim kutusunda görüntülenir.The registered categories are returned and displayed in a dialog.

    Abone olunan ileti

  3. Kategorilerin aboneliğinin tamamlandığına dair bir onay aldıktan sonra, her kategoriye yönelik bildirimler göndermek için konsol uygulamasını çalıştırın.After receiving a confirmation that your categories were subscription completed, run the console app to send notifications for each category. Yalnızca abone olduğunuz kategorileri için bir bildirim aldığınızı doğrulayın.Verify you only receive a notification for the categories you have subscribed to.

    Bildirim iletisi

Sonraki adımlarNext steps

Bu öğreticide, kayıtlarıyla ilişkili etiketleri olan belirli cihazlara anında iletme bildirimleri göndermeyi öğrendiniz.In this tutorial, you learned how to push notifications to specific devices that have tags associated with their registrations. Birden fazla cihaz kullanıyor olabilecek belirli kullanıcılara nasıl anında iletme bildirimleri gönderileceğini öğrenmek için aşağıdaki öğreticiye ilerleyin:To learn how to push notifications to specific users who may be using multiple devices, advance to the following tutorial: