当前位置:

Enjoy出海 >

新闻资讯>

技术私房课 | 应用出海,如何实现推送语言和通道的国际化适配

技术私房课 | 应用出海,如何实现推送语言和通道的国际化适配
Enjoy出海小编(刚)  ·  Oct 25, 2021 6:20:53 PM

国际化适配的基础概念介绍

 

基础概念

图片

Locale类

1.language——国际现有语言的缩写,通常由两到三个字母小写字母组成,比如 zh 表示中文,en 表示英文。

2.country(region)——国家或地区,国家用2个大写字母表示,区域用3个数字表示。比如 CN-中国,US-美国,030-Eastern Asia(东亚)。

3.script ——用来区分语言的脚本,比如 Hans 表示简体中文,Hant 表示繁体中文。

4. variant 和 extension —— 使用较少,一般用来表示某个语言的变体、某种方言等。

configuration

配置类, 里面除保存了应用Locale的配置信息之外,还包含了应用的字体、屏幕方向、屏幕密度等。安卓系统根据这个类别生成启动资源配置表,根据资源配置表找到对应的资源进行加载。

ContextThemewrapper

Activity 继承的上下文,里面封装了复写 Configuration 的方法,可借助此方法进行国际化适配。

values文件夹命名规则

图片

res/values是安卓的资源文件夹,字符串资源都放在该目录下面。一般情况下默认生成的values文件夹并不带后缀,如果想进一步适配,添加其他的语言,需要在res目录下创建带有语言后缀的values文件夹。

如:values-EN-RUS

values是固定前缀,en代表语言代码,对应Locale类中的language,通常用两到三个小写字母表示。r是国家和区域代码前的固定前缀。US是国家或区域代码,这里指美国。values-en-rUS指该文件夹下对应的是美式英语语言包,如果是英式英语,用 values-en-rUK 表示。

values匹配规则

图片

安卓7.0之前和7.0之后,对values的匹配规则并不一样。7.0之前,系统首先根据语言和区域代码进行精确匹配,如果匹配失败,再尝试根据语言代码匹配,仍然失败时使用默认值。7.0之后,在精确匹配失败的情况下,会优先尝试匹配同语言下其他区域的资源包,都失败时才使用默认值。

比如上图示例中,某用户将语言设置fr_CH,即瑞士法语。该应用配置了五种类型的语言包:默认语言包(en)、de_DE、es_ES、fr_FR、it_IT。

7.0之前的系统首先去匹配fr_CH这个文件夹,因为应用没有配置,所以匹配失败;系统继续尝试匹配 fr 文件夹,同样失败,最终使用默认语言包en, 即英语。这就导致本来期望使用法语的用户,最终展现出来的语言却是英语,用户有可能完全不识别。安卓7.0之后对此做了优化,首先还是根据用户配置进行精确匹配,但失败后会继续尝试匹配fr下其它区域的语言包,最终匹配 fr_FR 语言包,展示给用户的仍然是法语,只不过稍有地域区别,更人性化了。

国际化相关类关系图

图片

如前所述,ContextThemeWrapper是所有activity的基类,该类里封装了资源类Resource对象,Resource又持有了包含应用各项配置的配置类 Configuration,通过 Configuration 可以获取到国际化配置相关类 Locale。

融云 IMKit SDK 国际化适配的基本思路来源于上面的关系图。在 IMKit 中抽象出所有activity的基类 BaseActivity,在activity创建时会回调基类的 attachBaseContext() 方法,重载此方法,将自定义的国际化适配后的 context 传给系统。另外需要在自定义的 context 中覆写applyOverrideConfiguration(),将配置了当前应用语言的configuration设置给系统。

2

基于融云SDK快速国际化适配

 

融云提供的能力

 

融云IMKit  SDK在国际化适配方面提供了以下能力:

1 IMKit 内置页面,如会话列表、消息列表、输入区等,已经适配了中文、英文、阿拉伯语,可以一键快速切换。

2.提供了国际化适配基础类 RongBaseActivity 和 LangUtils, 将应用各页面继承 RongBaseActivity, 并将应用语言通过 LangUtils 提供的方法进行保存和读取,既可进行中英文和阿拉伯语的适配。

