Kayıt yönetimi

Bu konuda, anında iletme bildirimleri almak için cihazların bildirim hub'larına nasıl kaydedilecekleri açıklanmaktadır. Bu konu başlığı altında üst düzeydeki kayıtlar açıklanır ve ardından cihazları kaydetmek için iki ana desen tanıtılır: cihazdan doğrudan bildirim hub'ına kaydolma ve bir uygulama arka ucu aracılığıyla kaydetme.

Cihaz kaydı nedir?

Bildirim Hub'ı ile cihaz kaydı, Kayıt veya Yükleme kullanılarak gerçekleştirilir.

Kayıtlar

Kayıt, bir cihaz için Platform Bildirim Hizmeti (PNS) tanıtıcısını etiketlerle ve büyük olasılıkla bir şablonla ilişkilendirir. PNS tanıtıcısı bir ChannelURI veya cihaz belirteci kayıt kimliği olabilir. Etiketler, bildirimleri doğru cihaz tanıtıcılarına yönlendirmek için kullanılır. Daha fazla bilgi için bkz . Yönlendirme ve Etiket İfadeleri. Şablonlar kayıt başına dönüştürme uygulamak için kullanılır. Daha fazla bilgi için bkz. Şablonlar.

Not

Azure Notification Hubs, cihaz başına en fazla 60 etiketi destekler.

Yüklemeler

Yükleme, gönderimle ilgili özellikler içeren gelişmiş bir kayıttır. Sunucu tarafı .NET SDK'sını (arka uç işlemleri için Notification Hub SDK'sı) kullanarak cihazlarınızı kaydetmeye yönelik en son ve en iyi yaklaşımdır. Yüklemeleri istemci cihazının kendisine kaydetmek için Notification Hubs REST API yaklaşımını da kullanabilirsiniz. Arka uç hizmeti kullanıyorsanız, arka uç işlemleri için Notification Hub SDK'sını kullanabilmeniz gerekir.

Yüklemeleri kullanmanın bazı önemli avantajları şunlardır:

  • Yükleme oluşturma veya güncelleştirme tam olarak bir kez etkili olur. Böylece yinelenen kayıtlarla ilgili hiçbir endişeniz olmadan yeniden deneyebilirsiniz.
  • Yükleme modeli, doğrudan belirli bir cihaza bildirim göndermeyi sağlayan özel bir etiket biçimini ($InstallationId:{INSTALLATION_ID}) destekler. Örneğin, uygulamanın kodu bu cihaz için yükleme kimliğini joe93developer ayarlarsa, bir geliştirici etikete $InstallationId:{joe93developer} bildirim gönderirken bu cihazı hedefleyebilir. Bu, ek kodlama yapmak zorunda kalmadan belirli bir cihazı hedeflemenizi sağlar.
  • Yüklemeleri kullanmak, kısmi kayıt güncelleştirmeleri yapmanıza da olanak tanır. JSON-Patch standardı kullanılarak bir PATCH yöntemiyle bir yüklemenin kısmi güncelleştirmesi istenir. Bu, kayıtta etiketleri güncelleştirmek istediğinizde kullanışlıdır. Kaydın tamamını aşağı çekip önceki tüm etiketleri yeniden göndermeniz gerekmez.

Yükleme aşağıdaki özellikleri içerebilir. Yükleme özelliklerinin tam listesi için bkz. REST API veya Yükleme Özellikleri ile Yükleme Oluşturma veya Üzerine Yazma.

// Example installation format to show some supported properties
{
    installationId: "",
    expirationTime: "",
    tags: [],
    platform: "",
    pushChannel: "",
    ………
    templates: {
        "templateName1" : {
            body: "",
            tags: [] },
        "templateName2" : {
            body: "",
            // Headers are for Windows Store only
            headers: {
                "X-WNS-Type": "wns/tile" }
            tags: [] }
    },
    secondaryTiles: {
        "tileId1": {
            pushChannel: "",
            tags: [],
            templates: {
                "otherTemplate": {
                    bodyTemplate: "",
                    headers: {
                        ... }
                    tags: [] }
            }
        }
    }
}

Not

Varsayılan olarak, kayıtların ve yüklemelerin süresi dolmaz.

