Php 如何国际化/本地化FCM推送通知,尤其是主题?
我想使用Firebase向本地化的Android和iOS设备发送推送通知 我意识到,我们并没有一个真正的解决方案来向订阅的主题发送本地化消息。 假设我有一条信息“朝鲜领导人威胁关岛”,我想发送给订阅“新闻”主题的人,有1000人订阅(他们都说不同的语言)。 我希望Firebase在请求FCM令牌时记录设备的区域设置,并且我可以只发送每个区域设置的消息数组到此主题,并让FCM/Firebase处理,如下所示: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
{
"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中进行服务器端变量替换)