Udostępnij za pośrednictwem


Samouczek: wysyłanie powiadomień wypychanych opartych na lokalizacji przy użyciu usługi Notification Hubs i danych przestrzennych Bing

Korzystając z tego samouczka, dowiesz się, jak dostarczać powiadomienia push oparte na lokalizacji przy użyciu usługi Azure Notification Hubs i danych przestrzennych usługi Bing.

W tym samouczku wykonasz następujące kroki:

  • Konfigurowanie źródła danych
  • Konfigurowanie aplikacji platformy uniwersalnej systemu Windows
  • Konfigurowanie zaplecza
  • Testowanie powiadomień push w aplikacji platformy uniwersalnej systemu Windows

Wymagania wstępne

Konfigurowanie źródła danych

  1. Zaloguj się do Centrum deweloperów Map Bing.

  2. Wybierz pozycję Źródła danych na górnym pasku nawigacyjnym, a następnie wybierz pozycję Zarządzaj źródłami danych.

    Zrzut ekranu przedstawiający Centrum deweloperów map Bing na stronie Zarządzanie źródłami danych z opcją Przekaż dane jako źródło danych na czerwono.

  3. Jeśli nie masz źródła danych, możesz je utworzyć za pomocą widocznego linku. Wybierz pozycję Upload data as a data source (Przekaż dane jako źródło danych). Możesz również użyć menu Data sources>Upload data (Źródła danych > Przekaż dane).

    Zrzut ekranu przedstawiający okno dialogowe Przekazywanie źródła danych.

  4. Utwórz plik NotificationHubsGeofence.pipe na dysku twardym z następującą zawartością: W tym samouczku użyjesz przykładowego pliku opartego na potoku, który ramki obszaru nabrzeża San Francisco:

    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))
    

    Plik potoku reprezentuje następującą jednostkę:

    Zrzut ekranu przedstawiający mapę nabrzeża San Francisco z czerwonym wielokątem przedstawiającym obszar molo.

  5. Na stronie Upload a data source (Przekazywanie źródła danych) wykonaj następujące czynności:

    1. Wybierz pozycję Pipe (Potok) w polu Data format (Format danych).

    2. Wyszukaj i wybierz plik NotificationHubGeofence.pipe utworzony w poprzednim kroku.

    3. Wybierz przycisk Upload (Przekaż).

      Uwaga

      Może zostać wyświetlony monit o określenie nowego klucza dla właściwości Klucz główny, który różni się od właściwości Klucz zapytania. Po prostu utwórz nowy klucz przy użyciu pulpitu nawigacyjnego i odśwież stronę przekazywania źródła danych.

  6. Po przekazaniu pliku danych opublikuj źródło danych. Wybierz pozycję Źródła danych —> zarządzaj źródłami danych, tak jak wcześniej.

  7. Wybierz źródło danych na liście, a następnie wybierz pozycję Publish (Publikuj) w kolumnie Actions (Akcje).

    Zrzut ekranu przedstawiający Centrum deweloperów mapy Bing na stronie Zarządzanie źródłami danych z wybraną kartą Dane zakodowane geograficznie i opcją Publikuj na czerwono.

  8. Otwórz kartę Published Data Sources (Opublikowane źródła danych) i upewnij się, że źródło danych jest widoczne na liście.

    Zrzut ekranu przedstawiający Centrum deweloperów mapy Bing na stronie Zarządzanie źródłami danych z wybraną kartą Opublikowane źródła danych.

  9. Zaznacz Edytuj. Od razu zobaczysz lokalizacje wprowadzone w danych.

    Zrzut ekranu przedstawiający stronę Edytowanie danych jednostki z mapą zachodnich stanów Zjednoczonych i kropką magenta nad nabrzeżem San Francisco.

    W tym momencie w portalu nie są wyświetlane granice utworzonego wirtualnego ogrodzenia — potrzebne jest jedynie potwierdzenie, że określona lokalizacja znajduje się w odpowiedniej okolicy.

  10. Teraz wszystkie wymagania dotyczące źródła danych zostały spełnione. Aby uzyskać szczegółowe informacje dotyczące adresu URL żądania dla wywołania interfejsu API, w Centrum deweloperów Map Bing wybierz pozycję Źródła danych i wybierz pozycję Informacje o źródle danych.

    Zrzut ekranu przedstawiający Centrum deweloperów mapy Bing na stronie informacje o źródle danych.

    Adres URL zapytania to punkt końcowy, względem którego możemy wykonywać zapytania, aby sprawdzić, czy urządzenie znajduje się obecnie w granicach lokalizacji, czy nie. Aby to sprawdzić, wykonujemy wywołanie GET dla adresu URL zapytania z dołączonymi następującymi parametrami:

    ?spatialFilter=intersects(%27POINT%20LONGITUDE%20LATITUDE)%27)&$format=json&key=QUERY_KEY
    

    Mapy Bing automatycznie wykonają obliczenia w celu sprawdzenia, czy urządzenie znajduje się w wirtualnym ogrodzeniu. Po wykonaniu żądania przy użyciu przeglądarki (lub programu cURL) uzyskasz standardową odpowiedź w formacie JSON:

    Zrzut ekranu przedstawiający standardową odpowiedź JSON.

    Ta odpowiedź jest wysyłana tylko wtedy, gdy punkt rzeczywiście znajduje się w wyznaczonych granicach. W przeciwnym razie otrzymasz pusty zasobnik results:

    Zrzut ekranu przedstawiający odpowiedź JSON z pustym zasobnikiem wyników.

