Parse Server(2.6.3)本地化推送通知实现方法咨询
我之前处理过类似的Parse推送本地化需求,给你分享两个实用的实现方案,都是在云代码的afterSave触发器里就能搞定的:
方案1:利用iOS原生本地化推送机制(推荐)
这个方案借助iOS系统自带的本地化能力,不需要在云代码里维护多语言文本,只需要推送本地化key,客户端会自动根据系统语言匹配对应的字符串,非常省心。
云代码实现
在afterSave触发器中,推送时不要直接传alert字段,改用loc-key(对应客户端Localizable.strings里的key)和loc-args(如果字符串有占位符,用来传动态参数):
Parse.Cloud.afterSave("YourTargetClassName", async (request) => { // 筛选要推送的iOS设备,可根据业务需求调整条件 const installationQuery = new Parse.Query(Parse.Installation); installationQuery.equalTo("deviceType", "ios"); // 比如只推送给关联的用户:installationQuery.equalTo("user", request.object.get("user")); // 构建本地化推送 payload const pushPayload = { "loc-key": "ORDER_READY_ALERT", // 客户端本地化文件里的key "loc-args": [request.object.get("orderNumber")], // 占位符对应的动态参数 sound: "default" }; try { await Parse.Push.send({ where: installationQuery, data: pushPayload }); console.log("本地化推送发送成功"); } catch (error) { console.error("推送发送失败: ", error); } });
iOS客户端配置
在项目中创建对应语言的Localizable.strings文件,添加对应的key和文本:
- 英文(en.lproj/Localizable.strings):
"ORDER_READY_ALERT" = "Your order #%@ is ready for pickup!";
- 中文(zh-Hans.lproj/Localizable.strings):
"ORDER_READY_ALERT" = "您的订单#%@已准备好取货!";
这样iOS系统会自动根据用户的系统语言设置,加载对应的推送文本。
方案2:在云代码中根据用户语言偏好生成推送文本
如果你的推送内容是动态生成的,没办法提前在客户端本地化文件中定义,可以在云代码里根据用户的语言偏好直接生成对应语言的文本。
前置准备
首先需要在User或Installation对象中存储用户的语言设置(比如language字段,值为"en"、"zh-Hans"等),可以在用户首次打开APP时,将系统语言同步到Parse后端。
云代码实现
Parse.Cloud.afterSave("YourTargetClassName", async (request) => { const targetUser = request.object.get("user"); // 假设你的类关联了User对象 await targetUser.fetch(); // 拉取用户的语言设置 const userLang = targetUser.get("language") || "en"; // 默认英文 // 定义各语言对应的推送文本 const localizedAlerts = { "en": `Hi! Your ${request.object.get("itemName")} has been updated.`, "zh-Hans": `您好!您的${request.object.get("itemName")}已更新。`, "fr": `Salut ! Votre ${request.object.get("itemName")} a été mis à jour.` }; // 获取对应语言的文本,找不到则用默认英文 const alertText = localizedAlerts[userLang] || localizedAlerts["en"]; // 筛选推送目标设备 const installationQuery = new Parse.Query(Parse.Installation); installationQuery.equalTo("user", targetUser); installationQuery.equalTo("deviceType", "ios"); try { await Parse.Push.send({ where: installationQuery, data: { alert: alertText, sound: "default" } }); console.log("本地化推送发送成功"); } catch (error) { console.error("推送发送失败: ", error); } });
注意事项
- 方案1更适合固定模板的推送,维护成本低;方案2适合动态内容的推送,但需要定期更新
localizedAlerts对象来支持新语言。 - 确保
Installation对象的deviceType字段正确设置,避免推送到非iOS设备。
内容的提问来源于stack exchange,提问作者Sotiris Kaniras
相关产品推荐
相关产品推荐

