Parse 和 Swift:didReceiveRemoteNotification 未收到带有“aps”的推送通知:“content-available”:1

Posted

技术标签:

【中文标题】Parse 和 Swift:didReceiveRemoteNotification 未收到带有“aps”的推送通知:“content-available”:1【英文标题】:Parse and Swift: Push notifications with "aps": "content-available": 1 not being received by didReceiveRemoteNotificationParse 和 Swift:didReceiveRemoteNotification 未收到带有“aps”的推送通知:“content-available”:1 【发布时间】:2014-11-03 00:12:37 【问题描述】:

我发出这样的 Parse REST API 请求

  curl -X POST \
  -H "X-Parse-Application-Id: key-here" \
  -H "X-Parse-REST-API-Key: key-here" \
  -H "Content-Type: application/json" \
  -d '
        "where": 
          "deviceToken": "token-here",
          "deviceType": "ios"
        ,
        "data": 
          "aps": "content-available": "1"
        
      ' \
  https://api.parse.com/1/push

现在,当应用打开时,设备会读取它。但是当我锁定设备并再次发出上述 curl 请求时,没有任何反应。下面是我的didReceiveRemoteNotification 函数。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 
    println("received notification")
    var remoteServer = RemoteServer()
    remoteServer.sendDataToServer  (success) -> () in
         completionHandler(UIBackgroundFetchResult.NewData)
    

只要我打开应用程序,didReceiveRemoteNotification 的内部调用就会被执行。但同样,当应用程序未打开或手机被锁定时,什么也不会发生。

这里有什么想法/建议吗?

【问题讨论】:

【参考方案1】:

我假设您正确配置了所有证书和配置文件。因为正如您所说,当应用程序处于活动状态时您会收到响应(用您的话来说它已打开)

但是当应用程序处于后台模式或您锁定设备时,您的应用程序的状态不是活动的。并且您没有收到推送通知的警报或声音。

这是因为 PAYLOAD 包含有关系统如何提醒用户或处理您发送的数据的信息。

对于每个通知,您需要编写一个 JSON 字典对象,其中包含另一个名为 "aps"

的目录

aps 包含以下内容:

    警告消息(将显示给用户)[String OR 字典]

    要标记的数字(显示在应用图标的右上角。)[数字]

    要播放的声音(它播放声音)[String] 这里你需要在应用程序包中传递声音文件的名称

如果您想在设备通知面板或锁定屏幕上显示警报或横幅,则您的 aps 必须根据其类型具有适当的值。

还有一件事

"aps": "content-available": "1"

您的 aps 包含上述 JSON。

content-available 此属性值为 1 表示:远程通知工作为 SILENT NOTIFICATION 而当 SILENT NOTIFICATION 类型的通知到达 iOS 激活您的应用程序 后台模式,您可以从中完成后台进度。 (例如:下载数据或其他过程)

这里我提供了 aps 字典的示例。

一个 aps JSON 示例,其中包括“警报、声音和徽章”ia,如下所示:

    "aps" : 

    "alert" : "This a alert",

    "badge" : 1,

    "sound" : "bingbong.aiff"


并确保您在 AppDelegate 类中正确配置了远程通知。

适用于 iOS7 及更早版本(快速)

        var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert

        UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)

对于 iOS8

        var notiType = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert

        var notiSettings:UIUserNotificationSettings
        notiSettings = UIUserNotificationSettings(forTypes:notiType, categories: nil)

        UIApplication.sharedApplication().registerUserNotificationSettings(notiSettings)
        UIApplication.sharedApplication().registerForRemoteNotifications()

希望对你有帮助。

【讨论】:

是的,我正在传递相同的 json 集。虽然,当我发送声音警报时。同样达到很好。但是当应用程序不活动时,didReceiveRemoteNotification 永远不会被调用。 didReceiveRemoteNotification 方法会在应用激活状态下推送通知到达时被调用。 如果您的应用处于 UIApplicationStateBackground 或 UIApplicationStateInactive 并且用户从通知中心打开了推送通知,则会调用 didReceiveRemoteNotification。 但根据文档,它应该在 bg 中调用,对吗? developer.apple.com/library/ios/documentation/uikit/reference/…: 按照 iOS8 文档阅读这可能会有所帮助:

以上是关于Parse 和 Swift:didReceiveRemoteNotification 未收到带有“aps”的推送通知:“content-available”:1的主要内容,如果未能解决你的问题,请参考以下文章

如何为经典的帖子和评论模型构建 Parse 数据模型? (使用 iOS、Swift、Parse)

Swift 和 Parse(以及 xCode)问题

Swift 和 Parse - PFQueryTableViewController loadingViewEnabled

使用 Swift 和 Parse 创建图像预览

使用 Swift 使用 Parse 存储和保存 Facebook 数据

Facebook 使用 Swift 和 Parse 登录到主 ViewController