Detect user tap on local notification

Khant Thu Linn picture Khant Thu Linn · Oct 6, 2015 · Viewed 8.9k times · Source

I show my local notification like this periodically.

UILocalNotification *notification = [[UILocalNotification alloc]init];
[notification setAlertBody:@"Test test"];
[notification setUserInfo:@{@"test": @"test"}];
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

I need to detect back that notification and I plan to write here.

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

It always call that function whether user tap on notification or it automatically call in foreground.

So, I separate using this.

if (application.applicationState == UIApplicationStateActive)

When I show notification center, it become InActive. But, it still call didReceiveLocalNotification. I can't differentiate whether user tap on notification from notification center or because of my periodic posting notification.

How can I really know that I tap on notification (Either from InActive State or Background State) in didReceiveLocalNotification?

Answer

Srđan Stanić picture Srđan Stanić · Jun 18, 2016

Assuming that I understood your issue correctly, I stumbled on the same obstacle and couldn't find a super clean solution.

So the situation where the following method

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

is called and applicationState is equal to UIApplicationStateInactive happens in two cases:

  1. the app is in the foreground and the notification has just been fired
  2. the notification has been fired some time ago, notification center is pulled down and user tapped on the notification

One way to distinguish these two cases is to check the notification's fireDate:

notification.fireDate.timeIntervalSinceNow < 0.5

If this expression is true, it's very likely that the first case happened. If the expression is false, it's very likely that the second case happened.

This solution depends on the system delivering the notification without delay and/or the user not being fast enough to click the notification in the notification center under 500ms since the notification's firing. I'm not sure how likely is it for a firing delay to happen. I guess it's possible if the device is under some kind of processing load.

I hope there is a cleaner solution, hopefully someone will share it.