3.IMKit提供的能力为应用级别的语言切换,即系统语言切换时,不会触发应用语言变更。

应用层适配工作

如果应用层需要做适配工作,该怎么做?

1.参考官网文档,集成 IMKit SDK。

2.在应用 res 目录下增加对应语言包,增加语言包时会根据语言自动遵从当前语言习惯。

3.应用 activity 集成 RongBaseActiviy.

4.应用设置页面切换语言时,调用 LangUtils 的 saveLocale() 方法保存语言配置。

通过以上步骤,即可完成应用的中英文和阿拉伯语的适配工作。

图片

展示效果图:左侧是默认没有切换语言之前的效果,布局为从左往右。右侧切到阿拉伯语后,布局自动切换为从右往左。

3

推送语言的国际化适配

 

 

推送语言适配

 

推送是 IM长连接断开时进行消息通知的一种机制。推送所使用的语言和前面的 IMKit适配完全独立,需要单独适配。

针对推送语言的适配,融云提供了非常简便的方法,利用 API setPushLanguageCode() 可以把推送语言设置成任何国际化语言。融云服务端会根据此配置读取对应的语言包,推送相应语言的通知。

利用融云 SDK 的推送模板功能,也可以对单条消息进行推送语言的配置。首先在融云开发者后台配置不同的推送模板,每个模板支持设置多种语言。在客户端发送消息时,利用 Message里的 PushConfig 类指定推送模板,并通过 setPushLanguageCode() 指定推送语言,即可指定该消息的推送展示语言和内容。

其他语言如何适配

除了中英文、阿拉伯语,您也可以将应用语言适配为其它国际化语言。基本思路和前面一样,总体分为以下几步:

1.添加对应的语言包。除了在应用目录的 res 下添加对应语言包,您还需对IMKit 中的语言资源进行翻译,增加对应的语言包。

2.所有activity继承基类,在基类中返回一个自定义的上下文,在该上下文中配置应用语言(通过前文Configuration和 Locale的方法),系统会根据应用上下文读取对应的语言配置进行资源加载,从而达到自动切换的能力。

3.封装Locale帮助类,对语言设置进行保存和读取。

4.监听系统语言设置变化事件,根据业务需求决定是否切换 Locale。

5.监听消息发送事件,配置 pushContent、pushConfig等参数。

6.根据业务需求,配置特殊场景下的推送模板。

图片

点击了解融云IM+RTC+X “全”通信解决方案

FCM 推送适配
 
 
1

融云推送配置及发送流程

 

 

推送背景

 

由于FCM在国内无法使用,国内手机厂商纷纷推出自建频道,如华为、小米、VOVI、OPPO都有自建系统级别的推送,导致在不同手机上使用厂商原有能力时,需要逐一适配。

融云为了减少开发者的工作量,与主流厂商提前对接,通过简单的配置及调用,就可以实现所有主流厂商的推送通道的对接,包括 FCM。

除此之外,为了适配一些没有原生推送系统的安卓手机,融云通过自建的系统级别长链接通道,来确保推送能力。

推送通道筛选策略

1.结合应用的推送配置和手机操作系统,优先选择该操作系统的原生推送通道。如小米 Rom 使用小米推送,EMUI 使用华为推送...

2.手机操作系统没有系统级推送时,使用融云自建推送通道。

3.如果应用配置了 FCM 推送,将 FCM 通道也加入筛选后的列表。

4.根据筛选后通道列表,调用各自 API 请求推送 token 并将 deviceId 和 token 发送给服务器。

5.服务器根据客户端出访 IP,确认最终使用通道。如果为海外 IP,且应用在融云开发者后台进行了正确配置,则在响应中答复客户端,确认使用 FCM。

图片

推送配置流程图

融云推送平台和IM平台

图片消息推送流程图

 

融云推送平台和IM平台到底是个什么关系呢?如图所示,用户A发消息给B用户,消息首先到达融云消息服务器,消息服务器会判断当前用户B是否在线,也就是消息通道是否存活状态。

