Как реализовать интерактивные удаленные уведомления в iOS Objective-c

Я новичок в Objective-c. Я хочу создать интерактивное удаленное уведомление с двумя действиями, одно из которых называется «ОК», а другое — «ПРОСМОТР». Когда пользователь получает уведомление через APNS, в это время, если пользователь нажимает «ОК», уведомление должно быть отклонено, и если пользователь нажимает «ПРОСМОТР», в это время открывается определенная страница моего приложения. Вот и все.

Я просмотрел множество веб-документов и уловил некоторую концепцию полезной нагрузки уведомлений. Но я не могу реализовать этот шаг мудро. Может ли кто-нибудь помочь мне, как я могу реализовать эту функциональность. И, пожалуйста, не отмечайте как повторяющийся вопрос. Спасибо


person Swarup    schedule 05.12.2017    source источник
comment
stackoverflow.com/a/29118483/4601900 проверить   -  person Prashant Tukadiya    schedule 05.12.2017
comment
привет @Prashant, предоставленный вами документ применим для верхней версии iOS. как iOS10,11?   -  person Swarup    schedule 05.12.2017
comment
требуется больше или равно ios8   -  person Prashant Tukadiya    schedule 05.12.2017
comment
@PrashantTukadiya, еще один вопрос, это для удаленного уведомления, верно?   -  person Swarup    schedule 05.12.2017
comment
Да правильно это   -  person Prashant Tukadiya    schedule 05.12.2017
comment
@PrashantTukadiya, поэтому из бэкэнда нам нужна только категория: Any String? Пожалуйста, уточните, это будет более полезно для меня.   -  person Swarup    schedule 05.12.2017
comment
@Swarup да, это все, что тебе нужно!! см. этот developer.apple.com/library/content/ документация/   -  person Prashant Tukadiya    schedule 05.12.2017
comment
@PrashantTukadiya, у меня недостаточно репутации для обсуждения в чате. Если я не хочу отклонять уведомление, нажав одну из кнопок «ОК», какой код нужно написать в методе handleActionWithIdentifier? Это последний вопрос. Спасибо за вашего помощника.   -  person Swarup    schedule 05.12.2017
comment
Отправка вам образец кода для вас !!   -  person Prashant Tukadiya    schedule 05.12.2017


Ответы (2)


Примечание. Я использовал здесь свои собственные константы для категории, например KNotificatoin_IDENTIFIER_CATEGORY_NEW_BID, используйте ваши в этом месте.

Зарегистрируйтесь для отправки

- (void) registerPushNotification {

    UIUserNotificationType  type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge |  UIUserNotificationTypeSound;
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type categories:[NSSet setWithObjects:[self createActionNotificationsSettingForApproveBID],[self createActionNotificationsSettingForCancelingRequest ], nil]];
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    [[UIApplication sharedApplication] registerForRemoteNotifications];

}


- (UIMutableUserNotificationCategory *) createActionNotificationsSettingForApproveBID {

    UIMutableUserNotificationAction *actionApproveBID = [[UIMutableUserNotificationAction alloc]  init];
    [actionApproveBID setIdentifier:KNotificatoin_IDENTIFER_ACTION_APPROVEBID];
    actionApproveBID.activationMode = UIUserNotificationActivationModeForeground;
    actionApproveBID.title = @"Approve";
    actionApproveBID.authenticationRequired = true;
    [actionApproveBID setDestructive: false];


    UIMutableUserNotificationAction *actionCancelDialog = [[UIMutableUserNotificationAction alloc]  init];
    [actionCancelDialog setIdentifier:KNotificatoin_IDENTIFER_ACTION_DETAILS];
    actionCancelDialog.activationMode = UIUserNotificationActivationModeForeground;
    actionCancelDialog.title = @"Details";
    actionCancelDialog.authenticationRequired = true;
    [actionCancelDialog setDestructive: false];

    UIMutableUserNotificationCategory *cateogoryApproveBID = [[UIMutableUserNotificationCategory alloc] init];
    cateogoryApproveBID.identifier = KNotificatoin_IDENTIFIER_CATEGORY_NEW_BID;
    [cateogoryApproveBID setActions:@[actionApproveBID,actionCancelDialog] forContext:UIUserNotificationActionContextDefault];
    [cateogoryApproveBID setActions:@[actionApproveBID,actionCancelDialog] forContext:UIUserNotificationActionContextMinimal];

    return cateogoryApproveBID;
}