Konfigurowanie aplikacji platformy uniwersalnej systemu Windows

  1. W programie Visual Studio utwórz nowy projekt typu Pusta aplikacja (uniwersalna aplikacja systemu Windows).

    Zrzut ekranu przedstawiający okno dialogowe Nowy projekt programu Visual Studio z wyróżnioną opcją Pusta aplikacja (uniwersalny program Windows Visual C#).

    Po zakończeniu tworzenia projektu uzyskasz dostęp do aplikacji. Teraz skonfigurujmy wszystko dla infrastruktury ogrodzenia geograficznego. Ponieważ w tym celu użyjemy usług Bing, możemy skorzystać z publicznego punktu końcowego interfejsu API REST, umożliwiającego wykonywanie zapytań dotyczących określonego zakresu lokalizacji:

    http://spatial.virtualearth.net/REST/v1/data/
    

    Aby przygotować go do pracy, określ następujące parametry:

    • Identyfikator źródła danych i Nazwa źródła danych — w interfejsie API Map Bing źródła danych zawierają różne metadane w zasobnikach, takie jak lokalizacje i godziny pracy.

    • Nazwa jednostki — jednostka, która ma być używana jako punkt odniesienia dla powiadomienia.

    • Klucz interfejsu API Map Bing — klucz uzyskany wcześniej podczas tworzenia konta Centrum deweloperów Bing.

      Po przygotowaniu źródła danych możemy rozpocząć pracę nad aplikacją platformy uniwersalnej systemu Windows.

  2. Włącz usługi lokalizacji dla aplikacji. Otwórz plik Package.appxmanifest w Eksploratorze rozwiązań.

    Zrzut ekranu przedstawiający Eksplorator rozwiązań z wyróżnionym plikiem Package.appxmanifest.

  3. Na karcie właściwości pakietu, która została otwarta, wybierz pozycję Możliwości, a następnie pozycję Lokalizacja.

    Zrzut ekranu przedstawiający okno dialogowe Właściwości pakietu z wyróżnioną kartą Możliwości z wyróżnioną opcją Lokalizacja.

  4. W rozwiązaniu utwórz nowy folder o nazwie Core i dodaj do niego nowy plik o nazwie LocationHelper.cs:

    Zrzut ekranu przedstawiający Eksplorator rozwiązań z wyróżnionym nowym folderem Core.

    Klasa LocationHelper zawiera kod umożliwiający uzyskiwanie lokalizacji użytkownika przy użyciu interfejsu API systemu:

    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;
                        }
                }
            }
    
        }
    }
    

    Aby dowiedzieć się więcej na temat uzyskiwania lokalizacji użytkownika w aplikacjach platformy UWP, zobacz Pobieranie lokalizacji użytkownika.

  5. Aby sprawdzić, czy uzyskiwanie lokalizacji rzeczywiście działa, otwórz stronę kodu strony głównej (MainPage.xaml.cs). Utwórz nowy program obsługi zdarzeń dla zdarzenia Loaded w konstruktorze MainPage.

    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }
    

    Implementacja programu obsługi zdarzeń wygląda następująco:

    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));
        }
    }
    
  6. Uruchom aplikację i zezwól jej na dostęp do Twojej lokalizacji.

    Zrzut ekranu przedstawiający okno dialogowe Zezwalaj usłudze Notification Hubs na dostęp do ogrodzenia geograficznego lokalizacji.

  7. Po uruchomieniu aplikacji współrzędne powinny być widoczne w oknie Dane wyjściowe:

    Zrzut ekranu przedstawiający okno danych wyjściowych z wyświetlonymi współrzędnymi.

    Teraz wiesz, że pozyskiwanie lokalizacji działa, możesz usunąć procedurę obsługi zdarzeń załadowanych, jeśli chcesz, ponieważ nie będzie już jej używać.

  8. Następnym krokiem jest przechwytywanie zmian lokalizacji. W klasie LocationHelper dodaj program obsługi zdarzeń dla zdarzenia PositionChanged:

    geolocator.PositionChanged += Geolocator_PositionChanged;
    

    Implementacja umożliwia wyświetlenie współrzędnych lokalizacji w oknie Dane wyjściowe:

    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));
        });
    }
    