Kayıtlar ve yüklemeler, her cihaz/kanal için geçerli bir PNS tanıtıcısı içermelidir. PNS tanıtıcıları yalnızca cihazdaki bir istemci uygulamasında elde edilebildiğinden, bir desen doğrudan bu cihaza istemci uygulamasına kaydolmaktır. Öte yandan, etiketlerle ilgili güvenlik konuları ve iş mantığı, uygulama arka ucunda cihaz kaydını yönetmenizi gerektirebilir.

PNS tarafından süresi dolmuş bir tanıtıcıya gönderim yapıldığında Azure Notification Hubs, PNS sunucusundan alınan yanıta göre ilişkili yükleme/kayıt kaydını otomatik olarak temizler. süresi dolan kayıtları ikincil bildirim hub'ından temizlemek için her bir göndermeden gelen geri bildirimleri işleyen özel mantık ekleyin. Ardından, ikincil bildirim hub'ında yüklemeyi/kaydı sona erdirin.

Not

Yüklemeler API'si Baidu hizmetini desteklemez (Kayıtlar API'sinin desteklemesine rağmen).

Şablonlar

Şablonlar'ı kullanmak istiyorsanız, cihaz yüklemesi bu cihazla ilişkilendirilmiş tüm şablonları da JSON biçiminde tutar (yukarıdaki örne bakın). Şablon adları aynı cihaz için farklı şablonları hedeflemeye yardımcı olur.

Her şablon adı bir şablon gövdesine ve isteğe bağlı bir etiket kümesine eşler. Ayrıca, her platform ek şablon özelliklerine sahip olabilir. Windows Mağazası için (WNS kullanılarak), şablonun bir parçası ek bir üst bilgi kümesi olabilir. APN'ler söz konusu olduğunda, bir süre sonu özelliğini sabit veya şablon ifadesi olarak ayarlayabilirsiniz. Yükleme özelliklerinin tam listesi için BKZ. REST ile Yükleme oluşturma veya üzerine yazma konusu.

Windows Mağazası Uygulamaları için İkincil Kutucuklar

Windows Mağazası istemci uygulamaları için, ikincil kutucuklara bildirim göndermek, bunları birincil kutucuklara göndermekle aynıdır. Bu, yüklemelerde de desteklenir. İkincil kutucuklar, istemci uygulamanızdaki SDK'nın saydam olarak işlediği farklı bir ChannelUri'ye sahiptir.

SecondaryTiles sözlüğü, Windows Mağazası uygulamanızda SecondaryTiles nesnesini oluşturmak için kullanılan TileId değerini kullanır. Birincil ChannelUri'de olduğu gibi, ikincil kutucukların ChannelUri'leri her an değişebilir. Bildirim hub'ında yüklemeleri güncel tutmak için cihazın bunları ikincil kutucukların geçerli ChannelUri'leriyle yenilemesi gerekir.

Cihazdan kayıt yönetimi

İstemci uygulamalarından cihaz kaydını yönetirken, arka uç yalnızca bildirim göndermekten sorumludur. İstemci uygulamaları PNS tanıtıcılarını güncel tutar ve etiketleri kaydeder. Aşağıdaki resimde bu desen gösterilmektedir.

Cihazdan kayıt

Cihaz önce PNS tanıtıcısını PNS'den alır, ardından doğrudan bildirim hub'ına kaydeder. Kayıt başarılı olduktan sonra uygulama arka ucu bu kaydı hedefleyen bir bildirim gönderebilir. Bildirim gönderme hakkında daha fazla bilgi için bkz . Yönlendirme ve Etiket İfadeleri.

Bu durumda, cihazdan bildirim hub'larınıza erişmek için yalnızca Dinleme haklarını kullanırsınız. Daha fazla bilgi için bkz . Güvenlik.

Cihazdan kaydolmak en basit yöntemdir ancak bazı dezavantajları vardır:

  • İstemci uygulaması yalnızca uygulama etkin olduğunda etiketlerini güncelleştirebilir. Örneğin, bir kullanıcının spor takımları ile ilgili etiketleri kaydeden iki cihazı varsa, ilk cihaz ek bir etikete (örneğin Seahawks) kaydolduğunda, ikinci cihaz ikinci cihazdaki uygulama ikinci kez yürütülene kadar Seahawks hakkındaki bildirimleri almaz. Daha genel olarak, etiketler birden çok cihazdan etkilendiğinde, etiketleri arka uçtan yönetmek tercih edilen bir seçenektir.
  • Uygulamalar ele geçirilebildiği için, Güvenlik makalesinde açıklandığı gibi kaydın belirli etiketlerle güvenli hale getirilmesi için ek özen gerekir.

