检测用户点击本地通知

Kha*_*inn 7 ios uilocalnotification

我会定期显示我的本地通知.

UILocalNotification *notification = [[UILocalNotification alloc]init];
[notification setAlertBody:@"Test test"];
[notification setUserInfo:@{@"test": @"test"}];
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
Run Code Online (Sandbox Code Playgroud)

我需要检测回来的通知,我打算在这里写.

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
Run Code Online (Sandbox Code Playgroud)

无论用户点击通知还是自动呼叫前台,它总是调用该功能.

所以,我分开使用它.

if (application.applicationState == UIApplicationStateActive)
Run Code Online (Sandbox Code Playgroud)

当我显示通知中心时,它变为InActive.但是,它仍然调用didReceiveLocalNotification.我无法区分用户是否点击通知中心的通知或是因为我的定期发布通知.

我怎么才能真正知道我在didReceiveLocalNotification中点击通知(来自InActive State或Background State)?

Srđ*_*nić 8

假设我正确地理解了你的问题,我偶然发现了同样的障碍,无法找到一个超级干净的解决方案.

那么以下方法的情况

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
Run Code Online (Sandbox Code Playgroud)

被调用,applicationState等于UIApplicationStateInactive在两种情况下发生:

  1. 应用程序位于前台,通知刚刚被触发
  2. 通知已经被解雇,通知中心被拉下来,用户点击了通知

区分这两种情况的一种方法是检查通知的fireDate:

notification.fireDate.timeIntervalSinceNow < 0.5
Run Code Online (Sandbox Code Playgroud)

如果这个表达式为真,那很可能是第一个案例发生了.如果表达式为false,则第二种情况很可能发生.

此解决方案取决于系统无延迟地发送通知和/或用户不够快,以便在通知触发后500ms内点击通知中心的通知.我不确定发射延迟的可能性有多大.我想如果设备处于某种处理负载下是可能的.

我希望有一个更清洁的解决方案,希望有人会分享它.


Abh*_*nav 5

首先,请阅读Apple文档:

用户点击iOS 8通知中的自定义操作按钮.在这种情况下,iOS会调用 application:handleActionWithIdentifier:forRemoteNotification:completionHandler:application:handleActionWithIdentifier:forLocalNotification:completionHandler:.在这两种方法中,您都会获得操作的标识符,以便您可以确定用户点击的按钮.您还可以获得远程或本地通知对象,以便您可以检索处理该操作所需的任何信息.

用户点击警报中的默认按钮或点击(或点击)应用图标.如果点击默认操作按钮(在运行iOS的设备上),系统将启动应用程序并且应用程序调用其委托 application:didFinishLaunchingWithOptions:方法,传入通知有效内容(用于远程通知)或本地通知对象(用于本地通知).尽管 application:didFinishLaunchingWithOptions:不是处理通知的最佳位置,但此时获取有效负载使您有机会在调用处理程序方法之前启动更新过程.

其次,您可以通过以下方式区分didReceiveLocalNotification:是从活动状态还是非活动状态调用:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    UIApplicationState appState = UIApplicationStateActive;
    if ([application respondsToSelector:@selector(applicationState)])
        appState = application.applicationState;

    if (appState == UIApplicationStateActive)
    {
    }
    else
    {
    }
}
Run Code Online (Sandbox Code Playgroud)