Kayıt yönetimi
Bu konu başlığında, anında bildirim almak için cihazların bildirim hub'ları ile nasıl kaydedilmesi açıklanmıştır. Bu konu başlığında kayıtlar yüksek düzeyde açıklanmıştır ve ardından cihazları kaydetmek için iki ana desen tanıtlanmıştır: cihazdan doğrudan bildirim hub'ını kaydetme ve uygulama arka ucu üzerinden kaydetme.
Cihaz kaydı nedir?
Bir Bildirim Hub'ı ile cihaz kaydı, Kayıt veya Yükleme kullanılarak yapılır.
Kayıtlar
Kayıt, bir cihaz için Platform Bildirim Hizmeti (PNS) tanıtıcısı ile etiketler ve muhtemelen bir şablon ilişkilendirmektedir. PNS tanıtıcısı channelURI, cihaz belirteci veya FCM kayıt kimliği olabilir. Etiketler, bildirimleri doğru cihaz tanıtıcı kümesine 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ürmeyi 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, anında yüklemeyle ilgili özellikler içeren gelişmiş bir kayıttır. Bu, sunucu tarafı .NET SDK'sı kullanarak cihazlarınızı kaydetmenin en son ve en iyi yaklaşımıdır ( arka uç işlemleriiçin Notification Hub SDK). İstemci cihazına yüklemeleri kaydetmek 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ı kullanasınız.
Yüklemeleri kullanmanın bazı önemli avantajları aşağıda ve ardından ve hatta daha fazladır:
- Bir yükleme oluşturma veya güncelleştirme tamamen bir etkilidir. Bu nedenle, yinelenen kayıtlarda herhangi bir kaygı olmadan yeniden denemeniz gerekir.
- Yükleme modeli, doğrudan belirli bir cihaza bildirim gönderilmesini sağlayan özel bir etiket biçimini (
$InstallationId:{INSTALLATION_ID}) destekler. Örneğin, uygulamanın kodu bu cihaz için yükleme kimliğini ayarlarsa, bir geliştirici etikete bildirim gönderirken bujoe93developercihazı$InstallationId:{joe93developer}hedefleyebilirsiniz. Bu, ek kodlama yapmak zorunda kalmadan belirli bir cihazı hedeflemeye olanak sağlar. - Yüklemeleri kullanmak kısmi kayıt güncelleştirmeleri de sağlar. JSON-Patch standardı kullanılarak bir PATCH yöntemiyle bir yüklemenin kısmi güncelleştirmesi istenmektedir. Bu, kayıtta etiketleri güncelleştirmek istediğiniz zaman kullanışlıdır. Kaydın tamamını çekmeniz ve ardından önceki etiketlerin tamamını yeniden yenidennız gerekli değil.
Yükleme aşağıdaki özellikleri içerebilir. Yükleme özelliklerinin tam listesi için, bkz. Create or Overwrite an Installation with REST API veya Installation Properties.
// 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çermesi gerekir. PNS tanıtıcıları yalnızca cihaz üzerinde bir istemci uygulamasında edinilene olduğundan, 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 gerekli kılmaktadır.
Not
Yüklemeler API'si Baidu hizmetini desteklemez (Ancak Kayıtlar API'si destekler).
Şablonlar
Not
Microsoft Anında Bildirim Hizmeti (MPNS) kullanım dışıdır ve artık desteklenmiyor.
Şablonları kullanmak için cihazyüklemesi, cihazla ilişkilendirilmiş tüm şablonları da JSON biçiminde tutar (yukarıdaki örneğine bakın). Şablon adları aynı cihaz için farklı şablonları hedeflemeye yardımcı olur.
Her şablon adı bir şablon gövdesi ve isteğe bağlı bir etiket kümesiyle eşler. Ayrıca, her platformun ek şablon özellikleri olabilir. Windows Store (WNS kullanarak) ve Windows Phone 8 (MPNS kullanarak) için ek bir üst bilgi kümesi şablonun parçası olabilir. APN'ler söz dizimlerinde süre sonu özelliğini sabit veya şablon ifadesi olarak ayarlayın. Yükleme özelliklerinin tam listesi için bkz. REST ile Yükleme Oluşturma veya Üzerine Yazma konusu.
Windows Store Uygulamaları için İkincil Kutucuklar
İstemci Windows için ikincil kutucuklara bildirim göndermek, bunları birincil kutucuklara göndermekle aynıdır. Bu, yüklemelerde de de destek içerir. İkincil kutucuklar, istemci uygulamanıza bağlı SDK'nın saydam bir şekilde işleyeni farklı bir ChannelUri'ye sahiptir.
SecondaryTiles sözlüğü, Windows Store uygulamanıza secondaryTiles nesnesini oluşturmak için kullanılan TileId'Windows kullanır. Birincil ChannelUri'de olduğu gibi, ikincil kutucukların ChannelUri'leri de herhangi bir anda değişebilir. Bildirim hub'unda yüklemeleri güncel tutmak için cihazın bunları ikincil kutucukların geçerli ChannelUris'leri ile yenilemesi gerekir.
Cihazdan kayıt yönetimi
İstemci uygulamalardan cihaz kaydı yönetilirken, arka uç yalnızca bildirim göndermekten sorumludur. İstemci uygulamaları PNS'nin güncel işlemelerini sağlar ve etiketleri kaydettirebilir. Aşağıdaki resim bu düzeni göstermektedir.

