Получение уведомлений только в том случае, если приложение запущено
Я не получаю уведомления в газетных киосках, когда приложение не работает, вот что я сделал.
В приложении есть правильные ключи plist "UINewsstandApp = YES" и "UIBackgroundModes = newsstand-content".
В делегате приложения я регистрируюсь для всех типов уведомлений, и я получаю свой токен от APNS, со стороны сервера (я использую драгоценный камень под названием Grocer). Я установил сертификат разработчика и отправлю обычный push, и он работает.
если я отправлю push-киоск, я получаю его, если приложение работает на 'didReceiveRemoteNotification', но когда приложение не работает, я ничего не получаю в центре уведомлений, что связано главным образом с тем, что "Grocer" имеет следующую полезную нагрузку
{ "aps": { "content-available": 1}} и не может добавлять другие ключи (предупреждение, значок и т.д.)
поэтому я подумал, что я не должен ничего получать в центре уведомлений, я ищу "UIApplicationLaunchOptionsRemoteNotificationKey" в параметрах запуска, а затем записываю файл, чтобы убедиться, что приложение работает в фоновом режиме, файл никогда не записывается как таковой
NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotif)
{
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [cachePath stringByAppendingPathExtension:@"pushreceived.txt"];
[@"testing" writeToFile:filePath atomically:YES encoding:NSASCIIStringEncoding error:nil];
}
У меня есть NKDontThrottleNewsstandContentNotifications, установленное true в моих настройках по умолчанию, а затем я синхронизирую, чтобы убедиться.
когда приложение запущено, независимо от того, сколько раз я отправляю push, я всегда получаю обратный вызов на "didReceiveRemoteNotification" с соответствующим "содержимым"
Если приложение закрыто или в фоновом режиме, ничего не происходит.
Update:
Мне удалось изменить драгоценный камень, который отправляет полезную нагрузку уведомления, вот словарь, который он отправляет
{"aps"=>
{
"alert"=>"Hello iPhone!!",
"content-available"=>1,
"badge"=>1,
"sound"=>"default"
}
}
и вот словарь userinfo, который я получаю в своем приложении (во время работы)
{
aps = {
alert = "Hello iPhone!!";
badge = 1;
"content-available" = 1;
sound = default;
};
}
обратите внимание на кавычки вокруг контента, доступного, означает ли это, что APNS проанализировал его как пользовательский ключ?
Ответы
Ответ 1
Чтобы получать уведомления, когда ваше приложение работает в фоновом режиме, вам необходимо добавить метод applicationDidEnterBackgroud
в ваш основной класс. Из документации Apple:
Приложения могут также находить локальные уведомления полезными, когда они запускаются в фоновом режиме, а также некоторые сообщения, данные или другие элементы, которые могут представлять интерес для пользователя. В этом случае они должны немедленно отправить уведомление с использованием метода UIApplication nowLocalNotificationNow: (iOS предоставляет приложение ограниченное время для работы в фоновом режиме). Листинг 2-2 иллюстрирует, как вы можете это сделать.
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"Application entered background state.");
// bgTask is instance variable
NSAssert(self->bgTask == UIInvalidBackgroundTask, nil);
bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
dispatch_async(dispatch_get_main_queue(), ^{
[application endBackgroundTask:self->bgTask];
self->bgTask = UIInvalidBackgroundTask;
});
}];
dispatch_async(dispatch_get_main_queue(), ^{
while ([application backgroundTimeRemaining] > 1.0) {
// Replace this code with your notification handling process
NSString *friend = [self checkForIncomingChat];
if (friend) {
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = [NSString stringWithFormat:
NSLocalizedString(@"%@ has a message for you.", nil), friend];
localNotif.alertAction = NSLocalizedString(@"Read Message", nil);
localNotif.soundName = @"alarmsound.caf";
localNotif.applicationIconBadgeNumber = 1;
[application presentLocalNotificationNow:localNotif];
[localNotif release];
friend = nil;
break;
}
}
}
[application endBackgroundTask:self->bgTask];
self->bgTask = UIInvalidBackgroundTask;
});
}
Также note:
Поскольку единственным типом уведомлений, поддерживаемым для неиспользуемых приложений, является значок-значок, просто передайте NSRemoteNotificationTypeBadge в качестве параметра registerForRemoteNotificationTypes:.
Ответ 2
Попробуйте сделать это как проверку работоспособности:
- В настройках → Newsstand вы автоматически загружаете контент для своего приложения.
- Убедитесь, что вы использовали
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability]
, некоторые из которых были в вашем приложении.
- Удостоверьтесь, что у вас в фоновом режиме установлен "фоновый режим".
- Запустите приложение на устройстве, а не в симуляторе.
Если вы сделали это правильно, вы должны получить уведомление в didReceiveRemoteNotification
, даже если ваше приложение не запущено.