Aracılığıyla paylaş


Uygulama Arka Ucunuzdan kaydolma

Önceki bölümlerde belirtildiği gibi, cihazların anında iletme bildirimleri almak için bir bildirim hub'ında bir veya daha fazla kayıt oluşturması gerekir. Bu kaydı tamamlamanın bir yolu, mobil cihazların PNS tanıtıcılarını ve etiketlerini belirtmek (veya güncelleştirmek) için doğrudan bildirim hub'ına başvurmasını sağlamaktır. Bu yaklaşımın bir dizi sınırlaması vardır ve bir cihaz kaydını yenilediğinde kendi uygulama arka ucuna başvurmanın önerildiği bazı senaryolar vardır. Arka uç daha sonra bildirim hub'ını çağırır.

Uygulama arka ucunuzdan ne zaman kaydolmanız gerekiyor?

Uygulama arka ucu aracılığıyla cihaz kayıtlarını yönlendirmenin önerildiği iki senaryo vardır.

Etiketlerin güvenliği sağlanmalıdır

Bir cihaz doğrudan bir bildirim hub'ına kaydolduğunda, istediği etiketi belirtebilir. Etiketler herhangi bir cihazın abone olabileceği genel ilgi alanı gruplarıysa (örneğin, spor takımlarıyla ilgili haber akışları) bu sorun olmaz. Ancak, bazı etiketler yalnızca bazı kullanıcılar için kullanılabilir olduğunda bu sorun olabilir.

Her kullanıcıyı yalnızca izin verilen etiketlere kaydetmek için, kayıt işlemlerini kullanıcı kimlik doğrulaması gerçekleştirebilen ve gerekli etiketler için kaydı yetkilendirebilen kendi uygulama arka ucunuz üzerinden yönlendirmeniz gerekir.

Bu senaryonun en yaygın örneği, kullanıcı kimliklerini temsil eden etiketleri kullanmaktır. Bu durumda, diğer kullanıcıların bildirimlerini alacakları için cihazların diğer kullanıcıları temsil eden etiketlere kaydolmasını engellemek istiyorsunuz.

Etiketler uygulamanızın arka ucu tarafından değiştirilir

Cihazdan kaydolmak kullanışlıdır ve anında iletme bildirimlerini ve ilgi alanı gruplarına zengin yönlendirmeyi hızlı bir şekilde ayarlamanıza olanak tanır. Ancak, diğer cihazlarda gerçekleşen olayların bir sonucu olarak etiketleri değiştirmek istiyorsanız cihazdan kaydolmak çok iyi çalışmaz.

İki senaryoyu göz önünde bulundurun: Alice'in telefonundaki etiketler Alice'in telefonunda gerçekleşen olayların bir sonucu olarak ayarlandıysa, uygulamanın bildirim hub'ında etiketleri güncelleştirmesi kolaydır. Öte yandan, diğer cihazlarda gerçekleşen olayların (örneğin, bir web sitesinde oturum açtığında Alice'in dizüstü bilgisayarı) etiketlerin değişmesi gerekiyorsa, bildirim hub'ında yapılan değişiklikleri yansıtmak için cihazın uygulamanın yeniden etkin olmasını beklemesi gerekir.

Önceki senaryoya belirli bir örnek, web deneyimi ve mobil uygulama içeren bir müzik uygulamasıdır. Bu durumda, belirli bir kullanıcı web sitesi aracılığıyla yeni bir bandı takip edebilir ve cihazın yeni bantla ilgili bildirimleri en kısa sürede almaya başlamasını isteyebilir. Diğer bir örnek de etiketlerin arka ucunuzun diğer bölümlerinden (örneğin CRM) gelmesidir. Bu durum kullanıcının durumunu Silver'dan Gold'a değiştirebilir. Bu değişiklik, tüm kullanıcıların kayıtlarında yeni bir etiketin ayarlanmasına neden olabilir.

Arka uçtan kaydetme

Bir cihazı kaydederken bildirim hub'ı farklı cihazları ayırt etmelidir. Bu, geçici ve benzersiz olmadığından yalnızca PNS tanıtıcılarına bakarak gerçekleştirilemez. Bu sorunu çözmek için Notification Hubs, PNS tanıtıcısını, etiketlerini veya şablonunu her güncelleştirdiğinde kendi kaydına başvurabilmek için her cihazın yerel olarak depolaması gereken uzun ömürlü kayıt kimlikleri oluşturur.

