APNS无声远程通知未触发 - SWIFT 3

时间:2017-11-08 19:48:27

标签: ios swift swift3 apple-push-notifications ios11

场景:

1)应用程序在前景中的静音或正常有效负载:

  • 什么都没发生

2)应用程序在后台的静音有效负载:

  • 什么都没发生

3)App在背景中的正常有效负载:

  1. 如果用户单击通知以打开应用程序。

    • 触发application:didReceiveRemoteNotification:fetchCompletionHandler
  2. 如果用户单击应用程序图标打开应用程序:

    • 什么都没发生
  3. 这些是我用于APN的有效负载:

    正常有效负载:

    {  
      "aps":{  
        "alert":"andre test",
        "badge":0,
        "sound":"default",
        "content-available":1
      },
      "acme-syncalarm":"true"
    } 
    

    无声有效负载:

    {  
      "aps":{  
        "content-available":1
      },
      "acme-syncalarm":"true"
    }
    

    我使用此代码实现了远程推送通知:

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    
        print("Receeeeeeeeived: \(userInfo)")
        UIApplication.shared.applicationIconBadgeNumber = 11
    
        completionHandler(.newData)
    }
    

    我还实现了这个来检查应用程序是否正在从kill状态恢复(正如我在某些问题中所读到的那样),但代码永远不会进入print(rn)行。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
            if let rn = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] {
                print(rn)
            }
     }
    

    编辑1 - 我还在应用程序的后台模式中启用了远程通知。

    我需要做些什么才能涵盖“什么都不会发生”的情景? 1,2和3.2?

1 个答案:

答案 0 :(得分:1)

有些说明:

  • "如果用户点击应用程序图标打开应用程序:没有任何反应" < - 那是预料之中的,因为您没有直接与任何通知进行互动。想象一下,如果你有5个通知到达。你怎么知道你应该处理哪个通知......

  • 普通有效负载没有任何名为content-available的密钥。所以这又是一个无声的通知。你能先看到我的答案here吗?

一些建议:

  • 确保您已在后台模式中启用了远程通知。像这样:

enter image description here

  • 另请参阅here。 iOS 11初始版本对于静默通知来说是错误的。确保您拥有测试的最新版本,否则它将无法正常工作。如果您有iOS 10设备,那么首先尝试使用...

  • 进行测试
  • 确保您的设备上有后台应用刷新和通知。要了解如何操作,请参阅我的链接答案。

  • 您是自己创建有效负载还是使用FireBase?如果您正在使用Firebase,则某些键会发生变化......您必须相应地进行调整。

  • 确保您将某个对象设置为delegate的{​​{1}},例如:

UNUserNotificationCenterDelegate

UNUserNotificationCenter.current().delegate = delegateObject

here

复制的代码

如果您不这样做,那么当应用处于前台时,您将无法显示任何通知。这应解决应用程序处于前台并且您已收到正常远程通知的问题。