Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何国际化/本地化FCM推送通知,尤其是主题?_Php_Android_Ios_Firebase_Firebase Cloud Messaging - Fatal编程技术网

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

Php 如何国际化/本地化FCM推送通知,尤其是主题?,php,android,ios,firebase,firebase-cloud-messaging,Php,Android,Ios,Firebase,Firebase Cloud Messaging,我想使用Firebase向本地化的Android和iOS设备发送推送通知 我意识到,我们并没有一个真正的解决方案来向订阅的主题发送本地化消息。 假设我有一条信息“朝鲜领导人威胁关岛”,我想发送给订阅“新闻”主题的人,有1000人订阅(他们都说不同的语言)。 我希望Firebase在请求FCM令牌时记录设备的区域设置,并且我可以只发送每个区域设置的消息数组到此主题,并让FCM/Firebase处理,如下所示: { "default_message": "North Korea leader t

我想使用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\u loc\u key、body\u loc\u key的参考资料,但没有看到一个关于请求外观的好例子。这两个参数还意味着它们可能只是用作翻译查找键,应用程序还必须在本地存储和查找,我不能向用户发送全新的即兴本地化消息(因为翻译必须事先存储在应用程序中,如“四月时事通讯”文本)? 不知道它是怎么工作的,只是想了想


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

如果您使用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);
        });
});

注意:这是我在StackOverflow上发现的关于这个的最多的一个问题,它并没有真正解决标题中的一般问题(认为它更多地回答了正文中关于“当应用程序处于特殊状态时如何本地化”的问题):您是对的,如果您想使用title\u loc\u键和其他键,您需要在应用程序包中添加本地化内容。看见FCM不允许开箱即用的自动推送通知本地化。当他们安装app n register user时,我们知道用户的区域设置。因此,我们在CMS中本地化消息的翻译,移动api(CMS中)可以查找您要发送给该特定用户的消息的翻译并发送它。我们还使用我们自己的主题系统(通过链接到我们的主题表)与FCM的主题,因为我们需要结合许多AND和OR(我听说FCM只能做2个操作符)。所以,如果你想发送一条消息给主题(大陆=='NorthAmerica'| |'SouthAmerica'&&project='ProjectA'| | B')中的用户,我们会找到该主题中的所有用户,然后发送消息给他们。上述方法的缺点是500个用户==500条FCM消息,而FCM主题只有一条FCM消息。因为每个用户的翻译是不同的。特别是如果我们的消息中包含变量,如“Hello${first_name},请单击此处在${todays_date}上使用今天的应用程序”(我们还在CMS中的移动api中进行服务器端变量替换)