原文链接
前言
发系统级消息通知(即使你的应用程序没有在工作,也可以发送消息给用户)是相对比较麻烦的事情,因为这涉及到和手机操作系统的交互。一般保证能稳定发送的做法有两个,一个是一个一个手机厂商对接过去,但这种一般都需要你的应用程序上架应用上架相应的应用商店,对于个人开发者来说还是比较麻烦的,但是也是最稳定的企业级方案。另一个是接第三方处理,比如JPush或者Getui之类的,这种就相对简单很多,但是需要一定资金支持
由于我们这里只是演示推送功能,就以Google Firebase Message进行举例,本质上的工作原理和代码大同小异。这里的三台移动设备测试完成,其他更多移动设备没有条件测试,如果消息推送无法收到,请检测首先是否允许访问外网,其次是否包含谷歌商店应用,这两者不是必须的,但是对于某个手机型号可能需要。然后检查是否允许应用推送,不同手机厂商需求不同,一般需要打开通知,以及自启动,以及调整应用程序省电策略
实现
原理
对于通知消息而言,即使你的应用程序被用户滑掉、强行结束,系统层(Google Play Service)仍然能收到消息,并在状态栏展示通知。此时消息并不依赖你的应用进程,而是由Google Play Service作为后台常驻进程和谷歌服务器进行长连接通信。当应用程序启动时(或者在你期望时,或者谷歌服务端判断token需要更换时),会根据你的客户端配置文件向谷歌服务器请求一个token,我们将这个token和用户信息传入服务端。当该用户需要收到消息时候,则利用用户token发送给谷歌服务端,此时谷歌服务端会根据该token检索到你的指定机器和其进行交互,并发送消息
关于FCM的具体工作逻辑可以参考Firebase Cloud Messaging,示例程序参考Firebase Cloud Messaging Quickstart
谷歌应用注册
在Firebase设置页,遵循过程创建Firebase项目,这里已经很详细了,我就不再赘述了。创建项目应用完成后,我们在项目页面选择你的项目,左侧导航栏点出项目设置,常规选项卡中选择刚才创建的应用,并下载相应google-services.json,记录项目编号。将其放在应用侧build.gradle.kts同级目录下,对于构建侧build.gradle.kts添加:
plugins {
//...
id("com.google.gms.google-services") version "4.4.2" apply false
}
应用侧build.gradle.kts添加:
plugins {
//...
id("com.google.gms.google-services")
}
并在其中添加依赖(如果只使用FCM功能,那么这些依赖就足够了):
implementation(platform("com.google.firebase:firebase-bom:33.12.0"))
implementation("com.google.firebase:firebase-messaging")
关于google-services.json是否安全,是否可以暴露在平台上,可以参考Is google-services.json safe from hackers以及Google App Check
客户端消息获取
一般我们需要先向用户获取通知权限,一般的处理方法为:
@SuppressLint("PermissionLaunchedDuringComposition")
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
@ExperimentalPermissionsApi
@Composable
actual fun CheckAppNotificationPermission(
requestPermission: @Composable (() -> Unit) -> Unit
) {
val context = LocalContext.current
val notificationPermission = rememberPermissionState(
permission = Manifest.permission.POST_NOTIFICATIONS
)
if (!notificationPermission.status.isGranted) {
requestPermission {
val intent = Intent().apply {
action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
}
context.startActivity(intent)
}
}
}
这里我们是KMP项目,所以写法有点奇怪,但是本质上都是判断用户是否授权通知,当用户点击授权的时跳通知设置页面。然后在AndroidManifest.xml添加:
<service
android:name="biz.FMessagingService"
android:exported="false">
<intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
当前前面是需要加通知相关权限设定的:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
对于biz.FMessagingService相关内容:
var globalGoogleFirebaseToken = ""
var updateGoogleFirebaseTokenFun: (String) -> Unit = {
}
fun reloadGoogleMessageToken() {
FirebaseMessaging.getInstance().token.addOnCompleteListener {
task ->
if (task.isSuccessful)


3198

被折叠的 条评论
为什么被折叠?



