Aplicativo iOS: como limpar notifications?

Eu tenho um aplicativo iOS onde alguns Push Notification são enviados para. Meu problema é que as mensagens / notifications permanecem no Centro de Notificação no iOS depois de serem tocadas. Como posso remover uma notificação da minha inscrição no Centro de Notificação na próxima vez em que o aplicativo for aberto?

Eu me deparei com posts em que as pessoas estão chamando setApplicationIconBadgeNumber para um valor zero para limpar as notifications. Isso parece muito estranho para mim, então acredito que talvez exista outra solução?

EDIT1:

Estou tendo alguns problemas para limpar as notifications. Por favor, veja meu código aqui:

 - (void) clearNotifications { [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; [[UIApplication sharedApplication] cancelAllLocalNotifications]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (launchOptions != nil) { NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (dictionary != nil) { NSLog(@"Launched from push notification: %@", dictionary); [self clearNotifications]; } } return YES; } - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo { NSLog(@"Received notification: %@", userInfo); [self clearNotifications]; } 

Estou executando o aplicativo através do Xcode. Quando o App é minimizado e inicio o App usando a notificação no Notification Center, eu posso ver no log, que o didReceiveRemoteNotification é chamado e usando breakpoints eu posso ver, que o clearNotifications foi executado. Mas ainda assim a notificação trava no Centro de Notificação. Por quê?

Muito provavelmente porque o Centro de Notificações é um recurso relativamente novo, a Apple não queria necessariamente impor um novo paradigma para limpar as notifications. Então, em vez disso, eles têm vários propósitos [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; para limpar as referidas notifications. Pode parecer um pouco estranho, e a Apple pode fornecer uma maneira mais intuitiva de fazer isso no futuro, mas, por enquanto, é o modo oficial.

Eu mesmo uso este trecho:

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

que nunca deixa de limpar todas as notifications da aplicação do Notification Center.

Apenas para expandir a resposta da pcperini. Como ele menciona, você precisará adicionar o seguinte código ao seu application:didFinishLaunchingWithOptions: method;

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Você também precisa incrementar e decrementar o crachá em seu application:didReceiveRemoteNotification: método se você estiver tentando limpar a mensagem do centro de mensagens para que quando um usuário entrar em seu aplicativo pressionando uma notificação, o centro de mensagens também será limpo, ex.

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1]; [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

Também pode fazer sentido adicionar uma chamada para clearNotifications no applicationDidBecomeActive para que, caso o aplicativo esteja em segundo plano e volte, também apague as notifications.

 - (void)applicationDidBecomeActive:(UIApplication *)application { [self clearNotifications]; } 

Atualização para o iOS 10 (Swift 3)

Para limpar todas as notifications locais nos aplicativos do iOS 10, use o seguinte código:

 import UserNotifications ... if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled. center.removeAllDeliveredNotifications() // To remove all delivered notifications } else { UIApplication.shared.cancelAllLocalNotifications() } 

Esse código lida com a limpeza de notifications locais para o iOS 10.xe todas as versões anteriores do iOS. Você precisará import UserNotifications para o código iOS import UserNotifications

Se você tiver notifications locais agendadas pendentes e não quiser usar cancelAllLocalNotifications para limpar as antigas no Notification Center, também poderá fazer o seguinte:

 [UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications; 

Parece que, se você definir o scheduledLocalNotifications ele limpará os antigos no Notification Center e, ao defini-lo para si mesmo, você reterá as notifications locais pendentes.

Se você está vindo aqui se perguntando o contrário (como eu estava), este post pode ser para você.

Não consegui descobrir por que minhas notifications foram apagadas quando limpei o selo … Eu manualmente incremento o selo e, em seguida, quero limpá-lo quando o usuário entra no aplicativo. Isso não é motivo para limpar o centro de notifications; eles ainda podem querer ver ou atuar nessas notifications.

O negativo 1 faz o truque, felizmente:

 [UIApplication sharedApplication].applicationIconBadgeNumber = -1; 

Talvez no caso de haver alarmes programados e emblemas de icons de aplicativos não limpos.

 NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications]; NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber]; [application cancelAllLocalNotifications]; [application setApplicationIconBadgeNumber:0]; for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) { [application scheduleLocalNotification:scheduledLocalNotification]; } [application setApplicationIconBadgeNumber:applicationIconBadgeNumber]; 

No Swift estou usando o seguinte código dentro do meu AppDelegate:

 func applicationDidBecomeActive(application: UIApplication) { application.applicationIconBadgeNumber = 0 application.cancelAllLocalNotifications() } 

Quando você tiver repetidas notifications no futuro, você não deseja cancelar essas notifications, você pode limpar o item no centro de notificação por:

 func clearNotificationCenter() { UIApplication.sharedApplication().applicationIconBadgeNumber = 1 UIApplication.sharedApplication().applicationIconBadgeNumber = 0 } 

Você não pode limpar a notificação quando seu aplicativo estiver aberto em primeiro plano, chamando o método abaixo imediatamente após receber a notificação local, caso contrário, você receberá dezenas de centenas de notifications. Talvez porque a mesma notificação se aplica novamente, e agora é a hora de triggersr, então você mantém fogo, aplica novamente, triggers, aplica …:

 [UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications; 

Quando você sai do seu aplicativo, você deve usar uma linha de código abaixo no seu método de clique do botão de logout.

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

e isso funciona perfeitamente no meu aplicativo.

Você precisa adicionar o código abaixo em seu método AppDelegate applicationDidBecomeActive .

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 

Consegui daqui . Ele funciona para o iOS 9

 UIApplication *app = [UIApplication sharedApplication]; NSArray *eventArray = [app scheduledLocalNotifications]; for (int i=0; i<[eventArray count]; i++) { UILocalNotification* oneEvent = [eventArray objectAtIndex:i]; //Cancelling local notification [app cancelLocalNotification:oneEvent]; } 
Intereting Posts