iOS 10.0 * 在前台处理推送通知

Posted

技术标签:

【中文标题】iOS 10.0 * 在前台处理推送通知【英文标题】:iOS 10.0 * Handle Push notification in foreground 【发布时间】:2017-07-13 09:10:49 【问题描述】:

如果我在 ios 10.0 中实现推送通知的方法

@available(iOS 10.0, *)

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    
        completionHandler(UNNotificationPresentationOptions.alert)

    

然后它会显示所有通知, 所以,我的问题是如何防止显示特定的推送通知,例如(在另一个设备上登录)我只处理该特定推送的代码

【问题讨论】:

见此例如***.com/questions/39382852/… 【参考方案1】:

我的推送数据是


    "aps" : 
        "alert" : 
            "id" : 2091
        ,
        "sound" : "chime.aiff"
    ,
    "acme" : "foo"

我使用 id 是因为我可以通过它的 id 分隔每个推送,并且基于 id 我可以决定天气是否在前台显示通知..

感谢@Anbu.Karthik 供参考 根据我的问题,即使用户没有在

中点击通知,我们也可以处理推送
   @available(iOS 10.0, *)

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    
        print("Handle push from foreground")
        let userInfo:[AnyHashable:Any] =  notification.request.content.userInfo
        let aps:NSDictionary = (userInfo[AnyHashable("aps")] as? NSDictionary)!
        let alert:NSDictionary = (aps["alert"] as? NSDictionary)!
        let id = Int(alert["id"] as! Int)
        if id == your id
            
         //Handle push without prompting alert 
        

        else
        
          //Display alert
         completionHandler(UNNotificationPresentationOptions.alert)
        
    

当用户点击通知时,会调用以下方法...

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) 

        print(userInfo)


    

【讨论】:

【参考方案2】:

根据官方文档:

// 仅当应用程序在委托上调用该方法 在前台。如果方法未实现或处理程序 没有及时调用,则不会通知 呈现。应用程序可以选择接收通知 以声音、徽章、警报和/或通知列表的形式呈现。 该决定应基于 否则通知对用户可见。

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);

所以回答你的问题,如果你想阻止显示通知,要么不实现此方法,要么不调用处理程序。

希望对你有帮助。

【讨论】:

我的问题是关于应用程序何时处于前台,我想阻止特定通知而不是全部 在这种情况下,您可以检查通知负载,如果您想隐藏特定通知,请不要调用处理程序。

以上是关于iOS 10.0 * 在前台处理推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如果应用程序在前台,iOS8 禁用推送通知

iOS 11 中的推送通知

ios在后台处理推送通知

应用在前台运行时收到 iOS 推送通知

iOS 10 推送通知点击处理程序

ios 应用未运行时推送通知单击处理程序