Yükleme kullanarak bir cihazdan bildirim hub'ına kaydolmak için örnek kod

Şu anda bu yalnızca Notification Hubs REST API'sini kullanarak desteklenir.

Yüklemeyi güncelleştirmek için JSON-Patch standardını kullanarak PATCH yöntemini de kullanabilirsiniz.

class DeviceInstallation
{
    public string installationId { get; set; }
    public string platform { get; set; }
    public string pushChannel { get; set; }
    public string[] tags { get; set; }

    private async Task<HttpStatusCode> CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation,
        string hubName, string listenConnectionString)
    {
        if (deviceInstallation.installationId == null)
            return HttpStatusCode.BadRequest;

        // Parse connection string (https://msdn.microsoft.com/library/azure/dn495627.aspx)
        ConnectionStringUtility connectionSaSUtil = new ConnectionStringUtility(listenConnectionString);
        string hubResource = "installations/" + deviceInstallation.installationId + "?";
        string apiVersion = "api-version=2015-04";

        // Determine the targetUri that we will sign
        string uri = connectionSaSUtil.Endpoint + hubName + "/" + hubResource + apiVersion;

        //=== Generate SaS Security Token for Authorization header ===
        // See https://msdn.microsoft.com/library/azure/dn495627.aspx
        string SasToken = connectionSaSUtil.getSaSToken(uri, 60);

        using (var httpClient = new HttpClient())
        {
            string json = JsonConvert.SerializeObject(deviceInstallation);

            httpClient.DefaultRequestHeaders.Add("Authorization", SasToken);

            var response = await httpClient.PutAsync(uri, new StringContent(json, System.Text.Encoding.UTF8, "application/json"));
            return response.StatusCode;
        }
    }

    var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

    string installationId = null;
    var settings = ApplicationData.Current.LocalSettings.Values;

    // If we have not stored an installation ID in application data, create and store as application data.
    if (!settings.ContainsKey("__NHInstallationId"))
    {
        installationId = Guid.NewGuid().ToString();
        settings.Add("__NHInstallationId", installationId);
    }

    installationId = (string)settings["__NHInstallationId"];

    var deviceInstallation = new DeviceInstallation
    {
        installationId = installationId,
        platform = "wns",
        pushChannel = channel.Uri,
        //tags = tags.ToArray<string>()
    };

    var statusCode = await CreateOrUpdateInstallationAsync(deviceInstallation, 
                    "<HUBNAME>", "<SHARED LISTEN CONNECTION STRING>");

    if (statusCode != HttpStatusCode.Accepted)
    {
        var dialog = new MessageDialog(statusCode.ToString(), "Registration failed. Installation Id : " + installationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
    else
    {
        var dialog = new MessageDialog("Registration successful using installation Id : " + installationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
}

Kayıt kullanarak bir cihazdan bildirim hub'ına kaydolmak için örnek kod

Bu yöntemler, çağrıldıkları cihaz için bir kayıt oluşturur veya güncelleştirir. Bu, tanıtıcıyı veya etiketleri güncelleştirmek için kaydın tamamının üzerine yazmanız gerektiği anlamına gelir. Kayıtların geçici olduğunu unutmayın, bu nedenle her zaman belirli bir cihazın ihtiyaç duyduğu geçerli etiketlere sahip güvenilir bir mağazanız olmalıdır.

// Initialize the Notification Hub
NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(listenConnString, hubName);

// The Device ID from the PNS
var pushChannel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

// If you are registering from the client itself, then store this registration ID in device
// storage. Then when the app starts, you can check if a registration ID already exists or not before
// creating.
var settings = ApplicationData.Current.LocalSettings.Values;

// If we have not stored a registration ID in application data, store in application data.
if (!settings.ContainsKey("__NHRegistrationId"))
{
    // make sure there are no existing registrations for this push handle (used for iOS and Android)    
    string newRegistrationId = null;
    var registrations = await hub.GetRegistrationsByChannelAsync(pushChannel.Uri, 100);
    foreach (RegistrationDescription registration in registrations)
    {
        if (newRegistrationId == null)
        {
            newRegistrationId = registration.RegistrationId;
        }
        else
        {
            await hub.DeleteRegistrationAsync(registration);
        }
    }

    newRegistrationId = await hub.CreateRegistrationIdAsync();

    settings.Add("__NHRegistrationId", newRegistrationId);
}

string regId = (string)settings["__NHRegistrationId"];

RegistrationDescription registration = new WindowsRegistrationDescription(pushChannel.Uri);
registration.RegistrationId = regId;
registration.Tags = new HashSet<string>(YourTags);

try
{
    await hub.CreateOrUpdateRegistrationAsync(registration);
}
catch (Microsoft.WindowsAzure.Messaging.RegistrationGoneException e)
{
    settings.Remove("__NHRegistrationId");
}

Arka uçtan kayıt yönetimi

Kayıtların arka uçtan yönetilmesi için ek kod yazılması gerekir. Cihazdaki uygulama, uygulama her başlatıldığında arka uçta güncelleştirilmiş PNS tanıtıcısını sağlamalıdır (etiketler ve şablonlarla birlikte) ve arka ucun bildirim hub'ından bu tanıtıcıyı güncelleştirmesi gerekir. Aşağıdaki resimde bu tasarım gösterilmektedir.

Kayıt yönetimi

Kayıtları arka uçtan yönetmenin avantajları, cihazdaki ilgili uygulama etkin olmadığında bile etiketlerde değişiklik yapabilmeyi ve kaydına etiket eklemeden önce istemci uygulamasının kimliğini doğrulamayı içerir.

Yükleme kullanarak arka uçtan bildirim hub'ına kaydolmaya yönelik örnek kod

İstemci cihaz, PNS tanıtıcısını ve ilgili yükleme özelliklerini daha önce olduğu gibi almaya devam eder ve arka uçta kayıt ve yetkilendirme etiketlerini vb. gerçekleştirebilen özel bir API çağırır. Arka uç, arka uç işlemleri için Notification Hub SDK'sını kullanabilir.

Yüklemeyi güncelleştirmek için JSON-Patch standardını kullanarak PATCH yöntemini de kullanabilirsiniz.

// Initialize the Notification Hub
NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(listenConnString, hubName);

// Custom API on the backend
public async Task<HttpResponseMessage> Put(DeviceInstallation deviceUpdate)
{

    Installation installation = new Installation();
    installation.InstallationId = deviceUpdate.InstallationId;
    installation.PushChannel = deviceUpdate.Handle;
    installation.Tags = deviceUpdate.Tags;

    switch (deviceUpdate.Platform)
    {
        case "wns":
            installation.Platform = NotificationPlatform.Wns;
            break;
        case "apns":
            installation.Platform = NotificationPlatform.Apns;
            break;
        case "fcm":
            installation.Platform = NotificationPlatform.Fcm;
            break;
        default:
            throw new HttpResponseException(HttpStatusCode.BadRequest);
    }


    // In the backend we can control if a user is allowed to add tags
    //installation.Tags = new List<string>(deviceUpdate.Tags);
    //installation.Tags.Add("username:" + username);

    await hub.CreateOrUpdateInstallationAsync(installation);

    return Request.CreateResponse(HttpStatusCode.OK);
}

Kayıt kimliği kullanarak arka uçtan bir bildirim hub'ına kaydolmak için örnek kod

Uygulama arka ucunuzdan, kayıtlar üzerinde temel CRUDS işlemleri gerçekleştirebilirsiniz. Örnek:

var hub = NotificationHubClient.CreateClientFromConnectionString("{connectionString}", "hubName");

// create a registration description object of the correct type, e.g.
var reg = new WindowsRegistrationDescription(channelUri, tags);

// Create
await hub.CreateRegistrationAsync(reg);

// Get by ID
var r = await hub.GetRegistrationAsync<RegistrationDescription>("id");

// update
r.Tags.Add("myTag");

// update on hub
await hub.UpdateRegistrationAsync(r);

// delete
await hub.DeleteRegistrationAsync(r);

Arka uç, kayıt güncelleştirmeleri arasındaki eşzamanlılığı işlemelidir. Service Bus, kayıt yönetimi için iyimser eşzamanlılık denetimi sunar. HTTP düzeyinde bu, kayıt yönetimi işlemlerinde ETag kullanımıyla uygulanır. Bu özellik, eşzamanlılık nedeniyle bir güncelleştirme reddedilirse özel durum oluşturan Microsoft SDK'ları tarafından saydam olarak kullanılır. Uygulama arka ucu bu özel durumları işlemek ve gerekirse güncelleştirmeyi yeniden denemekle sorumludur.