Konfigurowanie zaplecza

  1. Pobierz przykład zaplecza programu .NET z usługi GitHub.

  2. Po zakończeniu pobierania otwórz folder NotifyUsers, a następnie otwórz plik NotifyUsers.sln w programie Visual Studio.

  3. Ustaw projekt AppBackend jako Projekt startowy, a następnie uruchom go.

    Zrzut ekranu przedstawiający menu po kliknięciu prawym przyciskiem myszy rozwiązania z wyróżnioną opcją Ustaw jako projekt startowy.

    Projekt jest już skonfigurowany do wysyłania powiadomień push do urządzeń docelowych, dlatego musimy wykonać tylko dwie czynności — podać odpowiednie parametry połączenia dla centrum powiadomień i dodać identyfikację granic, aby powiadomienie było wysyłane tylko wtedy, gdy użytkownik znajduje się w wirtualnym ogrodzeniu.

  4. Aby skonfigurować parametry połączenia, w folderze Models otwórz plik Notifications.cs. Funkcja NotificationHubClient.CreateClientFromConnectionString powinna zawierać informacje o centrum powiadomień uzyskane w witrynie Azure Portal (na stronie Zasady dostępu w obszarze Ustawienia). Zapisz zaktualizowany plik konfiguracji.

  5. Utwórz model dla wyniku interfejsu API Map Bing. W tym celu najłatwiej otworzyć folder Models, a następnie wybrać polecenie Dodaj>Klasa. Nazwij go GeofenceBoundary.cs. Następnie skopiuj kod JSON z odpowiedzi interfejsu API uzyskanej w pierwszej sekcji. W programie Visual Studio wybierz pozycję Edytuj>Wklej specjalnie>Wklej dane JSON jako klasy.

    W ten sposób upewniamy się, że obiekt zostanie zdeserializowany dokładnie w zamierzony sposób. Wynikowy zestaw klas powinien wyglądać następująco:

    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; }
        }
    }
    
  6. Następnie otwórz plik Controllers>NotificationsController.cs. Zaktualizuj wywołanie metody POST, aby uwzględnić docelową długość i szerokość geograficzną. W tym celu po prostu dodaj dwa ciągi do sygnatury funkcji — latitude i longitude.

    public async Task<HttpResponseMessage> Post(string pns, [FromBody]string message, string to_tag, string latitude, string longitude)
    
  7. Utwórz nową klasę w projekcie o nazwie ApiHelper.cs. Zostanie ona użyta do połączenia z usługą Bing w celu sprawdzenia puntów przecięcia granic. Zaimplementuj funkcję IsPointWithinBounds zgodnie z poniższym kodem:

    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;
            }
        }
    }
    

    Ważne

    Zastąp punkt końcowy interfejsu API adresem URL zapytania uzyskanym wcześniej z Centrum deweloperów Bing (to samo dotyczy klucza interfejsu API).

    Jeśli uzyskano wyniki zapytania, oznacza to, że określony punkt znajduje się w granicach wirtualnego ogrodzenia, dlatego funkcja zwraca wartość true. Jeśli nie ma wyników, usługa Bing informuje nas, że punkt znajduje się poza obszarem wyszukiwania, dlatego funkcja zwraca wartość false.

  8. W pliku NotificationsController.cs utwórz operację sprawdzania przed instrukcją switch:

    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;
        }
    }
    

