2013-09-10 3 views
0

Я реализую службу push-уведомлений в своем приложении. Я создал службу в стиле Easy Apns, но более простым способом. У меня есть служба, которая использует базу данных MySql для хранения токенов приложения и второй службы, которая обращается к базе данных, готовит уведомления и отправляет их.Управление устройством уведомления о push-уведомлении

Это работает, но я не уверен, что моя учетная часть (на стороне клиента) верна.

Приложение метод делегата:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { 
NSString *devToken = [[[[deviceToken description] 
          stringByReplacingOccurrencesOfString:@"<"withString:@""] 
          stringByReplacingOccurrencesOfString:@">" withString:@""] 
         stringByReplacingOccurrencesOfString: @" " withString: @""]; 

    NSString *urlString = [@"/apns.php?"stringByAppendingString:@"task=register"]; 
    urlString = [urlString stringByAppendingString:@"&appname="]; 
    NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]; 
    urlString = [urlString stringByAppendingString:appName]; 
    urlString = [urlString stringByAppendingString:@"&devicetoken="]; 
    urlString = [urlString stringByAppendingString:devToken]; 


NSString *host = @"myservice.php"; 
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

} 

Этот код обновляет токен каждый раз, когда приложение будет перезагружен. Правильно ли это? Должна ли фаза регистрации произойти только один раз (например, когда пользователь впервые принимает услугу уведомления)? В моем случае, каждый раз, когда приложение перезапускается, токен добавляется в мою базу данных (поэтому мне нужно управлять со стороны сервера, если это реплицированный токен).

ответ

2

Нет ничего плохого в том, как вы регистрируетесь в APNS, но можете сделать это более эффективно.

Apple suggests, который вы регистрируете в службе APN каждый раз, когда приложение запускается (и не только при первом запуске), потому что теоретически токен устройства может измениться (хотя практика практически никогда не выполняется).

Приложение должно регистрироваться при каждом запуске и предоставлять своему провайдеру текущий токен.

Запросив токен устройства и передавая его провайдеру каждый раз при запуске приложения, вы помогаете гарантировать, что у провайдера есть текущий токен для устройства. Если пользователь восстанавливает резервную копию на устройстве или компьютере, отличном от того, на котором была создана резервная копия (например, пользователь переносит данные на новое устройство или компьютер), он или она должен запустить приложение хотя бы один раз, чтобы он получать уведомления снова. Если пользователь восстанавливает данные резервного копирования на новое устройство или компьютер или переустанавливает операционную систему, токен устройства изменяется. Более того, никогда не кэшируйте маркер устройства и не передавайте его своему провайдеру; всегда получайте токен от системы, когда вам это нужно. Если ваше приложение ранее зарегистрировалось, вызов registerForRemoteNotificationTypes: приводит к тому, что операционная система передает токен устройства делегату немедленно, не прибегая к дополнительным накладным расходам.

Вы можете хранить устройство маркеров локально в NSUserDefaults, и каждый раз, когда didRegisterForRemoteNotificationsWithDeviceToken называется, вы можете сравнить маркер вновь принятое устройство с сохраненным маркером устройства. Вам нужно отправить токен устройства на ваш сервер, только если он отличается от сохраненного. Это позволит избежать ненужных вызовов сервера.

Смежные вопросы