iOS 10静音推送通知不会触发后台应用程序

时间:2016-11-03 16:09:59

标签: apple-push-notifications ios10

我有一个应用程序,我正在尝试接收和处理SILENT推送通知。

我正在注册APN,如下所示:

UNUserNotificationCenter.currentNotificationCenter().delegate = self
UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert]) {(granted, error) in
    if granted {
        application.registerForRemoteNotifications()
    }
}

实现:

func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
    // Handle notification
}

func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    // Handle notification
}

该应用有UIBackgroundModes fetchremote-notification

APN内容如下:

{
    "aps":{
        "content-available":1,
        "badge":0
    },
    "action":"shareDelete",
    "shareId":633
}

当应用程序位于前台时,会在收到通知时触发userNotificationCenter(centre:withCompletionHandler:willPresentNotification),但当应用程序处于后台时,则不会发生任何事情。

我可以通过更改徽章编号看到收到的APN,但在应用中没有触发任何内容。

我错过了什么?

(也在Apple开发论坛上提问)

4 个答案:

答案 0 :(得分:2)

方法

func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
    // Handle notification
}

当用户点击通知或在Apple Watch上查看时调用:

  

要求您的应用知道用户为给定通知选择了哪个操作。

您需要实施旧方法

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

}

答案 1 :(得分:0)

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
NSLog(@"%@",center.delegate);

检查 center.detegate 是否仍然是 AppDelegate,就我而言,它已更改为 X****Delegate 之类的内容,因此,willPresentNotificationdidReceiveNotificationResponse 永远不会调用。

答案 2 :(得分:-1)

您是否正在设置minimumBackgroundFetchInterval?如文档中所述:

  

可以启动另一次后台提取之前必须经过的最小秒数。此值仅供参考,并不表示获取操作之间预期的确切时间。

     

应用程序的默认提取间隔是UIApplicationBackgroundFetchIntervalNever。因此,您必须在应用程序获得后台执行时间之前调用此方法并设置获取间隔。

因此,如果您没有设置此功能,那么您的提取处理程序将永远不会在后台调用。

答案 3 :(得分:-3)

如果您的应用程序在后台运行或未运行,则应用程序通知的唯一方法是用户选择与您的通知相关联的操作。

请参阅本地和远程通知指南。

  

当您的应用未运行或处于后台时,系统会使用您指定的互动自动发送本地和远程通知。如果用户选择操作或选择其中一个标准互动,系统会通知您的应用用户选择。然后,您的代码可以使用该选择来执行其他任务。 如果您的应用在前台运行,则会将通知直接发送到您的应用。然后,您可以决定是安静地处理通知还是提醒用户。

     

要响应通知的传递,您必须为共享的UNUserNotificationCenter对象实现委托。您的委托对象必须符合UNUserNotificationCenterDelegate协议,通知中心使用该协议向您的应用程序发送通知信息。如果您的通知包含自定义操作,则需要委托。

这里是来源: https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/SchedulingandHandlingLocalNotifications.html#//apple_ref/doc/uid/TP40008194-CH5-SW14