Öğretici: Notification Hubs ve Bing Spatial Data ile konum tabanlı anında iletme bildirimleri gönderme
Bu öğreticide, Azure Notification Hubs ve Bing Uzamsal Veri ile konum temelli anında iletme bildirimleri göndermeyi öğreneceksiniz.
Bu öğreticide, aşağıdaki adımları gerçekleştireceksiniz:
- Veri kaynağını ayarlama
- UWP uygulamasını ayarlama
- Arka ucu ayarlama
- Evrensel Windows Platformu (UWP) uygulamasında anında iletme bildirimlerini test etme
Önkoşullar
- Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir Azure hesabı oluşturun.
- Visual Studio 2015 Güncelleştirme 1 veya üzeri (Community Edition).
- Azure SDK'nın en son sürümü.
- Bing Haritalar Geliştirme Merkezi hesabı (ücretsiz bir tane oluşturabilir ve Microsoft hesabınızla ilişkilendirebilirsiniz).
Veri kaynağını ayarlama
Bing Haritalar Geliştirme Merkezi'nde oturum açın.
Üst gezinti çubuğunda Veri kaynakları'nı ve Veri Kaynaklarını Yönet'i seçin.
Bir veri kaynağınız yoksa, veri kaynağı oluşturma bağlantısını görürsünüz. Veri kaynağı olarak yükle’yi seçin. Ayrıca Veri kaynakları>Veri yükle menüsünü kullanabilirsiniz.
Sabit sürücünüzde aşağıdaki içeriğe sahip bir dosya
NotificationHubsGeofence.pipe
oluşturun: Bu öğreticide, San Francisco sahilindeki bir alanı çerçeveleyen örnek bir boru tabanlı dosya kullanırsınız:Bing Spatial Data Services, 1.0, TestBoundaries EntityID(Edm.String,primaryKey)|Name(Edm.String)|Longitude(Edm.Double)|Latitude(Edm.Double)|Boundary(Edm.Geography) 1|SanFranciscoPier|||POLYGON ((-122.389825 37.776598,-122.389438 37.773087,-122.381885 37.771849,-122.382186 37.777022,-122.389825 37.776598))
Kanal dosyası şu varlığı temsil eder:
Veri kaynağını karşıya yükleyin sayfasında aşağıdaki eylemleri yapın:
Veri biçimi için kanal’ı seçin.
Önceki adımda oluşturduğunuz dosyaya
NotificationHubGeofence.pipe
göz atın ve dosyayı seçin.Karşıya Yükle düğmesini seçin.
Not
Sorgu Anahtarı'ndan farklı olan Ana Anahtar için yeni bir anahtar belirtmeniz istenebilir. Pano aracılığıyla yeni bir anahtar oluşturun ve veri kaynağını karşıya yükleme sayfasını yenileyin.
Veri dosyasını karşıya yükledikten sonra, veri kaynağını yayımladığınızdan emin olmanız gerekir. Veri kaynakları ->Daha önce yaptığınız gibi Veri Kaynaklarını Yönet'i seçin.
Listeden veri kaynağınızı seçin ve Eylemler sütunundaki Yayımla seçeneğini belirleyin.
Yayımlanmış Veri Kaynakları sekmesine geçin ve veri kaynağınızı listede gördüğünüzü onaylayın.
Düzenle'yi seçin. Verilerde sunulan konumları (bir bakışta) göreceksiniz.
Bu noktada portal, oluşturduğunuz bölge sınırına ait sınırları göstermez. İhtiyacınız olan tek şey, belirtilen konumun doğru yakın çevrede olduğunun onaylanmasıdır.
Şimdi veri kaynağı için tüm gereksinimlere sahipsiniz. API çağrısının istek URL'si hakkındaki ayrıntıları almak için, Bing Haritalar Geliştirme Merkezi'nde Veri kaynakları'nı ve Veri Kaynağı Bilgisi'ni seçin.
Sorgu URL’si, cihazın şu anda bir konum sınırları içinde olup olmadığını denetlemek için sorgular çalıştırabileceğiniz uç noktadır. Bu denetimi gerçekleştirmek için, aşağıdaki parametrelerin eklendiği sorgu URL'sinde bir GET çağrısı yapın:
?spatialFilter=intersects(%27POINT%20LONGITUDE%20LATITUDE)%27)&$format=json&key=QUERY_KEY
Bing Haritalar, cihazın bölge sınırı içinde olup olmadığını görmek için hesaplamaları otomatik olarak gerçekleştirir. Bir tarayıcı (veya cURL) aracılığıyla isteği yürüttükten sonra, standart bir JSON yanıtı alırsınız:
Bu yanıt yalnızca, söz konusu nokta belirlenen sınırlar içinde olduğunda gönderilir. Aksi takdirde boş bir sonuçlar demeti alırsınız:
UWP uygulamasını ayarlama
Visual Studio'da Boş Uygulama (Evrensel Windows) türü yeni bir proje başlatın.
Proje oluşturmayı tamamladıktan sonra, uygulamanın kendisi için donanımınız olması gerekir. Şimdi coğrafi eskrim altyapısı için her şeyi ayarlayalım. Bu çözüm için Bing hizmetlerini kullanacağınızdan, belirli konum çerçevelerini sorgulamanıza izin veren bir ortak REST API uç noktası vardır:
http://spatial.virtualearth.net/REST/v1/data/
Çalıştırmak için aşağıdaki parametreleri belirtin:
Veri Kaynağı Kimliği ve Veri Kaynağı Adı: Veri kaynakları, Bing Haritalar API'sinde konumlar ve çalışma saatleri gibi kümelenmiş çeşitli meta veriler içerir.
Varlık Adı: Bildirim için bir başvuru noktası olarak kullanmak istediğiniz varlık.
Bing Haritalar API'si Anahtarı: Daha önce Bing Geliştirme Merkezi hesabı oluşturduğunuzda edindiğiniz anahtardır.
Veri kaynağınız hazır olduktan sonra UWP uygulaması üzerinde çalışmaya başlayabilirsiniz.
Uygulamanız için konum hizmetlerini etkinleştirin. Çözüm Gezgini'nde
Package.appxmanifest
dosyasını açın.Açtığınız paket özellikleri sekmesinde Özellikler sekmesine geçip Konum'u seçin.
Çözümünüz içinde
Core
adlı yeni bir klasör oluşturun ve içineLocationHelper.cs
adlı yeni bir dosya ekleyin:LocationHelper
sınıfı, sistem API'si aracılığıyla kullanıcı konumunu almak için kod içerir:using System; using System.Threading.Tasks; using Windows.Devices.Geolocation; namespace NotificationHubs.Geofence.Core { public class LocationHelper { private static readonly uint AppDesiredAccuracyInMeters = 10; public async static Task<Geoposition> GetCurrentLocation() { var accessStatus = await Geolocator.RequestAccessAsync(); switch (accessStatus) { case GeolocationAccessStatus.Allowed: { Geolocator geolocator = new Geolocator { DesiredAccuracyInMeters = AppDesiredAccuracyInMeters }; return await geolocator.GetGeopositionAsync(); } default: { return null; } } } } }
UWP uygulamalarında kullanıcının konumunu alma hakkında daha fazla bilgi edinmek için bkz . Kullanıcının konumunu alma.
Konum almanın çalışıp çalışmadığını denetlemek için ana sayfanızın kod tarafını açın (
MainPage.xaml.cs
).MainPage
oluşturucusundaLoaded
olayı için yeni bir olay işleyicisi oluşturun.public MainPage() { this.InitializeComponent(); this.Loaded += MainPage_Loaded; }
Olay işleyicisinin uygulaması aşağıdaki gibidir:
private async void MainPage_Loaded(object sender, RoutedEventArgs e) { var location = await LocationHelper.GetCurrentLocation(); if (location != null) { Debug.WriteLine(string.Concat(location.Coordinate.Longitude, " ", location.Coordinate.Latitude)); } }
Uygulamayı çalıştırın ve konumunuza erişmesine izin verin.
Uygulama başlatıldıktan sonra, Çıkış penceresinde koordinatları görebilmeniz gerekir:
Artık konum alma işleminin çalıştığını biliyorsunuz, artık kullanmayacağınız için isterseniz Yüklü olay işleyicisini kaldırabilirsiniz.
Sonraki adım konum değişikliklerini yakalamaktır.
LocationHelper
sınıfındaPositionChanged
için olay işleyicisini ekleyin:geolocator.PositionChanged += Geolocator_PositionChanged;
Uygulama, konum koordinatlarını Çıkış penceresinde gösterir:
private static async void Geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args) { await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Debug.WriteLine(string.Concat(args.Position.Coordinate.Longitude, " ", args.Position.Coordinate.Latitude)); }); }
Arka ucu ayarlama
GitHub'dan .NET Arka Ucu Örneği'ni indirin.
İndirme işlemi tamamlandıktan sonra
NotifyUsers
klasörünü ve ardından Visual Studio’daNotifyUsers.sln
dosyasını açın.AppBackend
projesini Başlangıç Projesi olarak ayarlayın ve başlatın.Proje hedef cihazlara anında iletme bildirimleri göndermek için zaten yapılandırıldı. Bu nedenle yapmanız gereken yalnızca iki şey var: Bildirim hub'ı için doğru bağlantı dizesini belirtin ve sadece kullanıcı bölge sınırı içinde olduğunda bildirim göndermek için sınır kimliği ekleyin.
Bağlantı dizesini yapılandırmak için
Models
klasöründeNotifications.cs
öğesini açın.NotificationHubClient.CreateClientFromConnectionString
işlevi, Azure portalından alabileceğiniz bildirim hub'ınız hakkındaki bilgileri içermelidir (Ayarlar'da, Erişim İlkeleri sayfasının içine bakın). Güncelleştirilen yapılandırma dosyasını kaydedin.Bing Haritalar API'si sonucu için bir model oluşturun. Bunu yapmanın en kolay yolu
Models
klasörünü açıp Ekle>Sınıf'ı seçmektir.GeofenceBoundary.cs
olarak adlandırın. Bunu yaptıktan sonra, birinci bölümde elde ettiğiniz API yanıtından JSON dosyasını kopyalayın. Visual Studio'da Düzenle>Özel Yapıştır>JSON’ı Sınıflar Olarak Yapıştır’ı kullanın.Böylece, nesnenin istendiği gibi tamamen seri durumdan çıkarılacağından emin olursunuz. Elde edilen sınıf kümeniz aşağıdaki sınıfa benzemelidir:
namespace AppBackend.Models { public class Rootobject { public D d { get; set; } } public class D { public string __copyright { get; set; } public Result[] results { get; set; } } public class Result { public __Metadata __metadata { get; set; } public string EntityID { get; set; } public string Name { get; set; } public float Longitude { get; set; } public float Latitude { get; set; } public string Boundary { get; set; } public string Confidence { get; set; } public string Locality { get; set; } public string AddressLine { get; set; } public string AdminDistrict { get; set; } public string CountryRegion { get; set; } public string PostalCode { get; set; } } public class __Metadata { public string uri { get; set; } } }
Ardından
Controllers
>NotificationsController.cs
öğesini açın. Hedef enlemini ve boylamını hesaba katmak için Post çağrısını güncelleştirin. Bunu yapmak için işlev imzasına iki dize ekleyin:latitude
velongitude
.public async Task<HttpResponseMessage> Post(string pns, [FromBody]string message, string to_tag, string latitude, string longitude)
Proje içinde
ApiHelper.cs
adlı yeni bir sınıf oluşturun. Bunu, nokta sınır kesişimlerini denetlemek amacıyla Bing'e bağlanmak için kullanacaksınız. Aşağıdaki kodda gösterildiği gibi birIsPointWithinBounds
işlevi uygulayın:public class ApiHelper { public static readonly string ApiEndpoint = "{YOUR_QUERY_ENDPOINT}?spatialFilter=intersects(%27POINT%20({0}%20{1})%27)&$format=json&key={2}"; public static readonly string ApiKey = "{YOUR_API_KEY}"; public static bool IsPointWithinBounds(string longitude,string latitude) { var json = new WebClient().DownloadString(string.Format(ApiEndpoint, longitude, latitude, ApiKey)); var result = JsonConvert.DeserializeObject<Rootobject>(json); if (result.d.results != null && result.d.results.Count() > 0) { return true; } else { return false; } } }
Önemli
API uç noktasını, daha önce Bing Geliştirme Merkezi'nden edindiğiniz sorgu URL'si ile değiştirdiğinizden emin olun (aynısı API anahtarı için de geçerlidir).
Sorgunun sonuçları getirmesi belirtilen noktanın bölge sınırının içinde olduğu anlamına gelir, bu durumda işlev
true
döndürür. Sonuç yoksa Bing, noktanın arama çerçevesi dışında olduğunu belirtiyor demektir. Bu durumda işlevfalse
döndürür.NotificationsController.cs
içinde, switch deyiminden hemen önce bir denetim oluşturun:if (ApiHelper.IsPointWithinBounds(longitude, latitude)) { switch (pns.ToLower()) { case "wns": //// Windows 8.1 / Windows Phone 8.1 var toast = @"<toast><visual><binding template=""ToastText01""><text id=""1"">" + "From " + user + ": " + message + "</text></binding></visual></toast>"; outcome = await Notifications.Instance.Hub.SendWindowsNativeNotificationAsync(toast, userTag); // Windows 10 specific Action Center support toast = @"<toast><visual><binding template=""ToastGeneric""><text id=""1"">" + "From " + user + ": " + message + "</text></binding></visual></toast>"; outcome = await Notifications.Instance.Hub.SendWindowsNativeNotificationAsync(toast, userTag); break; } }
UWP uygulamasında anında iletme bildirimlerini test etme
UWP uygulamasında artık bildirimleri test edebilmeniz gerekir.
LocationHelper
sınıfı içinde yeni bir işlev oluşturun (SendLocationToBackend
):public static async Task SendLocationToBackend(string pns, string userTag, string message, string latitude, string longitude) { var POST_URL = "http://localhost:8741/api/notifications?pns=" + pns + "&to_tag=" + userTag + "&latitude=" + latitude + "&longitude=" + longitude; using (var httpClient = new HttpClient()) { try { await httpClient.PostAsync(POST_URL, new StringContent("\"" + message + "\"", System.Text.Encoding.UTF8, "application/json")); } catch (Exception ex) { Debug.WriteLine(ex.Message); } } }
Not
POST_URL
değerini dağıtılmış web uygulamanızın konumuna ayarlayın. Şimdilik yerel olarak çalıştırabilirsiniz, ancak genel sürümü dağıtmaya çalışırken bunu bir dış sağlayıcıyla barındırmanız gerekir.Anında iletme bildirimleri için UWP uygulamanızı kaydedin. Visual Studio'da, Proje>Mağaza>Uygulamayı mağaza ile ilişkilendir'i seçin.
Geliştirici hesabınızda oturum açtıktan sonra, mevcut bir uygulamayı seçtiğinizden emin olun veya yeni bir tane oluşturun ve paketi bununla ilişkilendirin.
Geliştirme Merkezi'ne gidin ve oluşturduğunuz uygulamayı açın. Hizmetler>Anında İletme Bildirimleri>Live Services sitesi'ni seçin.
Sitede, Uygulama Anahtarı ve Paket SID'sini not edin. Azure portalında her ikisine de ihtiyacınız vardır: Bildirim hub'ınızı açın, Ayarlar>Bildirim Hizmetleri>Windows (WNS) seçeneğini belirleyin ve gerekli alanlara bu bilgileri girin.
Kaydet'i seçin.
Çözüm Gezgini'nde Başvurular'ı açın ve NuGet Paketlerini Yönet'i seçin. Microsoft Azure Service Bus yönetilen kitaplık'a bir başvuru ekleyin.
WindowsAzure.Messaging.Managed
için arama yapın ve projenize ekleyin.Test amacıyla,
MainPage_Loaded
olay işleyicisini yeniden oluşturun ve içine şu kod parçacığını ekleyin:var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); var hub = new NotificationHub("HUB_NAME", "HUB_LISTEN_CONNECTION_STRING"); var result = await hub.RegisterNativeAsync(channel.Uri); // Displays the registration ID so you know it was successful if (result.RegistrationId != null) { Debug.WriteLine("Reg successful."); }
Kod, uygulamayı bildirim hub'ına kaydeder. Artık başlamaya hazırsınız!
LocationHelper
sınıfındakiGeolocator_PositionChanged
işleyicisi içine, konumu bölge sınırının içine zorla yerleştirecek bir test kodu parçası ekleyebilirsiniz:await LocationHelper.SendLocationToBackend("wns", "TEST_USER", "TEST", "37.7746", "-122.3858");
Gerçek koordinatları geçirmediğiniz (şu anda sınırlar içinde olmayabilirler) ve önceden tanımlanmış test değerleri kullandığınız için güncelleştirme üzerinde bir bildirim belirdiğini görürsünüz:
Sonraki adımlar
Çözümü üretime hazır hale getirmek için izlemeniz gerekebilecek birkaç adım vardır.
- İlk olarak, bölge sınırlarının dinamik olduğundan emin olmanız gerekir. Bunun yapılması, yeni sınırları mevcut veri kaynağı içinde karşıya yükleyebilmek için Bing API'si ile bazı ek çalışmalar yapmayı gerektirir. Daha fazla bilgi için bkz. Bing Uzamsal Veri Hizmetleri API’si belgeleri.
- İkinci olarak, teslimin doğru katılımcılara yapıldığından emin olmaya çalıştığınızdan, onları etiketleme yoluyla hedeflemek isteyebilirsiniz.
Bu öğreticide gösterilen çözümde, çok çeşitli hedef platformlara sahip olabileceğiniz bir senaryo açıklanmaktadır. Bu nedenle, bölge sınırlamasını sisteme özgü özelliklerle sınırlamaz. Bununla birlikte, Evrensel Windows Platformu bölge sınırlarını hemen algılayan özellikler sunar.