Локализация push-уведомлений отображается на языке отправляющего устройства, а не на принимающем. стриж - PullRequest
0 голосов
/ 27 июня 2019

Я перевожу свое приложение, и у меня возникла проблема с удаленными уведомлениями. Следующая документация

Хранение локализованного контента в вашем приложении

Если вы используете постоянный набор сообщений для своих уведомлений, вы может хранить локализованные версии текста сообщения в вашем приложении и используйте ключи loc-key и loc-args в вашей полезной нагрузке, чтобы указать, какие сообщение для отображения. Ключи loc-key и loc-args определяют сообщение содержание уведомления. Когда присутствует, локальная система ищет файлы Localizable.strings приложения для строки ключа, соответствующей значение в loc-key. Затем он использует соответствующее значение из файл строк в качестве основы для текста сообщения, заменяя любые значения заполнителя со строками, указанными в ключе loc-args. (Вы также можете указать строку заголовка для уведомления, используя ключи title-loc-key и title-loc-args.)

У меня есть NSLocalizedString для заголовка, подзаголовка и тела. Проблема в том, что когда я отправляю уведомление с английского устройства, я получаю удаленное уведомление на английском на итальянском устройстве. Я храню все пары Localized key:value в файле Localizable.string, так как я понял, что это работает, при получении уведомления значения из текущего языка устройства должны быть взяты из файла Localizable.string и отображены. Я делаю то же самое для всех щенков оповещения, и там он отлично работает, но при удаленных уведомлениях он сохраняет язык отправляющего устройства. Я использую FCM для удаленных уведомлений, поэтому я могу пропустить передачу некоторого значения в полезную нагрузку. Вы видите что-то пропущенное в полезной нагрузке? Большое спасибо.

static func sendPushNotification(to receiverToken: String, title: String, subtitle: String, body: String) {
        print("PushNotifications.sendPushNotification Started")
        let serverKey = firebaseServerKey
        let url = NSURL(string: "https://fcm.googleapis.com/fcm/send")

        let postParams: [String : Any] = [
            "to": receiverToken,
            "mutable_content": true,
            "content_available": true,
            "priority": "high",
            "notification": [
                //                    "badge" : 1, sendig the badge number, will cause aglitch
                // receiving device localized parameters
                "title_loc_key" : title,
                "subtitle_loc_key" : subtitle,
                "body_loc_key" : body,
                "sound" : true, // or specify audio name to play
            ],
            "data" : [
                "data": "ciao",
            ]
        ]

        let request = NSMutableURLRequest(url: url! as URL)
        request.httpMethod = "POST"
        request.setValue("key=\(serverKey)", forHTTPHeaderField: "Authorization")
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

        do {
            //                request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: JSONSerialization.WritingOptions())
            request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: [.prettyPrinted]) // working
            print("My paramaters: \(postParams)")
        } catch {
            print("Caught an error: \(error)")
        }

        let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
            if let realResponse = response as? HTTPURLResponse {
                if realResponse.statusCode != 200 {
                    print("Not a 200 response")
                }
            }




            if let posData = data {
                if let postString = String(data: posData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) as String? {
                    print("POST: \(postString)")
                }
            }
        }

        task.resume()
    }

Эта функция вызывает:

PushNotifications.sendPushNotification(to: customerFcmToken, title: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_TITLE", comment: ""), orderId), subtitle: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_SUBTITLE", comment: ""), UserDetails.fullName!), body: String(format: NSLocalizedString("ORDER_DELETED_PUSH_BODY", comment: "") , customerName))

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Я понял, ты звонишь

PushNotifications.sendPushNotification(to: customerFcmToken, title: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_TITLE", comment: ""), orderId), subtitle: String(format: NSLocalizedString( "ORDER_DELETED_PUSH_SUBTITLE", comment: ""), UserDetails.fullName!), body: String(format: NSLocalizedString("ORDER_DELETED_PUSH_BODY", comment: "") , customerName))

И вы делаете локализацию вместо отправки ключей для локализации.

0 голосов
/ 27 июня 2019

Я отправляю ответ, чтобы составить хорошее резюме для других, спотыкающихся об этом.Основная проблема, как указано в принятом ответе, заключалась в том, что я передавал «локализованный» String вместо «справочного» * ​​1002 * для локализации, чтобы получить значения из правильного Localizable.string файла.Поскольку мои Localizable.string строки имеют формат, loc-args также необходимо передать с полезной нагрузкой, чтобы поменять местами заполнители для значений.У меня были они в форме %1@, %2@ и т. Д., Но правильная форма проста и понятна %@.Поэтому после внесения изменений код:

static func sendPushNotification(to receiverToken: String, title: String, titleArgs: [String], subtitle: String, subtitleArgs: [String], body: String, bodyArgs: [String]) {
        print("PushNotifications.sendPushNotification Started")
        let serverKey = firebaseServerKey
        let url = NSURL(string: "https://fcm.googleapis.com/fcm/send")

        let postParams: [String : Any] = [
            "to": receiverToken,
            "mutable_content": true,
            "content_available": true,
            "priority": "high",
            "notification": [
                //                    "badge" : 1, sendig the badge number, will cause aglitch
                // receiving device localized parameters
                "title_loc_key" : title,
                "title_loc_args" : titleArgs,
                "subtitle_loc_key" : subtitle,
                "subtitle_loc_args" : subtitleArgs,
                "body_loc_key" : body,
                "body_loc_args" : bodyArgs,
                "sound" : true, // or specify audio name to play
            ],
            "data" : [
                "data": "ciao",
            ]
        ]

        let request = NSMutableURLRequest(url: url! as URL)
        request.httpMethod = "POST"
        request.setValue("key=\(serverKey)", forHTTPHeaderField: "Authorization")
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

        do {
            //                request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: JSONSerialization.WritingOptions())
            request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: [.prettyPrinted]) // working
            print("My paramaters: \(postParams)")
        } catch {
            print("Caught an error: \(error)")
        }

        let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
            if let realResponse = response as? HTTPURLResponse {
                if realResponse.statusCode != 200 {
                    print("Not a 200 response")
                }
            }

            if let posData = data {
                if let postString = String(data: posData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) as String? {
                    print("POST: \(postString)")
                }
            }
        }

        task.resume()
    }

и называется:

PushNotifications.sendPushNotification(to: customerFcmToken, title: "BOOKING_DELETED_PUSH_TITLE", titleArgs: [self.bookingId], subtitle: "BOOKING_DELETED_PUSH_SUBTITLE", subtitleArgs: [UserDetails.fullName!], body: "BOOKING_DELETED_PUSH_BODY", bodyArgs: [customerName])

Еще раз спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...