首页
学习
活动
专区
圈层
工具
发布

在React Native iOS中显示自定义FCM推送通知

React Native iOS中显示自定义FCM推送通知

基础概念

FCM (Firebase Cloud Messaging) 是Google提供的跨平台消息推送服务,允许开发者向iOS和Android设备发送通知和消息。在React Native应用中实现自定义FCM推送通知需要理解以下核心概念:

  1. 推送通知生命周期:从服务器发送到设备接收的完整流程
  2. 通知渠道 (iOS中称为通知类别):用于区分不同类型的通知
  3. 静默通知:不直接显示但可以触发应用逻辑的消息
  4. 前台/后台处理:应用在不同状态下的通知处理方式

实现方案

1. 安装必要依赖

代码语言:txt
复制
yarn add @react-native-firebase/app @react-native-firebase/messaging
cd ios && pod install

2. iOS配置

a. 在Xcode中配置推送通知能力

  1. 打开项目ios/YourAppName.xcworkspace
  2. 选择主target -> Signing & Capabilities
  3. 添加"Push Notifications"和"Background Modes"能力
  4. 在Background Modes中勾选"Remote notifications"

b. 配置AppDelegate.m

代码语言:txt
复制
#import <Firebase.h>
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>

// 在didFinishLaunchingWithOptions中添加
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [FIRApp configure];
  
  // 请求通知权限
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
      dispatch_async(dispatch_get_main_queue(), ^{
        [application registerForRemoteNotifications];
      });
    }
  }];
  
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

// 处理注册APNs token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [FIRMessaging messaging].APNSToken = deviceToken;
  [RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}

3. React Native端实现

a. 请求权限和获取token

代码语言:txt
复制
import messaging from '@react-native-firebase/messaging';
import {Platform} from 'react-native';

async function requestUserPermission() {
  const authStatus = await messaging().requestPermission();
  const enabled =
    authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
    authStatus === messaging.AuthorizationStatus.PROVISIONAL;

  if (enabled) {
    console.log('Authorization status:', authStatus);
    getFcmToken();
  }
}

async function getFcmToken() {
  try {
    const token = await messaging().getToken();
    console.log('FCM Token:', token);
    // 将token发送到你的服务器
  } catch (error) {
    console.log('Failed to get FCM token', error);
  }
}

b. 处理前台通知

代码语言:txt
复制
// 监听前台通知
messaging().onMessage(async remoteMessage => {
  console.log('Foreground notification:', remoteMessage);
  
  // 使用react-native-push-notification等库显示本地通知
  PushNotification.localNotification({
    title: remoteMessage.notification.title,
    message: remoteMessage.notification.body,
    // 其他自定义参数...
  });
});

c. 处理后台/退出状态通知

代码语言:txt
复制
// 设置后台消息处理器
messaging().setBackgroundMessageHandler(async remoteMessage => {
  console.log('Background notification:', remoteMessage);
  
  // 处理后台通知逻辑
  return Promise.resolve();
});

// 监听通知点击
messaging().onNotificationOpenedApp(remoteMessage => {
  console.log('Notification opened app:', remoteMessage);
  // 处理点击逻辑
});

// 检查应用是否通过通知启动
messaging()
  .getInitialNotification()
  .then(remoteMessage => {
    if (remoteMessage) {
      console.log('App opened from notification:', remoteMessage);
      // 处理启动逻辑
    }
  });

4. 自定义通知内容

要在iOS上显示自定义通知,需要在服务器端发送包含特定payload的通知:

代码语言:txt
复制
{
  "to": "DEVICE_FCM_TOKEN",
  "content_available": true,
  "priority": "high",
  "notification": {
    "title": "自定义标题",
    "body": "自定义内容",
    "sound": "default"
  },
  "data": {
    "customKey": "customValue",
    "click_action": "FLUTTER_NOTIFICATION_CLICK"
  }
}

5. 自定义通知UI

