为啥我无法在 iOS 10 中处理收到的推送通知?

Posted

技术标签:

【中文标题】为啥我无法在 iOS 10 中处理收到的推送通知?【英文标题】:Why I'm not able to handle received push notifications in iOS 10?为什么我无法在 iOS 10 中处理收到的推送通知? 【发布时间】:2016-12-08 11:48:54 【问题描述】:

我已经导入了

import UserNotifications

和连接的代表:

UNUserNotificationCenterDelegate

并将委托设置为自我:

UNUserNotificationCenter.currentNotificationCenter().delegate = self
FIRMessaging.messaging().remoteMessageDelegate = self

最后我有了这些功能:

@available(ios 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) 
    //Handle the notification
    print("User Info = ",notification.request.content.userInfo)
    completionHandler([.Alert, .Badge, .Sound])


@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) 
    //Handle the notification
    print("User Info = ",response.notification.request.content.userInfo)
    completionHandler()

但是当我在真实设备上和后台模式下测试时,我的日志上没有任何打印。

有什么问题?

internal func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 
    print(userInfo)

    // Print message ID.
    print("Message ID: \(userInfo["gcm.message_id"]!)")


func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                 fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)         
    // Print message ID.
    print("Message ID: \(userInfo["gcm.message_id"]!)")

    // Print full message.
    print(userInfo)

【问题讨论】:

你必须使用断点调试你的代码。如果没有调用此方法 didReceiveRemoteNotification。然后你必须检查后端。 只有当我在应用程序中时它才会调试。但是当我处于后台模式时,我收到了通知,但无法处理@Amanpreet 请检查下面的答案。以及为什么要使用“didReceiveRemoteNotification”这两种方法? 【参考方案1】:

请尝试以下代码。您只需要保存数据。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> ())

     let info : NSDictionary! = userInfo as! NSDictionary

     if info != nil
      
          let aps = info["aps"] as? NSDictionary
          UserDefaults.standard.set(aps, forKey: "aps")
       
   

并在您想使用的地方使用用户默认值。

【讨论】:

查看***.com/questions/39490605/… 我已经更新了我的答案。你可以在这里查看***.com/questions/41035878/… 你肯定必须调用完成句柄3r ??【参考方案2】:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 
  let info = userInfo as! [String : AnyObject]
  let aps = info["aps"] as? NSDictionary
  print(aps)
 

【讨论】:

以上是关于为啥我无法在 iOS 10 中处理收到的推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

反应本机ios目标c,无法在前台接收推送通知

当我的应用程序进行电池优化时,为啥我无法收到推送通知?

如何在具有多个登录用户的 iOS 设备上处理推送通知?

IOS 在生产环境中没有收到推送通知

iOS 10 iPhone 7 键盘在收到通知时消失

当收到 IOS 13 SDK 的通知时,啥是推送工具包的替代方案来处理终止状态