- (UIMutableUserNotificationCategory *) createActionNotificationsSettingForCancelingRequest {

    UIMutableUserNotificationAction *actionGetMoreBids = [[UIMutableUserNotificationAction alloc]  init];
    [actionGetMoreBids setIdentifier:KNotificatoin_IDENTIFER_ACTION_APPROVEBID];
    actionGetMoreBids.activationMode = UIUserNotificationActivationModeForeground;
    actionGetMoreBids.title = @"Get more bids";
    actionGetMoreBids.authenticationRequired = true;
    [actionGetMoreBids setDestructive: false];


    UIMutableUserNotificationAction *actionEditRequest = [[UIMutableUserNotificationAction alloc]  init];
    [actionEditRequest setIdentifier:KNotificatoin_IDENTIFER_ACTION_EDIT_REQUEST];
    actionEditRequest.activationMode = UIUserNotificationActivationModeForeground;
    actionEditRequest.title = @"Edit request";
    actionEditRequest.authenticationRequired = true;
    [actionEditRequest setDestructive: false];

    UIMutableUserNotificationCategory *categoryCancelRequest = [[UIMutableUserNotificationCategory alloc] init];
    categoryCancelRequest.identifier = KNotificatoin_IDENTIFER_ACTION_MORE_BIDS;
    [categoryCancelRequest setActions:@[actionGetMoreBids,actionEditRequest] forContext:UIUserNotificationActionContextDefault];
    [categoryCancelRequest setActions:@[actionGetMoreBids,actionEditRequest] forContext:UIUserNotificationActionContextMinimal];

    return categoryCancelRequest;
}

Как вы будете обрабатывать действия?

- (void) application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {
    NSLog(@" APPLICATION STATUS %ld",(long)[UIApplication sharedApplication].applicationState);

    if ([[[userInfo objectForKey:@"aps"] objectForKey:kCategory] isEqualToString:KNotificatoin_IDENTIFIER_CATEGORY_NEW_BID]){
        if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_APPROVEBID]) {
            NSMutableDictionary *dictData = [NSMutableDictionary dictionaryWithDictionary:userInfo];
            [dictData setObject:@17 forKey:kType];

            if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState) {
                [self saveDictionaryForPushActiveState:dictData];
            } else {
                [self navigatateAsPerPush:dictData allowInActiveState:NO];
            }
        }
        else if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_DETAILS]) {
            NSLog(@"You chose action 2.");
            if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState) {
                [self saveDictionaryForPushActiveState:userInfo];
            } else {
                [self navigatateAsPerPush:userInfo allowInActiveState:NO];
            }
        }
    } else  if ([[[userInfo objectForKey:@"aps"] objectForKey:kCategory] isEqualToString:KNotificatoin_IDENTIFIER_NOTIFICATION_REQUEST]){

        NSMutableDictionary *dictData = [NSMutableDictionary dictionaryWithDictionary:userInfo];

        if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_EDIT_REQUEST]) {
            NSLog(@"You chose action 1.");
            [dictData setObject:@16 forKey:kType];
            if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState) {
                [self saveDictionaryForPushActiveState:dictData];
            } else {
                [self navigatateAsPerPush:dictData allowInActiveState:NO];
            }

        }
        else if ([identifier isEqualToString:KNotificatoin_IDENTIFER_ACTION_MORE_BIDS]) {
            NSLog(@"You chose action 2.");
            if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive || self.isApplicationIsInActiveState) {
                [self saveDictionaryForPushActiveState:dictData];
            } else {
                [self navigatateAsPerPush:dictData allowInActiveState:NO];
            }

        }

    }

    if (completionHandler) {
        completionHandler();
    }
}

