如何国际化/本地化您的FCM推送通知,尤其是主题?

时间:2017-08-10 15:18:26

标签: php android ios firebase firebase-cloud-messaging

我想使用Firebase向本地化的Android和iOS设备发送推送通知。

我意识到我们并没有真正有一个解决方案来发送已订阅主题的本地化消息。 假装我有消息'朝鲜领导人威胁关岛'我想发送给订阅了“新闻”的人们。主题和1000人订阅(他们都说不同的语言)。 我希望Firebase在请求FCM令牌时记录设备区域设置,并且我可以将每个区域设置的消息数组发送到此主题,并让FCM / firebase处理,如下所示:

{
  "default_message": "North Korea leader threatens Guam",
  "en_US": "North Korea leader threatens Guam",
  "en_GB": "North Korea leader threatens Guam",
  "es_MX": "Líder de Corea del Norte amenaza a Guam",
  "fr_FR": "Le chef de la Corée du Nord menace Guam",
  "de_DE": "Nordkorea-Führer droht Guam"
}

我看过一些可能使用title_loc_key,body_loc_key的引用,但没有看到一个关于请求如何的好例子。这两个参数也意味着它们可能只是用作翻译查找键,应用程序也必须在本地存储和查找,而且我无法向人们发送全新的袖口本地化消息(因为翻译必须预先存储在应用程序中,例如' april_newsletter_text')? 不确定它是如何工作的,只是在那里抛出一些想法。

注意:我使用php库来发送firebase推送通知(Laravel-FCM)。我相信我们团队中的一些开发人员也对该库进行了一些扩展以执行一些自定义任务,所以如果有办法直接通过GCM(gcm-http.googleapis.com/gcm/)而不是FCM,那么我可以添加。

1 个答案:

答案 0 :(得分:0)

如果您使用的是 firebase,那么您的 JS worker 中就有这样的代码

let messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function (payload) {
# Here  the callback for web push notification

通常,您会在此回调中显示消息。任务是对其进行本地化。因此,您可以只向用户发送有关新消息的消息。获取本地化消息,然后将其显示给用户。在获取时,您将获得 Accept-Language http 标头,或者您可以发送用户 ID。这是我的项目中的示例:

messaging.setBackgroundMessageHandler(function (payload) {

    let data = [];
    try {
        if (payload.data && payload.data.data) {
            data = JSON.parse(payload.data.data);
        }
    } catch (e) {
        Sentry.captureException(e);
    }
    let query = Object.keys(data).map(k => encodeURIComponent(k) + '=' + encodeURIComponent(data[k])).join('&');

    return fetch(self.location.origin + "/web-push/run.json?" + query)
        .then(function (response) {
            # ........................
            #.  Skipped working with https status codes code.
            # ........................
            return response.json();
        })
        .then(function (response) {
            #
            #  Here we have an localised response from the server
            # 
            if (response) {
                return self.registration.showNotification(response.title, {
                    priority: "high",
                    tag: 'renotify',
                    requireInteraction: true,
                    body: response.description,
                    icon: response.icon,
                    image: response.image,
                    url: response.link,
                    click_action: response.link,
                    data: {
                        url: response.link
                    },
                    vibrate: [500, 110, 500, 110, 450, 110, 200, 110, 170, 40, 450, 110, 200, 110, 170, 40, 500]
                })
            }
        })
        .catch(function (err) {
            Sentry.captureException(err);
        });
});