如何检测用户是不是采取了本地通知或远程通知的操作?

Posted

技术标签:

【中文标题】如何检测用户是不是采取了本地通知或远程通知的操作?【英文标题】:How to detect if user has taken action local notification or remote notification?如何检测用户是否采取了本地通知或远程通知的操作? 【发布时间】:2017-12-15 06:20:58 【问题描述】:

我在我的应用程序中显示本地和远程通知。现在有一种情况,如果通知是本地的,那么我想采取不同的行动,或者如果通知是远程的,那么我想采取一些不同的行动。

直到 ios 9 我使用下面的代码来检测通知是本地的还是远程的。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 


    if launchOptions?[UIApplicationLaunchOptionsKey.localNotification] != nil 
        // Do what you want to happen when a remote notification is tapped.
    
    return true
  

但在 iOS 10 中,这种方法已被弃用,所以现在我如何确保通知是本地的还是远程的?

【问题讨论】:

检查这个:useyourloaf.com/blog/local-notifications-with-ios-10 您可以查看我已更新的答案。希望这会有所帮助。 【参考方案1】:

对于使用UserNotifications 框架的iOS 10 及更高版本。

检查用户是否对通知采取了行动。可以遵循UNUserNotificationCenterDelegate,实现userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:

检查是否是远程通知。您可以检查trigger 的类型,因为远程通知触发器是UNPushNotificationTrigger

这是代码...

#pragma mark - UNUserNotificationCenterDelegate

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void (^)(void))completionHandler 

    if ([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) 
        // User did tap at remote notification
    

    completionHandler();

【讨论】:

【参考方案2】:

UNMutableNotificationContent 中添加userInfo,如下所示:

content.userInfo = ["isLocalNotification" : true]

现在在AppDelegate 中设置UNUserNotificationCenterDelegatedidFinishLaunchingWithOptions 中,如下所示:

UNUserNotificationCenter.current().delegate = self

然后实现UNUserNotificationCenterDelegatedidReceive response方法:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 

        print(response.notification.request.content.userInfo)
    

在输出中你会得到类似下面的东西:

[AnyHashable("isLocalNotification"): 1]

您可以使用isLocalNotification 键识别本地通知。

【讨论】:

【参考方案3】:

您可以参考以下链接。你会得到你的答案。如果没有,请告诉我:

Local and Push Notifications in IOS 9 and 10 using swift3

关于通知类别的更多信息:

要识别本地和远程通知,您可以为通知对象分配一个标识符。 UIMutableUserNotificationCategory 在 iOS 10 中已弃用,因此请使用 UNNotificationCategory 为通知分配标识符。

请参阅以下链接以将标识符分配给通知:

https://developer.apple.com/documentation/uikit/uimutableusernotificationcategory/ https://developer.apple.com/documentation/usernotifications/unnotificationcategory

【讨论】:

【参考方案4】:

对于 iOS 10+ 本地通知,您需要使用 UNUserNotificationCenter

你可以参考教程here

对于 Apple 文档,请参阅 here

【讨论】:

我已经用过UNUserNotificationCenter了。我如何知道从本地通知或远程通知启动的应用我想区分它们

以上是关于如何检测用户是不是采取了本地通知或远程通知的操作?的主要内容,如果未能解决你的问题,请参考以下文章

检测应用程序处于后台/非活动状态时是不是触发了本地通知

如何检测用户点击的 iOS 远程通知?

swift ios检查本地通知是不是被解除[重复]

如何在固定时间发送推送通知?

iOS:日常重复动作的定时器或本地通知

iOS 在收到静默远程通知后发送本地通知