APN: изменение значка приложения, когда приложение находится на переднем плане

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

Когда приложение находится в фоновом режиме, значок успешно обновляется. Однако, когда приложение находится на переднем плане, значок вообще не обновляется — push-уведомление доставляется приложению, которое его отбрасывает.

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

Интересно, есть ли способ обойти это и обновить значок, используя APN на стороне сервера, независимо от состояния приложения, переднего плана или фона.

Есть ли способ изменить значок приложения iOS с помощью push-сообщения, когда приложение находится на переднем плане, без обработки push-уведомления внутри приложения?


person Adam Matan    schedule 26.12.2016    source источник
comment
Только через функцию - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo в AppDelegate функция будет вызываться при получении уведомления на переднем плане, считывать значение из полезной нагрузки и назначать [UIApplication sharedApplication].applicationIconBadgeNumber=BADGEVALUE;   -  person iphonic    schedule 26.12.2016
comment
@iphonic Значит, нет способа сделать это без изменения кода на стороне клиента? Спасибо. Хотите написать свой комментарий как полный ответ?   -  person Adam Matan    schedule 27.12.2016


Ответы (1)


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

Устарело в iOS 10

 - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;

or,

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

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

[UIApplication sharedApplication].applicationIconBadgeNumber=[[userInfo objectForKey:@"aps"] valueForKey:@"badge"];

Ваше здоровье.

person iphonic    schedule 27.12.2016