React Native Firebase iOS端无法接收推送通知求助
iOS 端 React Native Firebase 推送通知无法接收排查方案
问题概述
使用 react-native-firebase 实现推送通知功能,Android 端运行正常,但 iOS 端仅能获取 Firebase Token,无法收到推送通知。
核心排查与修复步骤
1. 补充推送权限请求代码
iOS 要求主动向用户申请推送权限,你的 AppDelegate.mm 中缺少这部分逻辑,需添加以下内容:
- 先导入 UserNotifications 框架
#import <UserNotifications/UserNotifications.h>
- 让 AppDelegate 遵守通知代理协议
@interface AppDelegate () <UNUserNotificationCenterDelegate> @end
- 在
didFinishLaunchingWithOptions方法中添加权限请求
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error && granted) { [[UIApplication sharedApplication] registerForRemoteNotifications]; } }];
2. 添加通知处理代理方法
确保前台和后台通知能被正确接收,在 @implementation AppDelegate 中添加:
// 前台收到通知时触发,允许弹窗、声音、角标提示 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge); } // 用户点击通知时触发 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { completionHandler(); }
3. 检查 APNs 与项目配置
- 确认 Firebase 控制台已上传对应环境(开发/生产)的 APNs 证书
- 在 Xcode 项目的
Signing & Capabilities中,已启用Push Notifications能力 - 项目 Bundle ID 需与 Firebase 控制台注册的完全一致
4. 验证测试环境与权限
- 开发环境测试时,需使用 Firebase 控制台中对应开发证书的测试设备
- 检查 iOS 系统设置:进入「设置 -> 通知 -> 你的应用」,确认通知权限已开启
5. 调整 Firebase 初始化顺序
确保 [FIRApp configure] 在其他第三方服务(如 AppCenter)初始化之前执行,避免冲突。
用户提供的原代码
AppDelegate.mm
#import "AppDelegate.h" #import <Firebase.h> #import <React/RCTBundleURLProvider.h> #import <AppCenterReactNative.h> #import <AppCenterReactNativeAnalytics.h> #import <AppCenterReactNativeCrashes.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [FIRApp configure]; self.moduleName = @"CompelloInvoiceApproval"; // You can add your custom initial props in the dictionary below. // They will be passed down to the ViewController used by React Native. self.initialProps = @{}; [AppCenterReactNative register]; [AppCenterReactNativeAnalytics registerWithInitiallyEnabled:true]; [AppCenterReactNativeCrashes registerWithAutomaticProcessing]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (BOOL) application: (UIApplication *)application openURL: (NSURL *)url options: (NSDictionary<UIApplicationOpenURLOptionsKey, id> *) options { if ([self.authorizationFlowManagerDelegate resumeExternalUserAgentFlowWithURL:url]) { return YES; } return [RCTLinkingManager application:application openURL:url options:options]; } - (BOOL) application: (UIApplication *) application continueUserActivity: (nonnull NSUserActivity *)userActivity restorationHandler: (nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { if (self.authorizationFlowManagerDelegate) { BOOL resumableAuth = [self.authorizationFlowManagerDelegate resumeExternalUserAgentFlowWithURL:userActivity.webpageURL]; if (resumableAuth) { return YES; } } } return [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } @end
Info.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>en</string> <key>CFBundleDisplayName</key> <string>Compello</string> <key>CFBundleExecutable</key> <string>$(EXECUTABLE_NAME)</string> <key>CFBundleGetInfoString</key> <string></string> <key>CFBundleIdentifier</key> <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>$(PRODUCT_NAME)</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>$(MARKETING_VERSION)</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.compello.approval</string> <key>CFBundleURLSchemes</key> <array> <string>com.compello</string> </array> </dict> </array> <key>CFBundleVersion</key> <string>$(CURRENT_PROJECT_VERSION)</string> <key>LSApplicationCategoryType</key> <string></string> <key>LSRequiresIPhoneOS</key> <true/> <key>LSSupportsOpeningDocumentsInPlace</key> <true/> <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> <key>NSCameraUsageDescription</key> <string>Your app needs access to your camera to capture images.</string> <key>NSDocumentsFolderUsageDescription</key> <string>Your app needs access to the Documents folder</string> <key>NSHumanReadableCopyright</key> <string></string> <key>NSLocationWhenInUseUsageDescription</key> <string></string> <key>NSPhotoLibraryUsageDescription</key> <string>Allow access to the photo library for selecting images</string> <key>UIAppFonts</key> <array> <string>Fontisto.ttf</string> <string>Foundation.ttf</string> <string>Ionicons.ttf</string> <string>MaterialCommunityIcons.ttf</string> <string>MaterialIcons.ttf</string> <string>Octicons.ttf</string> <string>SimpleLineIcons.ttf</string> <string>Zocial.ttf</string> <string>FontAwesome.ttf</string> <string>FontAwesome5_Brands.ttf</string> <string>FontAwesome5_Regular.ttf</string> <string>FontAwesome5_Solid.ttf</string> <string>AntDesign.ttf</string> <string>Entypo.ttf</string> <string>EvilIcons.ttf</string> <string>Feather.ttf</string> <string>Mulish.ttf</string> <string>Mulish-Bold.ttf</string> </array> <key>UIBackgroundModes</key> <array> <string>fetch</string> <string>remote-notification</string> </array> <key>UIFileSharingEnabled</key> <true/> <key>UILaunchStoryboardName</key> <string>Launch</string> <key>UIRequiredDeviceCapabilities</key> <array> <string>armv7</string> </array> <key>UIRequiresFullScreen</key> <true/> <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> </array> <key>UISupportedInterfaceOrientations~ipad</key> <array> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortraitUpsideDown</string> </array> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> </dict> </plist>
内容的提问来源于stack exchange,提问作者Ruchira Swarnapriya
相关产品推荐
相关产品推荐