要实现完全自定义的通知UI,需要:

  1. 创建Notification Service Extension:
    • 在Xcode中: File -> New -> Target -> Notification Service Extension
    • 实现didReceive(_:withContentHandler:)方法
代码语言:txt
复制
import UserNotifications

class NotificationService: UNNotificationServiceExtension {
    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        guard let bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) else {
            return
        }
        
        // 修改通知内容
        bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
        bestAttemptContent.body = "\(bestAttemptContent.body) [modified]"
        
        // 添加自定义附件
        if let url = URL(string: "https://example.com/image.jpg"),
           let data = try? Data(contentsOf: url),
           let attachment = try? UNNotificationAttachment(identifier: "image", url: url, options: nil) {
            bestAttemptContent.attachments = [attachment]
        }
        
        contentHandler(bestAttemptContent)
    }
}

常见问题及解决方案

1. 通知不显示

  • 原因: 可能缺少必要的权限或配置
  • 解决:
    • 确保已正确配置APNs证书
    • 检查是否调用了registerForRemoteNotifications
    • 验证设备token是否有效

2. 自定义数据无法接收

  • 原因: iOS对通知payload有大小限制
  • 解决: 确保数据部分不超过4KB

3. 后台通知不触发

  • 原因: 可能缺少content_available: true标志
  • 解决: 在服务器端payload中添加此标志

4. 通知点击无响应

  • 原因: 未正确处理onNotificationOpenedAppgetInitialNotification
  • 解决: 确保正确设置了这些监听器

最佳实践

  1. 测试环境: 使用开发环境APNs证书进行开发测试
  2. 错误处理: 实现全面的错误处理和日志记录
  3. 性能优化: 对于大量通知,考虑使用通知组
  4. 用户体验: 提供清晰的通知设置选项给用户
  5. 安全: 验证通知来源,防止伪造通知攻击

通过以上步骤,你可以在React Native iOS应用中实现完整的自定义FCM推送通知功能,包括自定义UI和交互逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在 React应用中实现Web推送通知

默认情况下,Create-react-app CRA的工作方式是在开发人员模式下不存在ServiceWorker,并且任何以前安装的sw都将被虚拟人替换。...custom-sw.js'const swUrl =`$ {process.env.PUBLIC_URL} / $ {swFileName}`; 现在让我们创建的一个服务人员的公共文件夹,将听取推事件和显示通知...在这种情况下,Create React App会编译build文件夹中的文件,并在其中放置一个默认服务工作程序,其中包含对现代应用程序有用的东西。...如果我们决定保留它们并只添加我们的推送功能,则需要对构建过程进行一些修改。CRA中有用于服务人员构建的工作箱。而且,即使您的目的只是添加一些自定义代码,也没有内置的方法可以对其进行修改。...如果您想使用户烦恼很多次,请首先显示带有订阅要约的自定义对话框。并且只有在用户同意的情况下,才显示真实的。

3.8K30

React Native推送通知:完整的操作指南

在这篇文章中,我们将看到如何在React Native应用中创建和发送推送通知。 什么是推送通知? 推送通知是从应用程序发送到已安装该应用的用户的消息或警报。...React Native 中的推送通知架构 在我们深入了解如何在 React Native 应用中实现推送通知的技术细节之前,理解React Native推送通知的工作原理可能会有所帮助。...这里有一个图表,简化了通知服务如何与设备进行通信: 当涉及到在React Native中设置推送通知时,有几种设置方式: 原生平台特定的通知服务(FCM/APNS) Expo推送通知服务和其他云服务 像...iOS设备 我们可以使用React Native Firebase库来在Android上集成FCM,使用 push-notification-ios 库来在iOS上集成APNs。...React Native Firebase 库也提供了一种通过 FCM 在iOS上发送推送通知的方法。