Testowanie powiadomień push w aplikacji platformy uniwersalnej systemu Windows

  1. Teraz powinno być możliwe przetestowanie powiadomień w aplikacji platformy uniwersalnej systemu Windows. W klasie LocationHelper utwórz nową funkcję o nazwie 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);
            }
        }
    }
    

    Uwaga

    Ustaw zmienną POST_URL na wartość lokalizacji wdrożonej aplikacji internetowej. Na razie możesz uruchomić go lokalnie, ale podczas wdrażania wersji publicznej należy go hostować za pomocą zewnętrznego dostawcy.

  2. Zarejestruj aplikację platformy uniwersalnej systemu Windows dla usługi powiadomień push. W programie Visual Studio wybierz pozycję Projekt>Magazyn>Skojarz aplikację z magazynem.

    Zrzut ekranu przedstawiający menu rozwiązania prawym przyciskiem myszy z wyróżnionymi opcjami Sklep i Skojarz aplikację ze sklepem.

  3. Po zalogowaniu się do konta dewelopera wybierz istniejącą aplikację lub utwórz nową i skojarz z nią pakiet.

  4. Przejdź do Centrum deweloperów i otwórz utworzoną aplikację. Wybierz pozycję Usługi>Powiadomienia wypychane>Witryna usług Live.

  5. W witrynie zanotuj Klucz tajny aplikacji i Identyfikator SID pakietu. Obie wartości będą potrzebne w witrynie Azure Portal. Otwórz centrum powiadomień, wybierz pozycję Ustawienia>Usługi powiadomień>Windows (WNS) i wprowadź informacje w wymaganych polach.

    Zrzut ekranu przedstawiający stronę Ustawienia z wyróżnionymi opcjami usług powiadomień i systemu Windows (WNS) oraz wypełnionymi wartościami Identyfikator SID pakietu i Klucz zabezpieczeń.

  6. Wybierz pozycję Zapisz.

  7. Otwórz obszar Odwołania w Eksploratorze rozwiązań i wybierz pozycję Zarządzaj pakietami NuGet. Dodaj odwołanie do biblioteki zarządzanej usługi Microsoft Azure Service Bus. Wyszukaj pakiet WindowsAzure.Messaging.Managed i dodaj go do projektu.

    Zrzut ekranu przedstawiający okno dialogowe Zarządzanie pakietami Nuget z wyróżnionym pakietem WindowsAzure.Messaging.Managed.

  8. W celach testowych możemy ponownie utworzyć program obsługi zdarzeń MainPage_Loaded i dodać do niego następujący fragment kodu:

    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.");
    }
    

    Powyższy kod rejestruje aplikację w centrum powiadomień. Gotowe!

  9. W elemencie LocationHelper w programie obsługi Geolocator_PositionChanged możesz dodać fragment kodu, który będzie wymuszać umieszczanie lokalizacji w wirtualnym ogrodzeniu:

    await LocationHelper.SendLocationToBackend("wns", "TEST_USER", "TEST", "37.7746", "-122.3858");
    
  10. Ponieważ nie są używane rzeczywiste współrzędne (które mogą obecnie znajdować się poza granicami), lecz wstępnie zdefiniowane wartości testowe, po aktualizacji zostanie wyświetlone powiadomienie:

    Zrzut ekranu przedstawiający pulpit systemu Windows z komunikatem TEST.

Następne kroki

Jest kilka kroków, których wykonanie może być konieczne, aby mieć pewność, że rozwiązanie jest gotowe do zastosowania w środowisku produkcyjnym.

  1. Najpierw musisz upewnić się, że wirtualne ogrodzenia są dynamiczne. To wymaga dodatkowej pracy z interfejsem API Bing w celu umożliwienia przekazywania nowych granic w ramach istniejącego źródła danych. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją interfejsu API usług Bing Spatial Data Services.
  2. Upewniając się, że powiadomienia są dostarczane do odpowiednich uczestników, warto adresować je przy użyciu tagów.

W tym samouczku opisano scenariusz, w którym może występować wiele różnych platform docelowych, dlatego nie ograniczono wirtualnego grodzenia do możliwości specyficznych dla określonego systemu. Jednak platforma uniwersalna systemu Windows oferuje wbudowane możliwości wykrywania wirtualnych ogrodzeń.