本地化应用程序的 Android GCM 推送通知

Posted

技术标签:

【中文标题】本地化应用程序的 Android GCM 推送通知【英文标题】:Android GCM push notification for localization application 【发布时间】:2013-02-19 13:13:14 【问题描述】:

我有一个安卓应用程序,它支持 7 个国家(本地化和国际化)。应用程序功能和语言会根据设备区域设置而更改。 我需要为此应用程序实现 GCM 推送通知。 要求:

是否可以使用单个 GCM 帐户以 7 种不同的语言发送推送通知。 有没有办法以他们的设备本地语言显示推送通知。

【问题讨论】:

【参考方案1】:

您可以采用 Ascorbin 建议的方法,也可以实现类似于 Apple 在推送通知中的方法:

您的服务器可以发送带有参数的 GCM 消息,该参数是消息的键。您的 android 应用程序必须为每个可能的键包含应以 7 种语言中的每一种显示的字符串(使用 strings.xml 的多个副本)。然后你的应用程序中的 GCM 接收器将从服务器获取密钥并获取与其匹配的资源字符串(它会自动获取与设备的语言环境匹配的字符串)。这样您就不必担心服务器中的本地化问题。 这种方法的缺点是您的所有消息都必须在您的应用中预定义。

您也可以像 Apple 一样为消息键添加参数。 例如,服务器发送一个 key = "NEW_MAIL_FROM" 和 param1 = "John"。应用程序找到该键的字符串资源(假设设备使用英语语言环境)-“您有来自 0 的消息”-并将参数替换为 John,显示消息“您有来自 John 的消息”。具有不同区域设置的设备将以不同的语言显示消息。

【讨论】:

一个人也可以只用 7 种不同的语言发送消息,然后决定在手机上显示哪一个。会产生一些开销,但推送消息本质上非常短。 @Ascorbin 如果由于某种原因相关语言的消息无法到达设备,您的建议将不起作用(如果您在短时间内向非活动设备发送了许多消息,则可能会发生这种情况)。 我的意思是在一条 Gcm 消息中发送所有语言。虽然不知道这些的大小限制。 @Ascorbin 限制为 4k。它可能适用于少数语言,但不能很好地扩展。 这不适用于通知消息,因为应用程序将无法解释消息。【参考方案2】:

您可以实现该服务器端,在 GCM 注册后发送令牌,同时发送设备区域设置。然后通过本地化消息立即通知用户。

有效负载是“排序”的东西,通过它传递这么多信息不是一个好主意。


另一方面,如果您有固定的消息,您可以使用:

private void handleMessage(Intent intent) 
    // server sent key-value pairs
    String name_of_resource = intent.getExtra("message_id");

    int id = getResources().getIdentifier(name_of_resource, "string", getPackageName());
    if (id != 0) 
         String text = getString(id); // the text to display
         // generates a system notification to display here
    

请参阅http://developer.android.com/google/gcm/gcm.html#received_data 以处理接收到的数据。

【讨论】:

【参考方案3】:

当设备在您的服务器上注册时,让它们发送区域设置。因此,您可以拥有设备的区域设置组并以相应的语言发送消息。

【讨论】:

是的,但是如果在设备令牌被发送到服务器和我们决定向用户发送通知的时间之间,用户更改了他的语言怎么办?在服务器上,我们仍然有旧语言,与令牌一起发送了一段时间,而不是当前语言。在这种情况下,应用程序可能会在每次用户更改区域设置时向服务器发送当前语言。 是的,但这种情况多久会发生一次?您多久更换一次手机的语言? 无论多久,它都会发生。其他答案建议在通知中接收“密钥”并使其与本地化字符串资源匹配,这是一种更好的方法(简洁、简单且防弹)。 这种方法是错误的,bcoz push 不需要总是发送给发出请求的用户。假设一个用户与您分享了一些东西,并且推送被发送给了您。在这种情况下,您会开始看到他的语言中的古怪推文。 @garg10may 答案明确指出后端必须为每个语言环境保留一组注册设备。每个设备都通过这些组明确地连接到它的语言环境,因此后端可以精确控制它发送到哪个设备的推送。【参考方案4】:

您可以使用title_loc_keybody_loc_key 轻松本地化您的GCM 通知。这些密钥在官方 GCM docs 中列出。

更多详情请见here。

【讨论】:

【参考方案5】:
    从服务器发送 GCM 推送(不包含任何语言特定数据)。 作为对推送的响应,客户端使用其语言作为查询参数向服务器发出 REST api 调用。 服务器获取适当语言的文本并实时发送回客户端。

【讨论】:

为什么每次 GCM 推送都要打两个电话。 为什么这个投票这么低?这是一个合法的解决方案

以上是关于本地化应用程序的 Android GCM 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GCM 不在 android 设备中提供推送通知?

有时一些 android 用户没有通过 GCM 收到推送通知

在 Android 上使用 GCM 推送通知

Android GCM:通知关闭后重复推送

某些 android 设备未收到 GCM 推送通知

从通知托盘按下推送通知时,Android GCM 应用程序崩溃