Cihaz önce PNS tanıtıcısını PNS'den alır, ardından doğrudan bildirim hub'ı ile kaydolr. Kayıt başarılı olduktan sonra, uygulama arka ucu bu kaydı hedef alan 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ına 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ştirebilirsiniz. Örneğin, bir kullanıcı spor takımlarına ilişkin etiketleri kaydeden iki cihaza sahipse, ilk cihaz ek bir etikete kaydoldu mu (örneğin, Sea artıklar), ikinci cihaza uygulama ikinci kez yürütülene kadar Seagat'lar hakkında bildirim almaz. Daha genel olarak, etiketler birden çok cihaz tarafından etkilendiği zaman, etiketlerin arka uçtan yönetilmesi tercih edilen bir seçenektir.
- Uygulamalar ele alına kadar güvenlik makalesinde açıklanan şekilde, belirli etiketlere kaydın güvenliğini sağlamak için fazladan özen gerekir.
Yükleme kullanarak bir cihazdan bildirim hub'ı ile kaydolmak için örnek kod
Şu anda, bu yalnızca Notification Hubs REST API.
Ayrıca, yüklemenin güncelleştirilması 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'ı ile kaydolmaya örnek kod
Bu yöntemler, çağrıldıları cihaz için bir kayıt oluşturabilir veya güncelleştirebilirsiniz. Başka bir ifadeyle tanıtıcıyı veya etiketleri güncelleştirmek için kaydın tamamının üzerine yazmanız gerekir. Kayıtların geçici olduğunu unutmayın, bu nedenle her zaman belirli bir cihaza gereken geçerli etiketlerin yer alan güvenilir bir depoya sahip olması gerekir.
// 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
Arka uçtan kayıtları yönetmek için ek kod yazmanız gerekir. Cihazdan uygulama, uygulama her başlatıldığında (etiketler ve şablonlarla birlikte) güncelleştirilmiş PNS tanıtıcısı sağlamalı ve arka ucun bildirim hub'larında bu tanıtıcıyı güncelleştirmesi gerekir. Aşağıdaki resim bu tasarımı göstermektedir.

Arka uçtan kayıtları yönetmenin avantajları, cihaza karşılık gelen uygulama etkin değilken bile etiketleri kayıtlarla değiştirme ve kaydına etiket eklemeden önce istemci uygulamasının kimliğini doğrulama olanağını içerir.
Yükleme kullanarak arka uçtan bildirim hub'ı ile kaydolmaya örnek kod
İstemci cihazı, PNS tanıtıcısını ve ilgili yükleme özelliklerini daha önce olduğu gibi alır ve arka uçta kayıt ve yetkilendirme etiketleri gibi işlemleri gerçekleştirecek özel bir API'yi çağırabilir. Arka uç, arka uç işlemleri için Notification Hub SDK'sı'sı kullanılabilir.
Ayrıca, yüklemenin güncelleştirilması 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 "mpns":
installation.Platform = NotificationPlatform.Mpns;
break;
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 bir cihazdan bildirim hub'larına kaydolmak için örnek kod
Uygulama arka ucundan kayıtlarda 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ında eşzamanlılığı işlemeli. Service Bus yönetimi için iyimser eşzamanlılık denetimi sunar. HTTP düzeyinde bu, kayıt yönetimi işlemleri üzerinde ETag kullanımıyla uygulanır. Bu özellik, eşzamanlılık nedeniyle bir güncelleştirme reddedilirse özel durum veren Microsoft SDK'leri tarafından saydam bir şekilde kullanılır. Bu özel durumları işlemeden ve gerekirse güncelleştirmeyi yeniden denemek uygulama arka ucundan sorumludur.