安卓 GCM 推送通知用于本地化应用程序。

12

我有一个支持7个国家(本地化和国际化)的单一Android应用程序。应用程序的功能和语言根据设备语言改变。

我需要为此应用程序实现GCM推送通知。

要求:

  • 是否可能通过单一GCM账号发送7种不同语言的推送通知。
  • 是否有办法在用户设备的本地语言中显示推送通知。
5个回答

12

你可以采用Ascorbin建议的方法,或者类似苹果推送通知中的实现方式:

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

您也可以像苹果那样为消息键添加参数。例如,服务器发送一个key =“NEW_MAIL_FROM”,param1 =“John”。应用程序查找该键的字符串资源(假设设备使用英语语言环境)-“您有来自{0}的消息”-并替换param1为John,显示消息“您有一封来自John的邮件”。其他语言环境的设备将显示不同语言的消息。


也可以用七种不同的语言发送消息,并在手机上决定显示哪种语言。这会增加一些开销,但推送消息本质上非常短小。 - fweigl
@Ascorbin,如果由于某种原因相关语言的消息未能到达设备(如果您在短时间内向不活动的设备发送多条消息,则可能会发生这种情况),那么您的建议将无法奏效。 - Eran
我想在一个Gcm消息中发送所有语言,但不知道它们的大小限制。 - fweigl
2
@Ascorbin 限制是4k。它可能适用于少数语言,但不具有良好的可扩展性。 - Eran
1
这对于通知消息是行不通的,因为应用程序不会处于活动状态以解释消息。 - PiersyP
显示剩余3条评论

2
你可以使用 title_loc_keybody_loc_key 来轻松本地化你的 GCM 通知。这些键在官方 GCM 文档 中列出。
更多细节可以在这里找到。

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以处理接收到的数据。

1

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


1
是的,但如果在设备令牌发送到服务器和我们决定发送用户通知之间的时间内,用户更改了语言怎么办?在服务器上,我们仍然拥有旧语言,与令牌一起在一段时间前发送,而不是当前语言。在这种情况下,应用程序可能会在用户更改区域设置时每次向服务器发送当前语言。 - Alex Bitek
真的吗,但这种情况会有多少次呢?你多久会更改手机语言? - fweigl
无论发生多少次都没关系。其他答案建议在通知中接收“键”,并使它们与本地化字符串资源匹配,这是一种更好的方法(整洁、简单且牢固)。 - German Latorre
这种方法是错误的,因为推送并不总是需要发送给发出请求的用户。假设一个用户与您分享了某些内容,并向您发送了推送通知。在这种情况下,您将开始看到他语言中的奇怪推送通知。 - garg10may
@garg10may 这个答案明确指出后端必须为每个区域设置一组已注册的设备。每个设备通过这些组与它所在的区域建立明确的连接,因此后端可以精确控制发送到哪个设备的推送。 - fweigl
显示剩余2条评论

-1
  1. 从服务器发送GCM推送(不包含任何特定语言的数据)。
  2. 作为对推送的响应,客户端使用其语言作为查询参数向服务器发起REST API调用。
  3. 服务器获取适当语言的文本并实时发送回客户端。

为什么我要每个GCM推送进行两次调用? - j2emanue
为什么这个被踩得这么多?它是一个合法的解决方案。 - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接