Dela via


Registrera den aktuella användaren för push-meddelanden med hjälp av ASP.NET

Översikt

Det här avsnittet visar hur du begär registrering av push-meddelanden med Azure Notification Hubs när registreringen utförs av ASP.NET webb-API. Det här avsnittet utökar självstudien Meddela användare med Notification Hubs. Du måste redan ha slutfört de steg som krävs i den självstudien för att skapa den autentiserade mobiltjänsten. Mer information om scenariot meddela användare finns i Meddela användare med Notification Hubs.

Uppdatera din app

  1. Lägg till följande komponenter från objektbiblioteket i din MainStoryboard_iPhone.storyboard:

    • Etikett: "Push to User with Notification Hubs" (Skicka till användare med Notification Hubs)

    • Etikett: "InstallationId"

    • Etikett: "Användare"

    • Textfält: "Användare"

    • Etikett: "Lösenord"

    • Textfält: "Lösenord"

    • Knapp: "Logga in"

      Nu ser din storyboard ut så här:

      Skärmbild av appen MainStoryboard_iPhone.storyboard med komponenterna tillagda.

  2. I assistentredigeraren skapar du utlopp för alla växlade kontroller och anropar dem, ansluter textfälten med View Controller (ombud) och skapar en åtgärd för inloggningsknappen .

    Skärmbild av assistentredigeraren i appen MainStoryboard_iPhone.storyboard

    Filen BreakingNewsViewController.h bör nu innehålla följande kod:

    @property (weak, nonatomic) IBOutlet UILabel *installationId;
    @property (weak, nonatomic) IBOutlet UITextField *User;
    @property (weak, nonatomic) IBOutlet UITextField *Password;
    
    - (IBAction)login:(id)sender;
    
  3. Skapa en klass med namnet DeviceInfooch kopiera följande kod till gränssnittsavsnittet i filen DeviceInfo.h:

    @property (readonly, nonatomic) NSString* installationId;
    @property (nonatomic) NSData* deviceToken;
    
  4. Kopiera följande kod i implementeringsavsnittet i filen DeviceInfo.m:

    @synthesize installationId = _installationId;
    
    - (id)init {
        if (!(self = [super init]))
            return nil;
    
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        _installationId = [defaults stringForKey:@"PushToUserInstallationId"];
        if(!_installationId) {
            CFUUIDRef newUUID = CFUUIDCreate(kCFAllocatorDefault);
            _installationId = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, newUUID);
            CFRelease(newUUID);
    
            //store the install ID so we don't generate a new one next time
            [defaults setObject:_installationId forKey:@"PushToUserInstallationId"];
            [defaults synchronize];
        }
    
        return self;
    }
    
    - (NSString*)getDeviceTokenInHex {
        const unsigned *tokenBytes = [[self deviceToken] bytes];
        NSString *hexToken = [NSString stringWithFormat:@"%08X%08X%08X%08X%08X%08X%08X%08X",
                                ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                                ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                                ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
        return hexToken;
    }
    
  5. Lägg till följande egenskap singleton i PushToUserAppDelegate.h:

    @property (strong, nonatomic) DeviceInfo* deviceInfo;
    
  6. didFinishLaunchingWithOptions Lägg till följande kod i metoden i PushToUserAppDelegate.m:

    self.deviceInfo = [[DeviceInfo alloc] init];
    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    

    Den första raden initierar singletonen DeviceInfo . Den andra raden startar registreringen för push-meddelanden, som redan finns om du redan har slutfört självstudien Kom igång med Notification Hubs .

  7. I PushToUserAppDelegate.m implementerar du metoden didRegisterForRemoteNotificationsWithDeviceToken i din AppDelegate och lägger till följande kod:

    self.deviceInfo.deviceToken = deviceToken;
    

    Detta anger enhetstoken för begäran.

    Anteckning

    I det här läget bör det inte finnas någon annan kod i den här metoden. Om du redan har ett anrop till metoden registerNativeWithDeviceToken som lades till när du slutförde självstudien Skicka push-meddelanden till iOS-appar med Azure Notification Hubs måste du kommentera ut eller ta bort anropet.

  8. PushToUserAppDelegate.m Lägg till följande hanteringsmetod i filen:

    * (void) application:(UIApplication *) application didReceiveRemoteNotification:(NSDictionary *)userInfo {
       NSLog(@"%@", userInfo);
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notification" message:
                             [userInfo objectForKey:@"inAppMessage"] delegate:nil cancelButtonTitle:
                             @"OK" otherButtonTitles:nil, nil];
       [alert show];
    }
    

    Den här metoden visar en avisering i användargränssnittet när appen tar emot meddelanden medan den körs.

  9. PushToUserViewController.m Öppna filen och returnera tangentbordet i följande implementering:

    - (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == self.User || theTextField == self.Password) {
            [theTextField resignFirstResponder];
        }
        return YES;
    }
    
  10. viewDidLoad I -metoden i PushToUserViewController.m filen initierar du etiketten på installationId följande sätt:

    DeviceInfo* deviceInfo = [(PushToUserAppDelegate*)[[UIApplication sharedApplication]delegate] deviceInfo];
    Self.installationId.text = deviceInfo.installationId;
    
  11. Lägg till följande egenskaper i gränssnittet i PushToUserViewController.m:

    @property (readonly) NSOperationQueue* downloadQueue;
    - (NSString*)base64forData:(NSData*)theData;
    
  12. Lägg sedan till följande implementering:

    - (NSOperationQueue *)downloadQueue {
        if (!_downloadQueue) {
            _downloadQueue = [[NSOperationQueue alloc] init];
            _downloadQueue.name = @"Download Queue";
            _downloadQueue.maxConcurrentOperationCount = 1;
        }
        return _downloadQueue;
    }
    
    // base64 encoding
    - (NSString*)base64forData:(NSData*)theData
    {
        const uint8_t* input = (const uint8_t*)[theData bytes];
        NSInteger length = [theData length];
    
        static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
        NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
        uint8_t* output = (uint8_t*)data.mutableBytes;
    
        NSInteger i;
        for (i=0; i < length; i += 3) {
            NSInteger value = 0;
            NSInteger j;
            for (j = i; j < (i + 3); j++) {
                value <<= 8;
    
                if (j < length) {
                    value |= (0xFF & input[j]);
                }
            }
    
            NSInteger theIndex = (i / 3) * 4;
            output[theIndex + 0] =                    table[(value >> 18) & 0x3F];
            output[theIndex + 1] =                    table[(value >> 12) & 0x3F];
            output[theIndex + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
            output[theIndex + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
        }
    
        return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    }
    
  13. Kopiera följande kod till hanteringsmetoden login som skapats av XCode:

    DeviceInfo* deviceInfo = [(PushToUserAppDelegate*)[[UIApplication sharedApplication]delegate] deviceInfo];
    
    // build JSON
    NSString* json = [NSString stringWithFormat:@"{\"platform\":\"ios\", \"instId\":\"%@\", \"deviceToken\":\"%@\"}", deviceInfo.installationId, [deviceInfo getDeviceTokenInHex]];
    
    // build auth string
    NSString* authString = [NSString stringWithFormat:@"%@:%@", self.User.text, self.Password.text];
    
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://nhnotifyuser.azurewebsites.net/api/register"]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];
    [request addValue:[@([json lengthOfBytesUsingEncoding:NSUTF8StringEncoding]) description] forHTTPHeaderField:@"Content-Length"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:[NSString stringWithFormat:@"Basic %@",[self base64forData:[authString dataUsingEncoding:NSUTF8StringEncoding]]] forHTTPHeaderField:@"Authorization"];
    
    // connect with POST
    [NSURLConnection sendAsynchronousRequest:request queue:[self downloadQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
        // add UIAlert depending on response.
        if (error != nil) {
            NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
            if ([httpResponse statusCode] == 200) {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Back-end registration" message:@"Registration successful" delegate:nil cancelButtonTitle: @"OK" otherButtonTitles:nil, nil];
                [alert show];
            } else {
                NSLog(@"status: %ld", (long)[httpResponse statusCode]);
            }
        } else {
            NSLog(@"error: %@", error);
        }
    }];
    

    Den här metoden hämtar både ett installations-ID och en kanal för push-meddelanden och skickar det, tillsammans med enhetstypen, till den autentiserade webb-API-metoden som skapar en registrering i Notification Hubs. Det här webb-API:et definierades i Meddela användare med Notification Hubs.

Nu när klientappen har uppdaterats går du tillbaka till Meddela användare med Notification Hubs och uppdaterar mobiltjänsten för att skicka meddelanden med hjälp av Notification Hubs.