应用程序在后台时未收到通知(iOS react-native)

时间:2019-07-05 14:27:56

标签: ios react-native

我正在为我的一个项目实现react-native-firebase,并尝试在其中添加通知功能。但是我在获取通知时遇到问题。当我使用firebase api“ https://fcm.googleapis.com/fcm/send”发送通知时,当应用程序处于前台时,我会收到通知。但是,当应用程序在后台发送通知时,我什么也没收到。但是,一旦我打开应用程序,我就会收到通知。

我已经复制了googleservice-info.plist文件,并将auth密钥上传到了Firebase。

我的主要js代码:


        messagaing.hasPermission()
            .then((enabled) => {
                if (enabled) {
                    messagaing.getToken()
                        .then(async token => {
                            const deviceId = await AsyncStorage.getItem('deviceId');
                            if (!deviceId) {
                                this.registerTokenOnServer(token)
                            } else {
                                this.setState({
                                    deviceId
                                })
                            }
                            console.log('fcm token', token)
                        })
                        .catch(error => { console.log('fcm error', error) })
                } else {
                    messagaing.requestPermission()
                        .then(() => { console.log('fcm token') })
                        .catch(() => { console.log('fcm error') })
                }
            })
            .catch(error => {
                console.log('fcm error', error)
            })

        messagaing.onMessage((message) => {
            console.log('fcm noti on message data', message)

            let notification_to_be_displayed = new firebase.notifications.Notification({
                sound: 'default',
                show_in_foreground: true,
                title: message._data.title,
                body: message._data.message,
            });
            firebase.notifications().displayNotification(notification_to_be_displayed);

            firebase.notifications().onNotificationOpened((notificationOpen) => {
                const notification = notificationOpen.notification;
                console.log('fcm open ', notification)
                if (notification.data.obj_type == '1') {
                    this.props.navigation.navigate('ProductDetailPage', { prodId: notification.data.obj_id, })
                } else {
                    this.props.navigation.navigate('SubCategoryPage', { catId: notification.data.obj_id, catName: 'Categories' })
                }
            })
        });

我的AppDelegate.h:

#import <UserNotifications/UserNotifications.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>

@property (nonatomic, strong) UIWindow *window;

@end

我的AppDelegate.m:

#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#if __has_include(<React/RNSentry.h>)
#import <React/RNSentry.h> // This is used for versions of react >= 0.40
#else
#import "RNSentry.h" // This is used for versions of react < 0.40
#endif
#import "RNGoogleSignin.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <Firebase.h>
#import "RNFirebaseNotifications.h"
#import "RNFirebaseMessaging.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSURL *jsCodeLocation;

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"reactenduser"
                                               initialProperties:nil
                                                   launchOptions:launchOptions];

  [RNSentry installWithRootView:rootView];

  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  // define UNUserNotificationCenter
  [FIRApp configure];
  [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
  [RNFirebaseNotifications configure];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];

  [[FBSDKApplicationDelegate sharedInstance] application:application
                           didFinishLaunchingWithOptions:launchOptions];

  return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                        openURL:url
                                              sourceApplication:sourceApplication
                                                     annotation:annotation
          ]
  || [RNGoogleSignin application:application
                         openURL:url
               sourceApplication:sourceApplication
                      annotation:annotation
      ];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
  [[RNFirebaseNotifications instance] didReceiveLocalNotification:notification];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo
fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{
  [[RNFirebaseNotifications instance] didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
  [[RNFirebaseMessaging instance] didRegisterUserNotificationSettings:notificationSettings];
}

-(void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {

  [[RNFirebaseMessaging instance] didReceiveRemoteNotification:response.notification.request.content.userInfo];
  completionHandler();
}

@end

当我的应用程序进入后台时,发送通知时我没有收到任何数据或错误。只有当它进入前台时,我才能看到日志。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您需要打开远程消息的后台功能。

检查图像 enter image description here

请注意,在我的项目中,我有后台获取功能,我想您可以跳过它。