一、需求场景
允许多台设备(终端)同时登陆同一个账户,在同一台设备上允许多个账户切换登陆。其实在这里只有两种设备,分别是android和ios。当应用中的聊天、评论回复,订单相关操作执行的时候,要按照业务给用户设备推送在线消息和离线消息,同时在通知栏中点击消息卡片需要跳转到对应的应用页面。这种app级别的通知消息一般使用单播来进行推送,也就是指定用户进行消息推送,还有一种业务是营销需求,这种消息需要同时推送给多个用户或者全部用户,这里一般要使用到广播或者组播服务。在正式部署服务之前,需要先测试推送服务是否正常,友盟提供消息推送的开发(测试)模式和生产模式,在不同模式下,消息推送的限制有所不同,这个在实际应用或者测试的时候要多加注意。
二、问题分析
1. android或ios如何集成友盟实现简单消息推送?
- 参考友盟官方文档:https://developer.umeng.com/docs/67966/detail/99884
- 直接下载后台服务、android、ios原生集成demo,参考并更改:https://gitee.com/organizations/umengplus/projects
- 注意在测试的时候,将应用的消息通知权限打开,否则是收不到消息的
- 在集成过程中并且实现简单消息推送功能或许会遇到一定坎坷,但按照文档来,实现起来也并不特别困难,这里不再赘述
2.deviceToken如何变化?如何在业务中和用户绑定?
设备deviceToken在变化后,要及时更新到数据库中,否则就会导致消息发送,设备接收不到。而且这里有个问题,A设备的原本devicetoken01在卸载重装后变成了devicetoken02,如果此时你调用接口向devicetoken01推送消息,友盟接口不会给你报错,接口依旧执行成功,这就导致你要加入一些逻辑来判断何时devicetoken会对实际应用业务来讲变成冗余的。
- 设备卸载过,又重新安装,token可能会变化。
- 设备没有SD卡,设备id变化导致的device token变化。
- device token 依赖外部存储,当存储权限有变化的时候会有几率变化。
- 当App缓存被清除的时候,有几率会变化。
- 应用双开的时候,devicetoken也会不一样。
3.deviceToken如何在业务中和用户绑定?
-
多设备登陆同一个账户:下面的思路可以解决,除非是卸载应用情况,产生了冗余记录。
-
多账户登陆同一台设备: 一般情况下,devicetoken是不变的,下面的思路可以解决,除非是卸载应用情况,产生了冗余记录。
在实际应用中,业务推送消息的核心就是,先找到对应用户,然后找到该用户绑定的有效devicetoken,接着调用友盟api定向推送消息,然后设备可以收到消息。deviceToken在每次umeng SDK初始化的时候都会生成,可以先缓存起来,留作备用。
-
缓存devicetoken;
-
在授权登陆成功后,将用户与devicetoken绑定起来,持久化到数据库中;
-
指定用户推送消息;
-
用户退出登陆时,将用户devicetoken关系表记录删除;
-
卸载应用时,将关系表记录删除
- 卸载监听事件
- 动态注册广播
- 静态注册广播
我无论是使用何种注册监听事件,在卸载应用的时候都无法接收到通知,尝试了一些操作,都无效,后来放弃了。所以我这出现了一个问题,就是在卸载应用的时候,数据库中会出现冗余关系表记录,.这是一个缺憾,类似下面这样,有解决办法可以私信我,谢谢。
- 卸载监听事件
4.如何实现离线消息推送?
虽然有查到相关信息说友盟通道可以在一定程度上推送离线消息,但是实际应用中发现效率很低,甚至无效。一般情况下:
- 对于安卓设备,集成厂商通道(小米、华为、荣耀、魅族、oppo、vivo)来实现离线消息推送。
- 对于ios设备,由于是独立封闭系统,按照友盟文档配置代码即可实现。
5.通知栏消息如何点击跳转到对应页面?
我项目的架构是springboot后台api服务,android和ios原生代码,前端使用react native套壳,原生代码只需要加载react native打包的bundle文件即可加载,比较方便适配原生代码。
这里我说一下我的实现思路,以安卓为例(ios思路一样):
-
在接收离线消息的时候,自定义Activity类继承安卓SDK的Activity,实现UmengNotifyClick方法——点击事件触发的方法
-
拦截传递消息,将消息传输到MainActivity。因为业务页面在bundle文件中,不在原生代码,无法直接跳转到对应业务页面。
-
原生向RN通信,处理消息,做对应页面跳转。
6.单播和广播消息如何测试?
-
单播、广播:可以通过java代码或者其他语言代码直接调用友盟api实现,也可以在友盟平台上编写信息测试。
-
注意:在produtionMode为false(测试模式)下,走广播测试的时候,需要先将devicetoken添加到上图中的测试设备中,并且数量有限制,等之后应用正式上线后,消息走生产模式,就不用顾虑这个问题了,否则消息推送不到。
7.离线消息推送有何限制?
在集成厂商通道发送离线消息的时候,一般安卓厂商提供的测试模式下,消息配额是两个,这个需要注意,具体限额要查看对应厂商平台文档。
三、厂商通道
在集成友盟的手机厂商通道时,需要注册对应厂商账号并进行实名认证,以获取相应的开发者权限。具体来说,如果您想使用厂商的推送服务,您需要在厂商开发者平台注册并申请成为企业开发者,然后提交相应的企业认证信息。如果您只是想使用厂商的登录或分享功能,则不需要注册成为企业开发者,可以使用个人开发者账号即可。
需要注意的是,不同的厂商对开发者的要求可能会有所不同,具体可以参考对应厂商的开发文档和申请流程。
-
下面是我之前集成厂商通道时搜集的材料,仅供参考,可以和友盟提供的配置的文档一起看。
集成OPPO消息推送厂商通道的前提条件 1.应用需要上架到OPPO应用市场; 2.需要在OPPO开放市场认证,且单独申请接口; 3.登录OPPO开放平台,注册账号,认证成为开发者; 4.点击【开发服务】里面的推送服务,进入推送平台申请推送接口; 是的,要使用OPPO消息推送服务,您需要先将应用程序(APK)上线在OPPO应用商店。这是因为OPPO开放平台只能为已在应用商店上线的应用提供消息推送服务。在申请消息推送服务时,您需要在开放平台上填写相应的应用信息,并提交审核。审核通过后,您将获得appKey和appSecret等必要参数,以便在应用中进行集成和调用。注意,申请消息推送服务可能需要一定的时间,具体时间取决于OPPO开放平台审核的进度,您需要提前规划好上线和审核的时间。 集成小米推送厂商通道的前提条件 1.拥有小米开放平台账号,并通过实名认证。 2.在小米开放平台上创建应用,并获取相应的 App ID 和 App key。 3.已经在应用中嵌入小米推送 SDK(包括进行初始化、注册、开启推送等操作)。 4.应用必须在小米应用商店或其他合法的应用商店上架并获得相应的版本号。 是的,要使用小米推送服务,您需要先将应用程序(APK)上线在小米应用商店。这是因为小米推送服务只能为已在应用商店上架的应用提供消息推送服务,您需要在开发者后台创建应用并上传应用程序包等相关信息,并提交审核。如果审核通过,您就可以使用小米推送服务了。 需要注意的是,申请消息推送服务可能需要一定的时间,具体时间取决于小米应用商店的审核进度,您需要提前规划好上线和审核的时间,同时也需要遵守小米应用商店的相关规定和要求,如应用的信息必须真实准确、不得含有违法内容等。 集成vivo消息推送厂商通道的前提条件 1.拥有vivo开发者账号,并通过实名认证。 2.在vivo开发者平台创建应用,并获取相应的 App ID 和 App Key。 3.应用必须已经在vivo应用商店或其他合法的应用商店上架,并获得相应的版本号。 4.应用需要集成vivo推送 SDK ,并正确进行初始化、注册、开启推送等操作。 5.此外,开发者需要遵守vivo开发者平台的相关规定和要求,如应用的信息必须真实准确、不得含有违法内容等。未经授权或违规操作可能会导致应用无法使用消息推送服务或被禁用。 集成荣耀消息推送厂商通道的前提条件 1.在荣耀开发者联盟平台注册开发者账号,并完成实名认证。 2.在开发者联盟平台创建应用,获取对应的 App ID 和 App Key。 3.将应用程序(APK)上线在荣耀应用市场或其他合法的应用商店,获得版本号。 4.应用必须集成荣耀推送 SDK ,并正确进行初始化、注册、开启推送等操作。 5.此外,开发者需要遵守荣耀开发者联盟平台的相关规定和要求,如应用的信息必须真实准确、不得含有违法内容等。未经授权或违规操作可能会导致应用无法使用消息推送服务或被禁用,甚至可能面临法律风险。 集成魅族消息推送厂商通道的前提条件 1.在魅族开放平台注册开发者账号,并完成实名认证。 2.创建应用并获取对应的 App ID 和 App Key。 3.应用程序必须上架在魅族应用商店或其他合法的应用商店,获得版本号。 4.应用程序必须集成魅族的推送 SDK 并正确进行初始化、注册、开启推送等操作。 5.需要注意的是,如果开发者选择使用魅族提供的厂商通道,还必须将应用程序提交至厂商通道审核,并通过审核才能使用此功能。开发者还需要遵守魅族开放平台的相关规定和要求,如开发者必须保证其应用及推送的内容不违反法律法规和政策,不侵犯他人合法权益等。未经授权或违规操作可能会导致应用无法使用消息推送服务或被禁用,甚至可能面临法律风险。 集成华为厂商通道的消息推送服务 注册并登录“开发者联盟”账号,并创建应用。在创建应用时,需要填写应用的基本信息,包括应用名称、应用图标、应用包名等。 获取应用对应的 App ID 和 App Secret。在“开发者联盟”中选择自己创建的应用,在“应用信息”页面中即可获取。 在华为开发者联盟平台注册并实名认证,获取华为开发者账号。同时,需要在“开发者联盟”中,将华为开发者账号绑定到对应的应用之下。 在华为开发者联盟平台中创建一个“应用”,获取该应用的 App ID 和 App Secret。 在友盟后台中开启华为厂商通道服务,并输入华为开发者平台分配的 App ID 和 App Secret。 集成友盟推送 SDK,并根据集成文档完成初始化、注册推送服务、开启推送等操作。 编写移动应用调用消息推送 API 的代码,并设置推送消息的内容和目标(比如推送到所有已安装该应用的用户或某个特定标签的用户或指定用户等)。 运行移动应用,并查看是否能够正常接收到推送消息。 需要注意的是,此过程中还需在华为开发者平台中完成签名文件上传、应用授权配置以及相关 API 申请等操作。此外,由于不同的厂商通道所需的配置参数和集成方式可能略有不同,具体操作步骤需要参考各自的集成文档。
集成华为厂商通道
-
注册并登录“开发者联盟”账号,进入应用服务——>开发服务——>PUSH——>创建项目——>创建应用。
-
填写关键信息【应用名称、应用包名】,应用包名和应用名称分别与本地项目的应用包名(applicationId)和项目名称保持一致。
-
进入项目——>常规,查看APPID和Client Sercert并记录值
-
添加证书指纹,使用本地AndroidStudio软件Generate Signed Bundle/APK工具按照华为文档生成jks文件
-
将jks文件放在android项目的app的根目录下
-
使用和本地android项目gradle中相同版本的jdk来解析jks文件
-
keytool -list -v -keystore C:\TestApp.jks
-
得到证书指纹SHA256码,放到对应配置中
-
遵循友盟中的华为厂商集成文档,将配置放到本地项目中对应的配置文件
-
集成好之后,使用EMUI系统的手机测试离线消息推送功能
-
集成成功之后,在项目控制台可以看到华为的token
-
在“开发者联盟”平台也可以根据这个token来做消息通知测试
-