Aşağıdaki şekilde yerel bildirimler için kayıt akışı gösterilmektedir:

  1. Cihazda, yerel olarak hiçbir kayıt kimliği depolanmazsa,

    1. Kayıt kimliğini almak için uygulama arka ucuna çağrı yapın.

    2. Uygulama arka ucu, yeni bir kayıt kimliği oluşturmak için bildirim hub'larını çağırır ve ardından kimliği cihaza geri döndürür.

    3. Kayıt kimliğini cihaz yerel depolama alanında depolayın.

  2. Cihazda, kayıt kimliğini yerel depolama alanından alın:

    1. Kayıt kimliğini, PNS tanıtıcısını ve etiketleri sağlayarak uygulamayı arka ucu çağırın.

    2. Uygulama arka ucu, bildirim hub'ına karşılık gelen kaydı oluşturur veya güncelleştirir.

    3. Uygulama arka ucu 410 durum kodunu döndürürse yeni bir kayıt kimliği oluşturulmalıdır. Kayıt kimliğini yerel depolama alanından silin ve 1. adımdan yeniden başlatın.

Backend Registration

Şablon bildirimlerinin akışı benzerdir. Tek farklar şunlardır:

  1. Bir cihaz birden çok şablon kullanıyorsa, şablon başına bir kayıt kimliği depolaması gerekir.

  2. Kaydın TemplateName özelliğini kullanarak şablonları tanımlayabilirsiniz.

Aşağıdaki kod arka uç uç noktalarına bir örnektir.