5.7K10
  • React Native 常用的 15 个库

    React Native Push Notification 这个库支持本地推送通知功能比较全面。它具有日程通知、基于日、周、时间的重复通知等其他库中没有的功能。...如果你的应用程序具有离线可用并且需要推送通知,则此库是你的选择。 13....React Native FCM 如果你的应用程序需要使用 GCM 或 FCM 从服务器发送远程通知,那么这个库就你选择之一,FCM 只是 GCM 的最新版本。...因此,如果你同时需要远程和本地通知,那么可以使用 response-native-fcm 12.React Native Hyperlink 一个简单的 react-native 超链接组件的可以让...通过在 Android 中处理后退按钮,该组件也做得很好。 示例:提交帖子 9. React Native Progress 在应用程序中,显示加载或任何其他操作的进度是很重要的。

    6.9K31

    React-Native 遇到的错误1. React-Native 部分组件在debug模式下打包在iOS真机上可以显示,但是release模式下打包在iOS真机上不显示2. React-Native

    React-Native 部分组件在debug模式下打包在iOS真机上可以显示,但是release模式下打包在iOS真机上不显示 ? 显示 ?...不显示 这个问题真的是卡了我好久,只要是打release包,下面的按钮组就是不显示,而release包又不能调试,于是我终于在忍无可忍的情况下,一直不能打包然后一点一点的展示在页面上,来看到底是哪里的问题...name这个属性,只有在debug模式下才有,所以这样来进行判断的 ,统统不会有true的情况,自然buttons中没有值,也就不会展示了。...React-Native 启动时报错 - “no bundle url present” 原因 我运行了react-native run-android看了一下安卓环境下的图标的样式,然后使用react-native...解决 于是我就在iOS模拟器正在运行期间执行了: npm install react-native run-ios zz,一遍还不行,试了两遍才正常了!!!

    2.5K30

    uni-app 如何实现消息推送功能?

    国内Android的Push是一个混乱的世界,因为Google的Push服务FCM 被墙(从HBuilderX2.7.10开始,支持谷歌FCM,参考: UniPush支持谷歌推送FCM配置指南),所以一些国内的安卓手机厂商各自做了自己的推送...技术架构 名词解释 名词 解释 通知消息 指定通知标题和内容后,由个推SDK自动处理在系统通知栏中展示通知栏消息,同时响铃或震动提醒用户(响铃和震动受手机系统的设置状态影响)。...在左侧菜单点击uniPush,然后选择 1.0 或 2.0,进入Uni Push信息页,左上角显示为当前要操作的应用,点击可以切换应用。...iOS平台: iOS BundleId必须与HBuilderX中App云端打包时配置的Bundle ID(AppID)一致。...iOS 平台还需要在 【配置管理】-【应用配置】页面上传推送证书,如何获取推送证书请参考个推官方文档教程:iOS证书配置指南。

    6.9K22

    APP消息推送方案调研

    通知提醒方式:通知栏消息固定会在通知栏显示,用户可感知的提醒方式还有状态栏图标、锁屏消息、熄屏图标、铃声、震动、呼吸灯等。常用场景:订阅内容、行程提醒、帐号动态等。...透传消息透传消息是由客户端应用负责处理的消息,您可以自定义推送样式,从而助您更高效灵活地推送消息。...像 Line 的 Android 版本可以在推送通知的 Popup 上直接回复, iOS 就需要越狱才能做到了。...SMS(Push)方式在Android平台上,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。优势: 可以实现完全的实时操作。...获取Firebase实例ID:在应用中,使用Firebase实例ID服务来获取一个唯一的标识符。这个服务会处理令牌的生成和刷新。

    3.7K10

    使用Leancloud实现React Native App的消息推送(Push Notification)- Android篇

    前言 在上一篇文章 中我们详细讲解了用Leancloud实现iOS消息推送的流程,今天本文将继续讲解实现Android的消息推送。...关于接收到通知后如何处理,我的思路是当native module收到通知时,通过RCTDeviceEventEmitter触发相应的Event,在js中监听这些Event并响应,修改PushModule...现在我们在Leancloud控制台发送一条通知,手机应该能收到消息: ? 当点击通知的时候,App打开并执行我们自定义的逻辑: ?...实现App打开状态下的推送 到目前为止,我们已经实现了系统级的推送,和iOS一样,我们希望Android App打开状态下也能弹出通知提醒。...相关链接 iOS篇地址:使用Leancloud实现React Native App的消息推送(Push Notification)- iOS篇 本文Demo Github地址:https://github.com

    3.5K50

    Android 手记 | Android MobPush 接入小结

    特殊情况单独注明) (截止到 2021 年 8 月 10 日): 极光 友盟 Mob 个推 支持消息格式 通知栏通知、自定义消息(透传)、富媒体、本地通知 通知栏通知、自定义消息(透传)、本地通知 通知栏通知...、自定义消息(透传)、本地通知 通知消息、自定义消息(透传)、分组对比 离线厂商通道支持 华为、小米、OPPO、vivo、魅族、华硕、FCM 华为、小米、OPPO、vivo、魅族 华为、小米、魅族、OPPO..."小米的appid" appKey "小米的appkey" } // FCM 推送通道配置 FCM...{ // 设置默认推送通知显示图标 iconRes "@mipmap/ic_launcher" }...O(∩_∩)O哈哈~ THK --- 2021 Q2中国手机市场出货量/份额排名:前五厂商详细数据报告 2021年中国手机操作系统行业研究报告 友盟推送 、极光推送、MobPush、个推推送、统一推送联盟

    2.4K30

    【Hybrid开发高级系列】ReactNative(四) —— 基础开发技巧

    自定义的组件也可以使用props。通过在不同的场景使用不同的属性定制,可以尽量提高自定义组件的复用范畴。只需在render函数中引用this.props,然后按需处理即可。...1.11.2 访问控制台日志         在运行RN应用时,可以在终端中运行如下命令来查看控制台的日志: $react-native log-ios $react-native log-android...在处理推送通知时,AppStateIOS经常被用于判断目标和适当的行为。        ...1.22 iOS推送通知         为你的应用程序处理推送通知,包括权限的处理和图标标记数量。...从aps对象中获取通知的主要消息字符串 getBadgeCount()         从aps对象中获取标记数量 getData()         在通知上获取数据对象 1.23 iOS状态栏 1.23.1

    1.8K20

    《深度剖析:React Native与Flutter在社交应用中混合原生组件开发》

    React Native的热重载特性,为混合开发注入了强大动力。在开发社交应用的过程中,开发者频繁修改原生组件相关代码时,热重载功能能够实时呈现修改后的效果,极大提高了开发效率。...以社交应用中的推送通知功能为例,Flutter可以利用Firebase Cloud Messaging等第三方服务,结合iOS的UserNotifications框架和Android的FirebaseMessagingService...当有新消息时,无论是在iOS还是Android设备上,用户都能及时收到通知,并且可以通过点击通知直接跳转到相应的聊天界面,这种无缝的交互体验,离不开Flutter对原生组件的有效融合。...在开发过程中,Flutter的热重启和热重载功能同样表现出色。与React Native不同的是,Flutter的热重载不仅能快速更新UI,还能保留应用的状态。...React Native与Flutter在社交应用对iOS和Android原生组件的混合开发中,各有千秋。

    26200

    Android应用保活全攻略:30个实用技巧助你突破后台限制

    在Android系统中,保活(保持应用进程一直存活)就是为了让应用在后台持续运行,来实现某些特定的功能,如实时消息推送、定位服务等。...前台服务需要显示一个通知,告知用户当前服务正在运行。通过调用startForeground(int id, Notification notification)方法将服务设置为前台服务。 2....使用Firebase Cloud Messaging(FCM) 对于需要实时消息推送的应用,可以使用Firebase Cloud Messaging(FCM)服务。...FCM是一种跨平台的消息推送服务,可以实现高效且可靠的消息传递。通过使用FCM,你可以确保应用在后台时接收到实时消息,而无需采取过多的保活手段。 18....使用native进程 通过JNI技术,创建一个native进程来守护应用进程。当应用进程被杀死时,native进程可以感知到这个事件,并重新启动应用进程。

    4.7K21

    FCM---Android系统级推送---你还在用第三方推送?

    注:国内可接收FCM推送,但必须安装谷歌服务。具体操作请参考官方文档。...这些服务器从一个应用服务器获取消息,并将其发送至在设备上运行的客户端应用。Google 为 HTTP 和 XMPP 提供连接服务器。 2、一台应用服务器,您必须在您的环境中实现它。...您可以发送带有预定义字段的通知消息或自定义数据消息;请参阅消息负载中的通知和数据,了解关于负载支持的详细信息。本页中的示例用于说明如何通过 HTTP协议发送数据消息。...通知 要发送通知,可设置 notification 键并针对通知消息的用户可见部分设置必要的预定义键选项集。 例如,这是 IM 应用中的 JSON 格式的通知消息。...数据包中的 notification 键包含通知。

    14.6K30

    一个上架了的React Native项目实战总结

    react-native-splash-screen react-native-htmlview react-native-parallax-scroll-view react-native-scrollable-tab-view...总结 此项目是基于目前比较火的React Native技术架构的,也用到一些Android和iOS技术,其中Android、iOS两端代码复用率有90%之多,该项目占据我不少业余时间,不过总算研发完成,...在此过程中填了不少的坑,包括GitHub没有开放trending的Api,需要自己动手实现它,以及自定义主题等等,后期有时间会整理出来分享给大家。...项目开源在GitHub上供热爱移动开发的小伙伴学习研究,喜欢的小伙伴不要忘记点个赞支持一下哦。...吧,让我们一起做朋友~~ 戳这里,加关注哦: 微博:第一时间获取推送 个人博客:干货文章都在这里哦 GitHub:我的开源项目

    1.9K80

    Android P正式版即将到来:后台应用保活、消息推送的真正噩梦

    题外话:实际上,对于后台消息推送能力,Android原版系统早就内置了系统级推送服务(跟iOS上的APNs服务是一个东西),它就是GCM服务(现在升级为FCM了),但众所周之的原因,谷哥的服务在国内都是用不了的...为了响应Android原版中对省电策略、用户体验等设计,也为了避免各种保活乱象,国内主流的Android手机厂商在阉割了谷歌原版的GCM(FCM)推送通道之后(悲剧!)...系统或会通过利用机器学习预加载的应用,从而预测各个应用的使用概率,然后将它们编配至相应的群组中。若设备中没有安装此类系统应用,在默认情况下,系统会根据应用的近期使用情况进行等级划分。...如果您错误的将没有与用户进行互动的 FCM 消息设置为高优先级,这种标记不当的行为可能会导致其他不良后果,比如:在应用耗尽高优先级消息额度之后,系统会把真正紧急的 FCM 消息当做“普通优先级”消息来处理...》 《了解iOS消息推送一文就够:史上最全iOS Push技术详解》 《基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)》 >> 更多同类文章 ……

    4.3K30

    微信技术公开课上的新技术,3分钟搞定多端推送!

    得益于这种深度合作,腾讯云推送服务与小程序多端框架底层全面优化打通,屏蔽了繁杂的配置工作,且跨端逻辑也与小程序多端框架完全一致,避免了多端开发中令人头痛的多端适配和兼容性问题。...与之相对,在小程序多端框架中自行集成推送服务的传统方式则需要开发者逐一接入、配置、上报各厂商的推送能力,之后还要进行多端适配,反复测试以解决兼容性问题。...除小程序多端框架外,推送服务还支持Android、iOS、Flutter、uniapp、React-Native等开发平台。...方案支持将推送消息落地到指定会话中,并触发对应会话、消息和未读等模块更新。用户在线时,可以收到推送的消息,用户不在线时,下次登录也可自动拉取到推送的消息。 目前,推送服务已将主流厂商通道全部整合集成。...在线推送支持所有机型,离线推送覆盖主流厂商及其子品牌,境外支持 Google FCM。 全球专属通道,毫秒级精准触达 腾讯云推送服务支持全球接入,提供多个境外独立数据中心供开发者选择。

    24300
    领券