26

我有几条需要与推送通知相关联的元数据。

例如用户号、消息 ID。

我可以发送比苹果支持的参数更多的参数吗:

 {aps =     {
    alert = joetheman;
    sound = default;
};}

这可能吗?

4

4 回答 4

50

是的。在推送通知编程指南部分通知有效负载它指出

提供者可以在 Apple 保留的 aps 命名空间之外指定自定义有效负载值。自定义值必须使用 JSON 结构化和原始类型:字典(对象)、数组、字符串、数字和布尔值。您不应将客户信息作为自定义有效负载数据包含在内。相反,将其用于设置上下文(用于用户界面)或内部指标等目的。例如,自定义有效负载值可能是供即时消息客户端应用程序使用的对话标识符,或者是标识提供者何时发送通知的时间戳。与警报消息相关的任何操作都不应具有破坏性——例如,删除设备上的数据。

所以你的有效载荷可能看起来像

{
    "aps": {
        "alert": "joetheman",
        "sound": "default"
    },
    "message": "Some custom message for your app",
    "id": 1234
}

在同一页面的下方有许多示例可以证明这一点。

于 2012-06-28T00:41:41.323 回答
6

当然。您可以使用苹果推送通知将自定义参数作为有效负载发送。就像凯文巴拉德所说的那样,有效载荷将如上所示。但是请记住,您始终在处理推送通知的一件事,根据苹果对推送通知的限制,通知有效负载允许的最大大小为 256 字节;Apple Push Notification Service 拒绝任何超出此范围的通知。因此,当您要向通知添加更多数据时,请考虑这一点。

于 2012-06-28T04:38:18.270 回答
3

不允许将自定义标签放在 aps 标签内。以下是文档中的说明:

Providers can specify custom payload values outside the Apple-reserved aps namespace. Custom values must use the JSON structured and primitive types: dictionary (object), array, string, number, and Boolean.

因此,在您的情况下,您应该执行以下操作:

{
    "aps": {
        "alert": "Hello Push",
        "sound": "default"
    },
    "People": {
        "Address": "Your address here",
        "Name": "Your Name here",
        "Number": "XXXXXXXXXX"
    }
}

因此,您可以通过在主 JSON 中而不是在“aps”中查找它的键来读取您的自定义有效负载:

于 2017-03-21T09:51:20.860 回答
1

这是我根据本教程发送自定义键/值的方式

func sendPushNotification(to token: String, title: String, body: String, messageId: String, fromUsername: String, fromUID: String, timeStamp: Double) {

    let urlString = "https://fcm.googleapis.com/fcm/send"
    let url = NSURL(string: urlString)!

    // apple's k/v
    var apsDict = [String: Any]()
    apsDict.updateValue(title, forKey: "title")
    apsDict.updateValue(body, forKey: "body")
    apsDict.updateValue(1, forKey: "badge")
    apsDict.updateValue("default", forKey: "sound")

    // my custom k/v
    var myCustomDataDict = [String: Any]()
    myCustomDataDict.updateValue(messageId, forKey: "messageId")
    myCustomDataDict.updateValue(fromUsername, forKey: "username")
    myCustomDataDict.updateValue(fromUID, forKey: "uid")
    myCustomDataDict.updateValue(timeStamp, forKey: "timeStamp")

    // everything above to get posted
    var paramDict = [String: Any]()
    paramDict.updateValue(token, forKey: "to")
    paramDict.updateValue(apsDict, forKey: "notification")
    paramDict.updateValue(myCustomDataDict, forKey: "data")

    let request = NSMutableURLRequest(url: url as URL)
    request.httpMethod = "POST"
                                                     // ** add the paramDict here **
    request.httpBody = try? JSONSerialization.data(withJSONObject: paramDict, options: [.prettyPrinted])

    // send post ...
}

这是我从 AppDelegate 中的通知中读取所有内容的方法。下面的方法是 AppleDelegate 中的一个委托方法。使用本教程

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

    let userInfo = response.notification.request.content.userInfo

    if let userInfo = userInfo as? [String: Any] {

        readPushNotification(userInfo: userInfo)
    }

    completionHandler()
}

func readPushNotification(userInfo: [String: Any]) {

    for (k,v) in userInfo {
        print(k)
        print(v)
    }

    // my custom k/v
    if let messageId = userInfo["messageId"] as? String {
        print(messageId)
    }

    if let fromUsername = userInfo["username"] as? String {
        print(fromUsername)
    }

    if let fromUID = userInfo["uid"] as? String {
        print(fromUID)
    }

    if let timeStamp = userInfo["timeStamp"] as? String {
        print(timeStamp)
    }

    // apple's k/v
    if let aps = userInfo["aps"] as? NSDictionary {

        if let alert = aps["alert"] as? [String: Any] {

            if let body = alert["body"] as? String {
                print(body)
            }

            if let title = alert["title"] as? String {
                print(title)
            }
        }

        if let badge = aps["badge"] as? Int {
            print(badge)
        }
    }
}
于 2019-07-02T16:05:02.903 回答