Надеюсь, это будет полезно для вас

person Prashant Tukadiya    schedule 05.12.2017
comment
@Swarup У меня нет такого. Пожалуйста, обратитесь к документации Apple - person Prashant Tukadiya; 05.12.2017
comment
Я не понимаю, сколько действий (кнопок) в вашем примере кода. Не могли бы вы сказать мне, а также имя? Так что это будет очень полезно для меня. Спасибо - person Swarup; 05.12.2017
comment
По его названию ясно, что createActionNotificationsSettingForApproveBID две кнопки одобряют и отменяют. Пожалуйста, попробуйте этот код самостоятельно, вы легко поймете - person Prashant Tukadiya; 05.12.2017
comment
@Swarup добро пожаловать, если ответ вам полезен, вы можете одобрить его как принятый !! - person Prashant Tukadiya; 05.12.2017
comment
Да, я сделаю это после успешного внедрения. - person Swarup; 05.12.2017
comment
привет @Prasant, когда я реализую интерактивное уведомление о том, что нужно объявить метод делегата 'didReceiveRemoteNotification'? Потому что я получаю сбой, когда пользователь нажимает тело оповещения уведомления (не нажимает кнопку действия уведомления) - person Swarup; 27.12.2017
comment
@Swarup Точно не знаю, но думаю, вам нужно объявить - person Prashant Tukadiya; 27.12.2017
comment
Я реализовал интерактивное уведомление с двумя кнопками действий. Если пользователь нажимает на тело уведомления неактивные кнопки, в это время приложение открывается и происходит сбой. как решить эту проблему? Я не могу этого понять. Спасибо - person Swarup; 27.12.2017
comment
@Swarup Да, пользователь может не нажимать ни одну из кнопок. Вы должны справиться с этим. Попробуйте отладить, где ваше приложение дает сбой - person Prashant Tukadiya; 28.12.2017
comment
Привет, @Prashant, да, я должен справиться с этим. Могу ли я отключить взаимодействие с пользователем, когда пользователь щелкает тело уведомления (кроме нажатия 2 кнопок)? - person Swarup; 28.12.2017
comment
@Swarup Нет !! Вы не можете. Если вы используете, не нажимайте ни одну кнопку, вы должны обрабатывать этот ответ в соответствии с кнопкой 1 или кнопкой 2. - person Prashant Tukadiya; 28.12.2017
comment
@Swarup Для тебя это звонит или нет? - person Prashant Tukadiya; 28.12.2017
comment
скажите мне одну вещь, когда щелкаете тело уведомления, когда метод делегата didReceiveRemoteNotification вызывается или нет? Потому что, когда пользователь нажимает кнопку интерактивного уведомления, в это время вызывается 'handleActionWithIdentifier' этот метод делегата. правильно? пожалуйста очистите эту тему. Я просмотрела множество документов, но ничего не нашла. Спасибо - person Swarup; 28.12.2017
comment
@Swarup Если пользователь нажмет на кнопку, вызовет handleActionWithIdentifier, а если пользователь нажмет на уведомление, вызовет didReceiveRemoteNotification - person Prashant Tukadiya; 28.12.2017
comment
привет @prashant У меня недостаточно репутации, чтобы пометить эти ответы как принятые. Вы можете проголосовать за этот вопрос? Спасибо - person Swarup; 02.01.2018
comment
@Swarup Хорошо, без проблем :) - person Prashant Tukadiya; 02.01.2018

Благодаря iOS 12 SDK ваше приложение использует преимущества интерактивных элементов управления в уведомлениях.

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

Чтобы включить взаимодействие с пользователем:

Откройте файл info.plist расширения содержимого уведомлений.

Добавьте ключ UNNotificationExtensionUserInteractionEnabled в атрибуты расширения. Дайте ему логическое значение, установите YES. введите здесь описание изображения

Вот ссылка, как узнать больше

https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications

https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications

https://developer.apple.com/documentation/usernotificationsui

person SachinVsSachin    schedule 21.11.2018