Я хочу сделать приращение значка на значке основного приложения при получении уведомления в неактивном режиме приложения - PullRequest
9 голосов
/ 04 мая 2020

Я работаю над приложением чата в Reaction-native iOS. Я хочу увеличить значок на значке основного приложения при получении уведомления, когда приложение закрывается или принудительно завершается пользователем. Хорошо работает, когда приложение находится в фоновом режиме. Но метод didReceiveRemoteNotification не вызывается, когда приложение неактивно. Есть идеи по этому поводу? Я добавил код в didReceiveRemoteNotification метод AppDelegate.

Добавлен следующий набор кодов в файле AppDelegate

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
      [RNNotifications didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
    }

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
      [RNNotifications didFailToRegisterForRemoteNotificationsWithError:error];
    }

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"APPDELEGATE: didReceiveRemoteNotification:fetchCompletionHandler %@", userInfo);
  int badge = (int) application.applicationIconBadgeNumber;
  if ( application.applicationState == UIApplicationStateInactive ) {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge+1];
  }
  else if(application.applicationState == UIApplicationStateBackground) {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge+1];
  }
  else if(application.applicationState == UIApplicationStateActive) {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge+1];
  }
  completionHandler(UIBackgroundFetchResultNewData);
}

Ответы [ 3 ]

1 голос
/ 12 мая 2020

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

В - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler из UNNotificationServiceExtension вы можете обновить Пометить следующим образом:

  1. self.bestAttemptContent = [request.content mutableCopy];, чтобы получить содержимое запроса
  2. self.bestAttemptContent.badge = <desired_integer_value>, где <desired_integer_value> будет целым числом, которое вы sh положите для счетчик значков.
  3. self.contentHandler(self.bestAttemptContent); для завершения обновления содержимого.

Во многих случаях счетчик значков может отражать значение (например, количество непрочитанных сообщений чата) для конкретного пользователя. Для этого вы можете использовать общие пользовательские настройки по умолчанию. На самом деле NSUserDefaults поддерживает концепцию app suite, чтобы разрешить такой обмен. См. документацию Apple для получения более подробной информации. В частности,

Этот метод можно использовать при разработке набора приложений, для обмена настройками или другими данными среди приложений или при разработке расширения приложения, для обмена настройками или другими данными между расширением и содержащее его приложение.

Домены аргументов и регистрации совместно используются всеми экземплярами NSUserDefaults.

В файле Constants.h есть что-то для отслеживания индивидуальных подсчетов для каждого пользователя, например

#define NOTIFICATIONS_UNREAD_SHARED  [NSString stringWithFormat:@"notificationsUnread-%@",[mySharedDefaults objectForKey:USERNAME]]

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

NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.yourCompany.yourAppname"];
if ([[NSUserDefaults standardUserDefaults] objectForKey:USERNAME]) {
    mySharedDefaults setObject:[[NSUserDefaults standardUserDefaults] objectForKey:USERNAME] forKey:USERNAME];
    [mySharedDefaults setObject:[NSNumber numberWithInteger:arrExistingRead.count] forKey:NOTIFICATIONS_READ_SHARED];
    [mySharedDefaults setObject:[NSNumber numberWithInteger:([AppConstant sharedconstant].countObj.arrAllMessages.count - arrExistingRead.count)] forKey:NOTIFICATIONS_UNREAD_SHARED];
    [mySharedDefaults synchronize];
}

Затем в вашем UNNotificationServiceExtension, вы бы сделали что-то вроде

NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.yourCompany.yourAppname"];
if ([mySharedDefaults objectForKey:NOTIFICATIONS_UNREAD_SHARED]) {
    if ([mySharedDefaults objectForKey:USERNAME]) {
        self.bestAttemptContent.badge = [NSNumber numberWithInt:[[mySharedDefaults objectForKey:NOTIFICATIONS_UNREAD_SHARED] intValue]+1];
    } else { // username somehow not set; reset badge to 0
        self.bestAttemptContent.badge = @0;
    }
} else { // notifications unread count not found for this user; reset badge to 0
    self.bestAttemptContent.badge = @0;
}
0 голосов
/ 10 мая 2020

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

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

Когда вы получаете уведомление в didReceive(_:withContentHandler:) обратном вызове делегата Вы можете изменить badge значение UNNotificationContent

0 голосов
/ 09 мая 2020

Вам необходимо установить поле значка в полезной нагрузке в уведомлении pu sh. https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification

Вам придется выполнять вычисления на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...