iOS перехватить push-уведомление

#ios #objective-c #ios7 #push-notification #apple-push-notifications

#iOS #objective-c #ios7 #push-уведомление #apple — push-уведомления

Вопрос:

Я создаю приложение, в котором используются push-уведомления, в настоящее время я использую push-боты для push-уведомлений. Мне было интересно, есть ли какой-либо способ перехватывать уведомления, получаемые приложением, и проверять уведомление до того, как уведомление отобразится на устройстве. И если данные в уведомлении неверны, уведомление вообще не отображается? Возможно ли это с помощью pushbot или мне нужно сделать все это самостоятельно?

Комментарии:

1. Почему уведомление «неверно»? Вы управляете уведомлением, отправляемым на устройство, не отправляйте неверные уведомления…

2. Правильное может быть неправильным словом, но я хочу проверить, правильный ли это «пользователь» или устройство. Я не хочу, чтобы все устройства с приложением получали все уведомления.

3. При отправке push-уведомления вы указываете маркер устройства, чтобы определить, на какое устройство отправлять уведомление…

Ответ №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: методе на основе некоторого условия

 - (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) 
         amp;amp;  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:

Вы не можете запретить отображение уведомления, как только оно достигнет устройства (при условии, что оно содержит alert поле в aps словаре — если это не так, уведомление все равно не будет отображаться).

Вы должны определить на своем сервере, какие уведомления следует отправлять на какие токены устройства. Вы можете связать токены устройств с пользователями в вашей базе данных, если этого требует ваша функциональность.

Даже если бы то, что вы запрашиваете, было бы возможно, было бы очень неэффективно отправлять уведомления на все устройства, на которых установлено ваше приложение, а затем отображать уведомление только в небольшом подмножестве из них.

Комментарии:

1. Мне удается сделать это, используя вместо этого псевдоним, аналогичный токену устройства, но на каждом устройстве вы можете установить определенный псевдоним для этого пользователя.