Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Översikt
Med stöd för push-meddelanden i Microsoft Azure kan du komma åt en lätthanterad och utskalad push-infrastruktur med flera plattformar, vilket avsevärt förenklar implementeringen av push-meddelanden för både konsument- och företagsprogram för mobila plattformar.
På grund av regel- eller säkerhetsbegränsningar kanske ett program ibland vill inkludera något i meddelandet som inte kan överföras via standardinfrastrukturen för push-meddelanden. I den här självstudien beskrivs hur du uppnår samma upplevelse genom att skicka känslig information via en säker, autentiserad anslutning mellan klientenheten och appens serverdel.
På en hög nivå är flödet följande:
- Appens serverdel: - Lagrar säker nyttolast i back-end-databasen.
- Skickar ID:t för det här meddelandet till enheten (ingen säker information skickas).
 
- Appen på enheten när du tar emot meddelandet: - Enheten kontaktar serverdelen och begär den säkra nyttolasten.
- Appen kan visa nyttolasten som ett meddelande på enheten.
 
Observera att i föregående flöde (och i den här självstudien) förutsätter vi att enheten lagrar en autentiseringstoken i lokal lagring efter att användaren har loggat in. Detta garanterar en sömlös upplevelse eftersom enheten kan hämta meddelandets säkra nyttolast med den här token. Om ditt program inte lagrar autentiseringstoken på enheten, eller om dessa token kan upphöra att gälla, bör enhetsappen, när den får meddelandet, visa ett allmänt meddelande som uppmanar användaren att starta appen. Appen autentiserar sedan användaren och visar aviseringsnyttolasten.
Den här handledningen om säker push-tjänst visar hur du skickar ett push-meddelande på ett säkert sätt. Självstudien bygger på självstudien Meddela användare , så du bör slutföra stegen i den självstudien först.
Anmärkning
Den här självstudien förutsätter att du har skapat och konfigurerat din meddelandehubb enligt beskrivningen i Skicka push-meddelanden till iOS-appar med Azure Notification Hubs.
WebAPI-projekt
- I Visual Studio öppnar du det AppBackend-projekt som du skapade i självstudien Meddela användare . 
- I Notifications.cs ersätter du hela klassen Meddelanden med följande kod. Ersätt platshållarna med anslutningssträngen (med fullständig åtkomst) för meddelandehubben och hubbens namn. Du kan hämta dessa värden från Azure-portalen. Den här modulen representerar nu de olika säkra meddelanden som ska skickas. I en fullständig implementering lagras meddelandena i en databas. för enkelhetens skull, i det här fallet lagrar vi dem i minnet. - public class Notification { public int Id { get; set; } public string Payload { get; set; } public bool Read { get; set; } } public class Notifications { public static Notifications Instance = new Notifications(); private List<Notification> notifications = new List<Notification>(); public NotificationHubClient Hub { get; set; } private Notifications() { Hub = NotificationHubClient.CreateClientFromConnectionString("{conn string with full access}", "{hub name}"); } public Notification CreateNotification(string payload) { var notification = new Notification() { Id = notifications.Count, Payload = payload, Read = false }; notifications.Add(notification); return notification; } public Notification ReadNotification(int id) { return notifications.ElementAt(id); } }
- I NotificationsController.cs ersätter du koden i klassdefinitionen NotificationsController med följande kod. Den här komponenten implementerar ett sätt för enheten att hämta meddelandet på ett säkert sätt och ger även ett sätt (i den här självstudiekursen) att utlösa en säker push-överföring till dina enheter. Observera att när vi skickar meddelandet till meddelandehubben skickar vi bara ett rådatameddelande med ID:t för meddelandet (och inget faktiskt meddelande): - public NotificationsController() { Notifications.Instance.CreateNotification("This is a secure notification!"); } // GET api/notifications/id public Notification Get(int id) { return Notifications.Instance.ReadNotification(id); } public async Task<HttpResponseMessage> Post() { var secureNotificationInTheBackend = Notifications.Instance.CreateNotification("Secure confirmation."); var usernameTag = "username:" + HttpContext.Current.User.Identity.Name; // windows var rawNotificationToBeSent = new Microsoft.Azure.NotificationHubs.WindowsNotification(secureNotificationInTheBackend.Id.ToString(), new Dictionary<string, string> { {"X-WNS-Type", "wns/raw"} }); await Notifications.Instance.Hub.SendNotificationAsync(rawNotificationToBeSent, usernameTag); // apns await Notifications.Instance.Hub.SendAppleNativeNotificationAsync("{\"aps\": {\"content-available\": 1}, \"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}", usernameTag); // gcm await Notifications.Instance.Hub.SendGcmNativeNotificationAsync("{\"data\": {\"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}}", usernameTag); return Request.CreateResponse(HttpStatusCode.OK); }
Observera att metoden Post nu inte skickar ett popup-meddelande. Den skickar ett rådatameddelande som endast innehåller meddelande-ID:t och inte något känsligt innehåll. Se också till att kommentera sändningsåtgärden för de plattformar som du inte har konfigurerat autentiseringsuppgifter för på meddelandehubben, eftersom de resulterar i fel.
- Nu ska vi distribuera om den här appen till en Azure-webbplats för att göra den tillgänglig från alla enheter. Högerklicka på AppBackend-projektet och välj Publicera.
- Välj Azure-webbplats som publiceringsmål. Logga in med ditt Azure-konto och välj en befintlig eller ny webbplats och anteckna mål-URL-egenskapen på fliken Anslutning . Vi refererar till den här URL:en som din serverdelsslutpunkt senare i den här självstudien. Klicka på Publicera.
Ändra iOS-projektet
Nu när du har ändrat appens serverdel så att den bara skickar ID :t för ett meddelande måste du ändra din iOS-app för att hantera det meddelandet och anropa serverdelen för att hämta det säkra meddelande som ska visas.
För att uppnå det här målet måste vi skriva logiken för att hämta det säkra innehållet från appens serverdel.
- I - AppDelegate.mkontrollerar du att appen registrerar sig för tysta meddelanden så att den bearbetar meddelande-ID:t som skickas från serverdelen. Lägg till alternativet- UIRemoteNotificationTypeNewsstandContentAvailabilityi didFinishLaunchingWithOptions:- [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability];
- I din - AppDelegate.mlägg till en implementeringssektion överst med följande deklaration:- @interface AppDelegate () - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion; @end
- Lägg sedan till följande kod i implementeringsavsnittet och ersätt platshållaren - {back-end endpoint}med slutpunkten för serverdelen som du fick tidigare:- NSString *const GetNotificationEndpoint = @"{back-end endpoint}/api/notifications"; - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion; { // check if authenticated ANHViewController* rvc = (ANHViewController*) self.window.rootViewController; NSString* authenticationHeader = rvc.registerClient.authenticationHeader; if (!authenticationHeader) return; NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:nil delegateQueue:nil]; NSURL* requestURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%d", GetNotificationEndpoint, payloadId]]; NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:requestURL]; [request setHTTPMethod:@"GET"]; NSString* authorizationHeaderValue = [NSString stringWithFormat:@"Basic %@", authenticationHeader]; [request setValue:authorizationHeaderValue forHTTPHeaderField:@"Authorization"]; NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response; if (!error && httpResponse.statusCode == 200) { NSLog(@"Received secure payload: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error]; completion([json objectForKey:@"Payload"], nil); } else { NSLog(@"Error status: %ld, request: %@", (long)httpResponse.statusCode, error); if (error) completion(nil, error); else { completion(nil, [NSError errorWithDomain:@"APICall" code:httpResponse.statusCode userInfo:nil]); } } }]; [dataTask resume]; }- Den här metoden anropar appens serverdel för att hämta meddelandeinnehållet med de autentiseringsuppgifter som lagras i de delade inställningarna. 
- Hantera nu det inkommande meddelandet och använd metoden ovan för att hämta innehållet som ska visas. Börja med att aktivera din iOS-app så att den körs i bakgrunden när du tar emot ett push-meddelande. I XCode väljer du ditt appprojekt på den vänstra panelen och klickar sedan på huvudappmålet i avsnittet Mål i den centrala rutan. 
- Klicka sedan på fliken Funktioner överst i det centrala fönstret och markera kryssrutan Fjärrmeddelanden .   
- Lägg - AppDelegate.mtill följande metod för att hantera push-meddelanden:- -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"%@", userInfo); [self retrieveSecurePayloadWithId:[[userInfo objectForKey:@"secureId"] intValue] completion:^(NSString * payload, NSError *error) { if (!error) { // show local notification UILocalNotification* localNotification = [[UILocalNotification alloc] init]; localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0]; localNotification.alertBody = payload; localNotification.timeZone = [NSTimeZone defaultTimeZone]; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; completionHandler(UIBackgroundFetchResultNewData); } else { completionHandler(UIBackgroundFetchResultFailed); } }]; }- Observera att det är önskvärt att hantera fall där autentiseringshuvudegenskap saknas eller när avvisning sker av servern. Den specifika hanteringen av dessa fall beror främst på din målanvändarupplevelse. Ett alternativ är att visa ett meddelande med en allmän uppmaning till användaren att autentisera för att hämta det faktiska meddelandet. 
Kör programmet
Kör programmet genom att göra följande:
- I XCode kör du appen på en fysisk iOS-enhet (push-meddelanden fungerar inte i simulatorn).
- I användargränssnittet för iOS-appen anger du ett användarnamn och lösenord. Dessa kan vara valfri sträng, men de måste vara samma värde.
- I användargränssnittet för iOS-appen klickar du på Logga in. Klicka sedan på Skicka push. Du bör se det säkra meddelandet som visas i meddelandecentret.