【问题标题】:iOS Intercept push notificationiOS 拦截推送通知
【发布时间】:2017-02-04 09:08:01
【问题描述】:

我正在制作一个使用推送通知的应用程序,我目前正在使用推送机器人来推送通知。我想知道是否有任何方法可以拦截应用程序收到的通知并在通知显示在设备上之前检查通知。如果通知中的数据不正确,根本不显示通知?使用 pushbot 可以做到这一点,还是我需要自己做这一切?

【问题讨论】:

  • 为什么通知“不正确”?您控制发送到设备的通知,不要发送不良通知...
  • 正确可能是错误的词,但我想检查它是否是正确的“用户”或设备。我不希望所有带有该应用程序的设备都收到所有通知。
  • 发送推送通知时,指定设备令牌以确定将通知发送到哪个设备...

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


【解决方案1】:

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

您可以在没有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:方法中触发Local Notifications

- (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];
    }
}

这样,您可以在将通知“显示”给用户之前“拦截”通知。

【讨论】:

    【解决方案2】:

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

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

    即使您的请求是可能的,将通知发送到所有安装了您的应用程序的设备,然后只在其中的一小部分设备中显示通知也是非常低效的。

    【讨论】:

    • 我设法通过使用别名来做到这一点,类似于设备令牌,但在每台设备上,您都可以为该用户设置一个特定的别名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多