仅在应用程序运行时接收报亭通知

时间:2013-03-03 13:49:07

标签: ios objective-c apple-push-notifications newsstand-kit

我没有在应用未运行时收到报亭通知,这就是我所做的。

该应用具有正确的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将其解析为自定义键?

2 个答案:

答案 0 :(得分:3)

要在应用程序在后台运行时接收通知,您需要向主类添加applicationDidEnterBackgroud方法。来自Apple documentation

  

当应用程序在后台运行并且某些消息,数据或其他项目到达可能对用户感兴趣时,应用程序也可能会发现本地通知很有用。在这种情况下,他们应该使用UIApplication方法n​​owLocalNotificationNow立即显示通知:( 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]
  • 确保您的plist中需要背景模式作为'newsstand-content'。
  • 在设备中运行应用程序,而不是在模拟器中运行。

如果您已正确完成这些操作,即使您的应用未运行,也应在didReceiveRemoteNotification中收到通知。