查看原文
其他

App出海使用Firebase Cloud Message(FCM)推送通知

Android独立开发 Android出海
2024-11-24

关注公众号,经常更新Android出海经验,微信添加“dev_oy”一起加GP交流群讨论出海技巧。

App推送通知已经十分常见,我们平时经常会收到不同App的各种推送消息,集成通知推送已经是一个合格App的标配模块。

产品运营都喜欢使用通知推送功能,因为其优点颇多,比如:

  • 新的产品特性及时推送用户发掘

  • 发布新版提醒用户更新App

  • 定时活动提醒

  • 引导用户点击通知栏启动App,从而提高DAU和交互时间

推送通知的实现,国内与海外发行的App需要考虑不同的方案。

国内发行的App,常见的实现方式比如,聚合各手机厂商推送功能的友盟、极光、个推等。

海外发行的App实现通知推送方式就简单了很多,那就是直接使用Firebase Cloud Message(FCM)。因为海外的手机基本都内置了Google Play Service,FCM就是Google Play Service的一个功能模块,海外App集成FCM推送通知,至少可以触达99%的用户设备

发送通知

FCM的SDK不包含创建和发送通知的功能,这部分需要我们自己实现。

在 Android 13+ 上请求运行时通知权限

Android 13 引入了用于显示通知的新运行时权限。这会影响在 Android 13 或更高版本上运行的所有使用 FCM 通知的应用。需要动态申请POST_NOTIFICATIONS权限后才能推送通知,代码如下:

class ExampleActivity : AppCompatActivity() {
private val requestPermissionCode = this.hashCode()
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { // 申请通知权限 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), requestPermissionCode) } }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == requestPermissionCode) { // 处理回调结果 } }}

创建通知渠道

从 Android 8.0(API 级别 26)开始,必须为所有通知分配渠道,否则通知将不会显示。通过将通知归类到不同的渠道中,用户可以停用您应用的特定通知渠道(而非停用您的所有通知),还可以控制每个渠道的视觉和听觉选项。创建通知渠道,代码如下:

class ExampleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val notificationManager = NotificationManagerCompat.from(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val applicationInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { packageManager.getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(0)) } else { packageManager.getApplicationInfo(packageName, 0) } val appLabel = getText(applicationInfo.labelRes) val exampleNotificationChannel = NotificationChannel("example_notification_channel", "$appLabel Notification Channel", NotificationManager.IMPORTANCE_DEFAULT).apply { description = "The description of this notification channel" } notificationManager.createNotificationChannel(minigameChannel) } }}

创建并发送通知

创建与发送通知,代码如下:

class ExampleActivity : AppCompatActivity() {
private var notificationId = 0
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate() val notificationManager = NotificationManagerCompat.from(this) ... if (notificationManager.areNotificationsEnabled()) { val notification = NotificationCompat.Builder(this, "example_notification_channel") //设置小图标 .setSmallIcon(R.drawable.notification) // 设置通知标题 .setContentTitle("title") // 设置通知内容 .setContentText("content") // 设置是否自动取消 .setAutoCancel(true) // 设置通知声音 .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) // 设置点击的事件 .setContentIntent(PendingIntent.getActivity(this, requestCode, packageManager.getLaunchIntentForPackage(packageName)?.apply { putExtra("routes", "From notification") }, PendingIntent.FLAG_IMMUTABLE)) .build() // notificationId可以记录下来 // 可以通过notificationId对通知进行相应的操作 notificationManager.notify(notificationId, notification) } }}

Firebase Cloud Message (FCM)

Firebase Cloud Message (FCM) 是一种跨平台消息传递解决方案,可让您免费可靠地发送消息。

官方接入文档:

https://firebase.google.com/docs/cloud-messaging/android/client

集成FCM

在项目下的build.gradle中添加如下代码:

buildscript {
repositories { google() mavenCentral() }
dependencies { ... classpath("com.google.gms:google-services:4.3.14") }}

在app module下的build.gradle中添加代码,如下:

dependencies {    // 使用Firebase Andorid bom(官方推荐)    implementation platform('com.google.firebase:firebase-bom:31.1.0')     implementation 'com.google.firebase:firebase-messaging'
// 不使用bom implementation 'com.google.firebase:firebase-messaging:23.1.1'}

在Firebase后台获取项目的google-services.json文件,放到app目录下。

要接收FCM的消息推送,需要一个自定义Service继承FirebaseMessagingService,代码如下:

class ExampleFCMService : FirebaseMessagingService() {
override fun onNewToken(token: String) { super.onNewToken(token) // FCM生成的令牌,可以用于标识用户的身份 }
override fun onMessageReceived(message: RemoteMessage) { super.onMessageReceived(message) // 接收到推送消息时回调此方法 }

在AndroidManifest中注册Service,代码如下:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <service android:name="com.minigame.fcmnotificationsdk.MinigameFCMService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application> </manifest>

修改通知其他配置

可以在AndroidManifest中通过meta-data进行配置,常见配置如修改默认图标,修改默认颜色,避免自动初始化等,代码如下:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <!--修改默认图标--> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification" />
<!--修改默认颜色--> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/color_blue_0083ff" />
<!--避免自动初始化--> <meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> </application></manifest>

测试通知推送

在Firebase后台中,选择Messageing,并点击制作首个宣传活动,如图:

选择Firebase 通知消息,如图:

输入标题和内容后,点击发送测试消息,如图:

输入在FirebaseMessagingService的onNewToken方法中获取到的token,并点击测试,如图:

如果配置都没问题的话,那么恭喜你,已经收到通知了。

想了解更多关于App出海技巧,关注公众号!进GP交流群从小白秒变老司机!

继续滑动看下一个
Android出海
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存