iOS拦截推送通知

时间:2014-06-17 17:30:03

标签: ios objective-c ios7 push-notification apple-push-notifications

我正在申请使用推送通知,我目前正在使用pushbots进行推送通知。我想知道是否有任何方法可以拦截应用程序收到的通知,并在设备上显示通知之前检查通知。如果通知中的数据不正确,根本不显示通知?这是推特机器人的可能吗?或者我需要自己完成这一切吗?

2 个答案:

答案 0 :(得分:17)

是的,您可以使用本地通知来实现此行为。

您可以在没有alert"content-available": "1"的情况下配置有效负载,这样您的应用就可以在不向用户展示通知的情况下接收通知。

// Payload
{
    aps: {
       "content-available": 1
    },
    text: 'my alert message' // your custom info
} 

在您的应用代码中,将通知注册为

// Register notifications
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
 UIRemoteNotificationTypeNewsstandContentAvailability];

然后,关键是根据某些条件在application:didReceiveRemoteNotification:fetchCompletionHandler:方法中触发本地通知

- (void)application:(UIApplication *)application didReceiveRemoteNotification: (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{

    NSLog(@"push data package: %@", userInfo);

    // Retrieve your data        
    NSString *text = [userInfo objectForKey:@"text"];

    BOOL mustShow = YES;
    // Only show notification if app is background and your custom condition
    if ((state == UIApplicationStateInactive || state == UIApplicationStateBackground) 
         &&  mustShow) {
        // Raise the local notification a second after received
        UILocalNotification* localNotification = [[UILocalNotification alloc] init];
        localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
        localNotification.alertBody = text;
        localNotification.timeZone = [NSTimeZone defaultTimeZone];
        localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;

        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    }
}

这样你就可以拦截"之前的通知"显示"他们给用户。

答案 1 :(得分:2)

您无法阻止通知在到达设备后显示(假设它在alert字典中包含aps字段 - 如果没有,则无论如何都不会显示通知)。

您应该在服务器中确定应将哪些通知发送到哪个设备令牌。如果您的功能需要,您可以将设备令牌与数据库中的用户相关联。

即使您提出的要求是可能的,向所有安装了您应用的设备发送通知也是非常低效的,然后只在一小部分设备中显示通知。