利用GoogleFirebase为安卓应用提供系统级消息通知

原文链接

欢迎大家对于本站的访问 - AsterCasc

前言

发系统级消息通知(即使你的应用程序没有在工作,也可以发送消息给用户)是相对比较麻烦的事情,因为这涉及到和手机操作系统的交互。一般保证能稳定发送的做法有两个,一个是一个一个手机厂商对接过去,但这种一般都需要你的应用程序上架应用上架相应的应用商店,对于个人开发者来说还是比较麻烦的,但是也是最稳定的企业级方案。另一个是接第三方处理,比如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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值