我没有在应用未运行时收到报亭通知,这就是我所做的。
该应用具有正确的plist键'UINewsstandApp = YES'和'UIBackgroundModes = newsstand-content'。
在app委托中我注册所有通知类型,我从APNS接收我的令牌,从服务器端(我使用的是一个名为Grocer的宝石)我设置了开发证书并发送定期推送并且它有效。
如果我发送报刊亭推送,如果应用程序在“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,然后我进行同步以确保。
当应用程序运行时,无论我发送推送多少次,我总是会收到“didReceiveRemoteNotification”的回调,并使用正确的“内容可用”
如果应用已关闭或在后台,则不会发生任何事情。
更新
我设法更改发送通知有效负载的gem,这是它发送的字典
{"aps"=>
{
"alert"=>"Hello iPhone!!",
"content-available"=>1,
"badge"=>1,
"sound"=>"default"
}
}
这里是我在我的应用程序上运行时收到的userinfo字典
{
aps = {
alert = "Hello iPhone!!";
badge = 1;
"content-available" = 1;
sound = default;
};
}
请注意内容可用的引号,这是否意味着APNS将其解析为自定义键?
答案 0 :(得分:3)
要在应用程序在后台运行时接收通知,您需要向主类添加applicationDidEnterBackgroud
方法。来自Apple documentation:
当应用程序在后台运行并且某些消息,数据或其他项目到达可能对用户感兴趣时,应用程序也可能会发现本地通知很有用。在这种情况下,他们应该使用UIApplication方法nowLocalNotificationNow立即显示通知:( iOS为应用程序提供了在后台运行的有限时间)。 Listing 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:
因为非运行应用程序支持的唯一通知类型是icon-badging,所以只需将NSRemoteNotificationTypeBadge作为registerForRemoteNotificationTypes的参数传递:。
答案 1 :(得分:2)
尝试这些作为完整性检查:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability]
。如果您已正确完成这些操作,即使您的应用未运行,也应在didReceiveRemoteNotification
中收到通知。