如果用户在线,直接把这条消息发送给用户B;如果不在线,这条消息会转到融云推送服务器,融云推送服务器根据之前配置过程中所存储推送通道类型,把当前推送发给第三方推送服务器,如果提前配置使用FCM推送,消息就会发给FCM融云服务器,然后通过FCM云服务器,推到客户端B上,以通知形式展现出来。

2

FCM推送集成及介绍

 

配置FCM推送

1.注册 Google 开发者账号,然后登录到 Firebase 控制台创建 Firebase 项目。

图片https://console.firebase.google.com/?hl=zh-cn

2.记录项目配置参数

3.登录融云开发者后台,填写刚才创建配置中的密钥类型

4.记录FCM推送密钥

5.登录融云开发者后台→服务管理→ 应用标识→设置推送→Android→Google(FCM),配置 FCM 相关参数。

图片

(图)融云后台

推送方式

 

图片

(图)安卓线路框架图

 

通知消息方式

有时被称为“显示消息”。此类消息由FCM、SDK解析处理,直接发到通知面板进行展示,通知展示不可以自定义。

透传消息方式

也称为数据消息方式,FCM、SDK接收到推送数据后不进行解析,回调给融云 SDK,融云SDK对监测数据进行解析,然后调用系统发送通知方法展示通知。

国内例如华为、小米等第三方基本上都支持这两种模式。

FCM处理这种类型通知消息时候,会根据前后台运行状态来决定处理和展示方式。

应用在后台的时候,由SDK在底层直接解析Message字段,然后在通知面板进行展示。而应用如果在前台但 IM链接断开,此时如果有新消息,会由融云SDK通过FCM 的回调接口,解析data字段,然后弹出通知。

图片

(图)推送方式的区别

 

FCM优先级

考虑到服务器压力等问题,FCM将所有推送消息分成两个级别:普通优先级和高优先级。

普通优先级

这是数据消息的默认优先级。应用在前台运行时,普通优先级消息会被立即传递。

当设备处于低电耗模式时,此类消息可能会被延迟传递以节省电量。

高优先级

FCM 会立即尝试传递高优先级消息,FCM 服务会唤醒休眠设备并进行通知处理。

高优先级消息通常应该会导致用户与您的应用或其通知进行互动。如果 FCM 检测到未产生此行为,系统可能会降低您的消息的优先级。

Android P 推出了应用待机分桶机制,如果应用处于非活跃或者非工作分区,FCM 会限制每日高优先级的消息数量。 

3

FCM常见问题

电池白名单

国内进行FCM调试时一般需要安装VPN,请注意将 VPN应用加入电池白名单,否则手机休眠后将接受不到推送。这是因为手机系统休眠后,即进入深度睡眠模式后,系统会限制所有应用的网络出访。也就是说,如果没有将 VPN 应用加入电池白名单,VPN 将无法联网,也就无法收到推送了。

通过adb命令(adb shell dumpsys deviceidle whitelist +<package>),可以将VPN应用加到电池白名单中,这样即使手机在深度睡眠模式下,依然可以进行网络访问,确保和 FCM 云服务器的网络畅通。

在对FCM深度睡眠模式进行调试时,如果等待应用自然进入深度睡眠会非常耗费时间,此时可通过adb命令强制手机终端进入休眠模式(强制 IDLE:adb shell dumpsys deviceidle force-idle),还可以查看手机状态(查看状态:adb shell dumpsys deviceidle),也可通过 adb 命令退出当前IDLE (IDLE:adb shell dumpsys deviceidle disable)。

另外需要注意的一点是,通常情况下应用从任务栏被移除时,融云服务器能够立即探测到,从而启用推送通道。但使用FCM 推送时,因为和客户端之间通过VPN进行了中转,所以在应用从任务栏里被移除时,虽然客户端的网络连接断开了,但服务端和VPN的链接依旧存在,导致探测不到客户端消息通道的断开行为,这时需要等待服务端5分钟后的心跳才能探测到客户端断开行为,从而启用推送通道。对于这种特殊情况,可以主动调用 IMSDK 的 disconnect() 方法断开连接,进行推送测试,以此节省大量的时间。

 

来源:扬帆出海

 


进群了解更多最新出海资讯、市场活动及合作,扫描关注下方二维码吧!

扫一扫 加入出海交流群

开通会员,查看完整内容