Подтвердить что ты не робот

Могут ли уведомления Apple Push Push отправлять больше параметров, чем предупреждение и звук?

У меня есть несколько метаданных, которые мне нужно связать с push-уведомлением.

Например, user no, id сообщения.

Могу ли я отправлять больше параметров, чем поддерживает Apple:

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

Возможно ли это?

4b9b3361

Ответ 1

Да. В разделе "Руководство по программированию Push Notification" "Полезная нагрузка уведомлений" в нем указано

Поставщики могут указывать пользовательские значения полезной нагрузки вне пространства имен APS, зарезервированных Apple. Пользовательские значения должны использовать структурированные и примитивные типы JSON: словарь (объект), массив, строку, число и логическое значение. Вы не должны включать информацию о клиентах в качестве пользовательских данных полезной нагрузки. Вместо этого используйте его для таких целей, как настройка контекста (для пользовательского интерфейса) или внутренних показателей. Например, пользовательское значение полезной нагрузки может быть идентификатором сеанса для использования клиентским приложением мгновенного сообщения или отметкой времени, когда поставщик отправил уведомление. Любое действие, связанное с предупреждающим сообщением, не должно быть разрушительным - например, удаление данных на устройстве.

Итак, ваша полезная нагрузка может выглядеть как

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

Далее на этой же странице приведен ряд примеров, демонстрирующих это.

Ответ 2

Конечно. Вы можете отправлять пользовательские параметры в виде полезной нагрузки с уведомлением push push. Как Кевин Баллард сказал, что полезная нагрузка будет выглядеть выше. Но помните одну вещь, которую всегда имеете дело с push-уведомлением. В соответствии с ограничениями на ядро ​​push-уведомления максимальный размер, разрешенный для полезной нагрузки для уведомлений, составляет 256 байт; Apple Push Notification Service отказывается от любого уведомления, которое превышает это. Поэтому, пожалуйста, обратите внимание на это, когда вы добавите дополнительные данные в уведомление.

Ответ 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":

Ответ 4

Вот как я отправляю свой собственный ключ/значения на основе этого урока

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 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 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)
        }
    }
}