Unity接入谷歌推送FCM

2024-03-25 05:10
文章标签 谷歌 推送 unity 接入 fcm

本文主要是介绍Unity接入谷歌推送FCM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

自2014年Firebase被Google收购以来,其已成为Google移动平台的主要产品。

FCM已完全替代谷歌自己的GCM作为安卓手机的首要推送服务(当然这只针对海外,国内厂商机器默认是没有安装谷歌服务的,且大部分手机完全不支持安装)。

海外Push通道

push整个推送环节中,push通道是决定整个发送率和到达率的关键一步,push通道的稳定会影响整个push推送的质量。

海外push通道类型主要分为:FCM通道(由 Google 提供的推送服务)、厂商通道和长连接通道,三个通道各自有各自的特点,下面进行详细介绍

  • FCM通道:即Firebase 云消息传递,是由Google 提供的推送服务
    由于海外手机大都具有google服务,所以fcm通道是一个优先选择的通道,可以提升整个push推送的到达率。fcm通道发送到用户手机上主要有两种方式,一种是通知,一种是透传。通知的特点是发给用户通过手机系统发到用户设备上,不会拉起app进程,app进程不在一般也能收到,所以push消息的到达率较高,但是通知不能自定义样式,只能使用系统的默认的样式。透传的特点是发送时fcm通道拉起app Push进程,然后将对应的消息透传给客户端,客户端根据对应的消息类型进行展示,透传的好处是客户端完全可以自定义push的样式,增强push的点击率

  • 厂商通道:厂商通道主要是包括小米、华为、oppo等手机厂商通道
    手机终端厂商推出的推送服务,通过接入厂商SDK,内部服务端可以将消息推送到手机系统的服务端,再下发至客户端内部的厂商SDK,由操作系统进行相应展示,点击后唤起相应APP,这样可以避免APP进程被杀死后消息无法触达用户。但是在海外手机厂商通道没有国内做的完善,一般稳定性不是很高,到达率相对较低,且目前手机厂商通道的消息只能走系统通知,不能走透传自定义push样式,另外海外华为push通道没有回执数据,导致无法统计整个链路完整的数据。但是厂商通道在海外是对fcm通道的一个补充,当fcm通道不稳定和消息丢失后,或者部分手机没有google服务即没有fcm通道时,可以采取厂商通道进行补充发送,提升整体的push到达率

  • 长连接通道
    是建立用户设备与服务端的一条链路,可以进行消息数据推送,通过长连接也可以进行APP状态监控,所以长链接推送一定要保证app长连接没有断开,即app进程活着。长连接推送的好处是app消息的到达率较高,一般可以达到95%以上,但是坏处是长连接断掉,整个通道都不可用,所以需要业务团队需要投入大量的研发资源去避免app的长连接进程不被操作系统杀死,进行app进程的保活。

更多内容请参考:海外产品push搭建全流程

接入流程

官方文档: 使用 Untiy 设置 Firebase Cloud Messaging 客户端应用 已经有了很详尽的客户端接入流程,包括Android和iOS。

接入一些注意项

笔者在接入Android过程中遇到以下一些问题需要特别拎出来说明以下:

  • FirebaseMessaging.TokenReceive事件回调中获得Firebase分配给你的FCM token,用户可以把该token透传到自己的服务端,以便做差异化推送。且需要注意的是只有FCM第一次初始化成功才会收到TokenReceive的回调,后续启动手机不再获得,所以客户端用户需要自己处理token缓存。另外若用户卸载重新安装App,那么会再次获得一个新的token。
  • FirebaseMessaging.MessageReceived事件回调用于处理推送消息

若是App在后台收到推送,通过点击通知栏激活App回前台,那么此时e.Message.Notification为null。若在App运行期间收到推送,那么不会在通知栏展示,这个时候回调中的e.Message.Notification不为null,用户可以通过e.Message.Notification.Title和e.Message.Notification.Body获得通知的标题和内容,进而决定是否在游戏内通过其它方式进行展示。

另外无论是后台收到推送还是运行期收到推送,经过笔者测试e.Message.Data都包含了消息的参数数据。