public class RegisterController : ApiController
    {

        private NotificationHubClient hub;

        public RegisterController()
        {
            hub = NotificationHubClient.CreateClientFromConnectionString("Endpoint=sb://buildhub-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=DuWV4SQ08poV6HZly8O/KQNWv3YRTZlExJxu3pNCjGU=", "build2014_2");
        }
        
        public class DeviceRegistration
        {
            public string Platform { get; set; }
            public string Handle { get; set; }
            public string[] Tags { get; set; }
        }

        // POST api/register
        // This creates a registration id
        public async Task<string> Post()
        {
            return await hub.CreateRegistrationIdAsync();
        }

        // PUT api/register/5
        // This creates or updates a registration (with provided PNS handle) at the specified id
        public async void Put(string id, DeviceRegistration deviceUpdate)
        {
            // IMPORTANT: add logic to make sure that caller is allowed to register for the provided tags
            
            RegistrationDescription registration = null;
            switch (deviceUpdate.Platform)
            {
                case "mpns":
                    registration = new MpnsRegistrationDescription(deviceUpdate.Handle);
                    break;
                case "wns":
                    registration = new WindowsRegistrationDescription(deviceUpdate.Handle);
                    break;
                case "apns":
                    registration = new AppleRegistrationDescription(deviceUpdate.Handle);
                    break;
                case "gcm":
                    registration = new GcmRegistrationDescription(deviceUpdate.Handle);
                    break;
                default:
                    throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            registration.RegistrationId = id;
            registration.Tags = new HashSet<string>(deviceUpdate.Tags);

            try
            {
                await hub.CreateOrUpdateRegistrationAsync(registration);
            } catch (MessagingException e) {
                ReturnGoneIfHubResponseIsGone(e);
            }
        }

        // DELETE api/register/5
        public async void Delete(string id)
        {
            await hub.DeleteRegistrationAsync(id);
        }


        private static void ReturnGoneIfHubResponseIsGone(MessagingException e)
        {
            var webex = e.InnerException as WebException;
            if (webex.Status == WebExceptionStatus.ProtocolError)
            {
                var response = (HttpWebResponse)webex.Response;
                if (response.StatusCode == HttpStatusCode.Gone)
                    throw new HttpRequestException(HttpStatusCode.Gone.ToString());
            }
        }
    }

Yukarıdaki kodda, uç noktayı çağıran istemcinin istenen etiketlere kaydolma yetkisine sahip olduğundan emin olmak için mantığı eklemeniz gerektiğini unutmayın. Ayrıca, arka ucunuz etiketlerin kendisini (örneğin, bir userid etiketi) ekleyebilir.

Aşağıdaki kod örneği, bir Windows Mağazası uygulaması için kayıt yönteminin cihazdan önceki uç noktalarla nasıl uygulanacaklarını gösterir:

class RegisterClient
    {
        private string POST_URL = "{your back-end endpoints}";

        private class DeviceRegistration
        {
            public string Platform { get; set; }
            public string Handle { get; set; }
            public string[] Tags { get; set; }
        }

        public async Task RegisterAsync(string handle, IEnumerable<string> tags)
        {
            var regId = await RetrieveRegistrationIdOrRequestNewOneAsync();

            var deviceRegistration = new DeviceRegistration
            {
                Platform = "wns",
                Handle = handle,
                Tags = tags.ToArray<string>()
            };

            var statusCode = await UpdateRegistrationAsync(regId, deviceRegistration);

            if (statusCode == HttpStatusCode.Gone)
            {
                // regId is expired, deleting from local storage & recreating
                var settings = ApplicationData.Current.LocalSettings.Values;
                settings.Remove("__NHRegistrationId");
                regId = await RetrieveRegistrationIdOrRequestNewOneAsync();
                statusCode = await UpdateRegistrationAsync(regId, deviceRegistration);
            }

            if (statusCode != HttpStatusCode.Accepted)
            {
                // log or throw
            }
        }

        private async Task<HttpStatusCode> UpdateRegistrationAsync(string regId, DeviceRegistration deviceRegistration)
        {
            using (var httpClient = new HttpClient())
            {
                var putUri = POST_URL + "/" + regId;
                var response = await httpClient.PutAsJsonAsync<DeviceRegistration>(putUri, deviceRegistration);
                return response.StatusCode;
            }
        }

        private async Task<string> RetrieveRegistrationIdOrRequestNewOneAsync()
        {
            var settings = ApplicationData.Current.LocalSettings.Values;
            if (!settings.ContainsKey("__NHRegistrationId"))
            {
                using (var httpClient = new HttpClient())
                {
                    var response = await httpClient.PostAsync(POST_URL, new StringContent(""));
                    if (response.IsSuccessStatusCode)
                    {
                        string regId = await response.Content.ReadAsStringAsync();
                        regId = regId.Substring(1, regId.Length - 2);
                        settings.Add("__NHRegistrationId", regId);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
            }
            return (string)settings["__NHRegistrationId"];

        }
    }

Kayıt kimliklerini arka uç veritabanında depolama

Bazen, uygulamalar kayıt kimliklerini cihaz yerel depolama alanı yerine uygulama arka uçta tutmak ister. Bu durum genellikle uygulama arka ucu cihazları tanımlamanın bir yoluna (örneğin, bir installationId) ve cihaz bilgilerini arka uç depolama alanında depolamak için bir yönteme (örneğin, PNS tanıtıcılarının depolandığı özel bir gönderme çözümünden geçiş yaparken) sahip olduğunda gerçekleşir.

Arka uçtan etiketleri değiştirme

Arka uçtan etiketleri değiştirmek istiyorsanız, arka ucun değiştirilecek kayıtları tanımlaması için bir yolunuz olmalıdır. Bu genellikle bir etiket kullanılarak yapılır.

Örneğin, kullanıcının Web'den yeni bir sık kullanılan bant eklediği bir müzik uygulaması olduğunu ve bunun sonucunda arka ucun kullanıcının mobil kayıtlarına bir etiket eklediğini varsayalım. Bu durumda, uygulama kullanıcıyı tanımlamak için bir etiket kullanır ve ardından güncelleştirilecek kayıtları almak ve güncelleştirmek için bu etiketi kullanır.

Aşağıdaki kod örneği kayıtları alır ve bunlara yeni bir etiket ekler.

var registrations = await hub.GetRegistrationsByTagAsync("{userId}", 10);
            foreach (var reg in registrations)
            {
                reg.Tags.Add("{newBand}");
                await hub.UpdateRegistrationAsync(reg);
            }

Bu örnekte şablonları kullanıyorsanız etiketi tüm şablonlarınıza eklediğinizi varsayıyoruz.