Регистрация текущего пользователя для push-уведомлений с помощью ASP.NET
Обзор
В этом разделе рассказывается о том, как запросить регистрацию push-уведомлений с помощью концентраторов уведомлений Azure при выполнении регистрации средствами веб-API ASP.NET. Эта статья расширяет руководство Уведомление пользователей с помощью концентраторов уведомлений. Чтобы создать прошедшую проверку подлинности мобильную службу, вы должны завершить требуемые действия в этом учебнике. Дополнительные сведения о сценарии уведомления пользователей см. в руководстве Уведомление пользователей с помощью концентраторов уведомлений.
Обновление приложения
В вашем MainStoryboard_iPhone.storyboard добавьте следующие компоненты из библиотеки объектов:
Метка: «Принудительно отправлять пользователю уведомления из центров уведомлений»
Метка: «InstallationId»
Метка: «Пользователь»
Текстовое поле: «Пользователь»
Метка: «Пароль»
Текстовое поле: «Пароль»
Кнопка: «Вход»
На этом этапе раскадровка выглядит следующим образом:
Во вспомогательном редакторе создайте выходы для всех коммутируемых элементов управления и вызовите их, соедините текстовые поля с контроллером представления (делегируйте) и создайте Действие для кнопки Вход.
Теперь файл BreakingNewsViewController.h должен содержать следующий код:
@property (weak, nonatomic) IBOutlet UILabel *installationId; @property (weak, nonatomic) IBOutlet UITextField *User; @property (weak, nonatomic) IBOutlet UITextField *Password; - (IBAction)login:(id)sender;
Создайте класс с именем
DeviceInfo
и скопируйте следующий код в раздел интерфейса файла DeviceInfo.h.@property (readonly, nonatomic) NSString* installationId; @property (nonatomic) NSData* deviceToken;
Скопируйте следующий код в реализационную часть файла 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; }
В PushToUserAppDelegate.h добавьте следующее одноэлементное свойство:
@property (strong, nonatomic) DeviceInfo* deviceInfo;
В метод
didFinishLaunchingWithOptions
в PushToUserAppDelegate.m добавьте следующий код.self.deviceInfo = [[DeviceInfo alloc] init]; [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
Первая строка инициализирует отдельный
DeviceInfo
. Во второй строке начинается регистрация для получения push-уведомлений, которая уже существует, если вы уже изучили руководство Приступая к работе с концентраторами уведомлений.В PushToUserAppDelegate.m реализуйте метод
didRegisterForRemoteNotificationsWithDeviceToken
в своем AppDelegate и добавьте следующий код.self.deviceInfo.deviceToken = deviceToken;
Таким образом задается маркер устройства для запроса.
Примечание
На этом этапе в методе не должно быть никакого другого кода. Если в методе
registerNativeWithDeviceToken
уже есть вызов, добавленный при выполнении инструкций статьи Руководство по отправке push-уведомлений в приложения iOS с помощью Центров уведомлений Azure, этот вызов нужно закомментировать или удалить.Добавьте следующий метод в файле
PushToUserAppDelegate.m
:* (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]; }
Этот метод отображает предупреждение в пользовательском интерфейсе, когда приложение получает уведомления во время работы.
Откройте файл
PushToUserViewController.m
и верните клавиатуру в следующей реализации.- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == self.User || theTextField == self.Password) { [theTextField resignFirstResponder]; } return YES; }
В методе
viewDidLoad
файлаPushToUserViewController.m
инициализируйте меткуinstallationId
следующим образом.DeviceInfo* deviceInfo = [(PushToUserAppDelegate*)[[UIApplication sharedApplication]delegate] deviceInfo]; Self.installationId.text = deviceInfo.installationId;
Добавьте следующие свойства в интерфейс
PushToUserViewController.m
.@property (readonly) NSOperationQueue* downloadQueue; - (NSString*)base64forData:(NSData*)theData;
Затем добавьте следующую реализацию:
- (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]; }
Скопируйте следующий код в метод обработчика
login
, созданный с помощью 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); } }];
Этот метод возвращает ИД установки и канал для push-уведомлений и отправляет его, вместе с типом устройства, прошедшему проверку подлинности методу веб-API, который создает регистрацию в концентраторах уведомлений. Этот веб-API был определен в учебнике Уведомление пользователей с помощью концентраторов уведомлений.
Теперь, когда клиентское приложение было обновлено, вернитесь к учебнику Уведомление пользователей с помощью концентраторов уведомлений и обновите мобильную службу для отправки уведомлений с помощью концентраторов уведомлений.