另外笔者有看到过一个外国友人,通过在Unity的OnApplicationPause(bool appPaused)系统函数,当appPaused为false的时候来获得FCM透传的参数信息(猜测主要用于处理App进程杀了的情况下收到push,点击通知栏的跳转处理),相关代码如下:

AndroidJavaClass unityPlayer=new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject curActivity=unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject curIntent=curActivity.Call<AndroidJavaObject>("getIntent");
string value1=curIntent.Call<string>("getStringExtra","key1")
  • 安卓FCM后面遇到了启动崩溃现象,具体情况可以参考这里的讨论:I bought a google pixel3, app crash also:Cause: null pointer dereference

iOS接入注意事项

  • iOS中FCM推送是利用Apple推送通知服务(APN) 来进行消息的发送和接收,因此还需要在iOS开发者后台及Firebase后台进行一些设置
    1.创建Identifiers时一定要启用Push Notifications
    2.创建APNs身份验证密钥
    在Certificates,identifiers&Profiles界面下的Keys选项中创建一个APNs密钥

    需要输入key名称,并确保启用 Apple Push Notifications service(APNs)
    下载该密钥,确保密钥保存好,该密钥是一次性下载
    3.上述操作好后,在Firebase后台打开项目设置->云消息传递,在iOS应用配置中的APNs 身份验证密钥下上传APNs Authentication Key, 这个文件就是上面提到的要你保存好的文件。

  • XCode中要在Signing & Capabilities中添加 Push Notifications和Background Modes两项,同时Background Modes要开启Background fetch和Remote notifications。这里和官方文档不一样,官方文档应该还是针对老版本XCode进行的说明。

  • 若不需要自动初始化,则需要在Info.plist中增加KV键值对:FirebaseMessagingAutoInitEnabled:false

参考文件:使用Firebase Cloud Messaging将推送通知发送到您的iOS应用

如何测试

可以通过Firebase的后台提供的可视化界面进行测试。包括对所有目标包名的应用推送和对指定token的用户推送。

也可以通过服务端集成的后台服务进行推送。

还可以使用Curl或者PostMan发送HTTP POST请求进行推送:https://www.jianshu.com/p/73d29b77b37c https://www.jianshu.com/p/6cf4dd76e508。

需要注意的是在国内push的达到率比较低,建议如下操作:

1,若推送多次接受不到,那么卸载重装,重新获得一个token

2,不要太频繁发送推送进行测试,也不要发送同样的推送内容。这样可能会被FCM服务器过滤掉。

3,用Firebase FCM后台进行推送测试成功率太低了,也看不到服务端是否发送成功。建议使用服务端集成或者PostMan的方式。
4,获得token需要科学上网,当使用服务器集成的方式根据token进行推送的话,若token都没有获得,那么肯定是收不到推送的。因此确保科学上网获得成功一次token并上传给服务端。笔者测试只要token上传给了服务端,后续在机器没有科学上网的情况下也是可以收到推送的。

国内安装了谷歌服务的手机能否在杀掉进程的情况下收到推送消息?

笔者通过对数量不多的国内和国外手机进行测试,发现:国内手机收不到(搜集了一些资料,获得的信息是大部分收不到);海外Pixel手机顺利收到。

补充

有个unity fcm的小demo:https://github.com/firebase/quickstart-unity/tree/master/messaging/testapp

这篇关于Unity接入谷歌推送FCM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843918

相关文章

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Android 友盟消息推送集成遇到的问题

友盟消息推送遇到的问题 集成友盟消息推送,步骤根据提供的技术文档接入便可。可是当你集成到项目中去的时候,可能并不是一帆风顺就搞定,因为你项目里面是可能集成了其他的sdk(比如支付宝,微信,七鱼等等三方的sdk)。那么这个时候,再加上友盟的消息推送sdk集成可能就会出现问题。 问题清单 友盟消息推送sdk和支付宝sdk冲突问题 后台配置了消息推送,也显示发送成功,但是手机没有收到消息通知

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源,你需要向加载方法传递一个键或键列表。键可以是以下对象之一: Address:包含你分配给资源的地址的字符串。Label:包含分配给一个或多个资源的标签的字符串。AssetReference Obj

在Unity环境中使用UTF-8编码

为什么要讨论这个问题         为了避免乱码和更好的跨平台         我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本,默认是看不到在VS中的编码格式,下面我介绍一种简单快