Удаленные push-уведомления не работают должным образом [IOS] [React Native]. Нет ошибок - PullRequest
1 голос
/ 15 мая 2019

Прежде всего, приложение получает уведомления только тогда, когда находится на переднем плане. Если приложение находится в фоновом режиме, уведомление не будет отображаться, и слушатель не будет входить, как ожидалось, но, когда я открою приложение, слушатель получит уведомление, которое я отправил в фоновом режиме.

Я просто добавляю ключ APNs в консоль firebase, перезагружаю и добавляю в проект GoogleService-info.plist и проверяю пункты «Фоновые режимы -> Удаленное уведомление» и «Push-уведомления» в разделе «Возможности». в XCode и я не использую стручки для RNF

Во-вторых, всякий раз, когда я отправляю уведомление или сообщение только для данных, приложение прослушивает его как уведомление всегда ( onNotification срабатывает), получая тело, заголовок, звук и т. Д. Как неопределенные и ключ «уведомление» находится внутри данных, даже если я никогда не отправляю данные в уведомлении, и он получает новый ключ (не отправленный мной) e: «1»

Я использую «act-native »:« 0.59.4 »и« Reaction-native-firebase »:« 5.3.1 », НЕ использую Pod и проверяю его на iPad 2 с помощью Postman для отправки push-уведомлений в FCM

Это мой AppDelegate.m:

#import "AppDelegate.h"

#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <RNSplashScreen.h>
#import <ReactNativeConfig.h>
#import <NewRelicAgent/NewRelic.h>
#import "Firebase.h"
#import "RNFirebaseNotifications.h"
#import "RNFirebaseMessaging.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSURL *jsCodeLocation;
  NSString *newrelicToken = [ReactNativeConfig envFor:@"NEWRELIC_IOS_TOKEN"];

  [NewRelicAgent startWithApplicationToken:newrelicToken];

  [FIRApp configure];

  [RNFirebaseNotifications configure];

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
  //jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"Prestadores"
                                               initialProperties:nil
                                                   launchOptions:launchOptions];
  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

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

- (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];
}

@end

и это мой компонент:

export default class NotificationsHandler extends Component<Props> {
  componentDidMount() {
    const {
      onNavigate,
      onGetAssigned,
      onFCMMessage,
      onSelect,
      token,
      cuit,
    } = this.props;

    if (Config.FCM === 'true') {
      this.registerFCM();
      // Build a channel
      const channel = new firebase
        .notifications
        .Android
        .Channel('mobile-prestadores', 'Prestadores Channel', firebase.notifications.Android.Importance.Max)
        .setDescription('Swiss Medical Prestadores');

      // Create the channel
      firebase.notifications().android.createChannel(channel);
      this.addFCMMessageListener();
    }
    firebase.notifications().getInitialNotification()
      .then((notificationOpen) => {
        if (notificationOpen) {
          // const action = notificationOpen.action;
          // const notification = notificationOpen.notification;
          const notification = { ...notificationOpen.notification };
          let service = { ...notification.data };
          token ? this.manageClickNotification(service) : this.props.onNavigate(constants.navigation.login);
        }
      });
  }

  componentWillUnmount() {
    this.removeListeners();
  }

  registerFCM() {
    const {
      onFCMRegister,
    } = this.props;
    return requestGCMPermissions().then((fcm) => {
      if (fcm) {
        firebase.messaging().getToken().then((fcmToken) => {
          if (fcmToken) {
            console.log(fcmToken);
            onFCMRegister(fcmToken);
          } else {
            firebase.messaging().onTokenRefresh((newToken) => {
              console.log(fcmToken);
              onFCMRegister(newToken);
            });
          }
        });
      }
    });
  }

  addFCMMessageListener() {
    const {
      onUpdatePush,
      onFCMMessage,
      onNavigate,
      onGetAssigned,
      onSelect,
      token,
      cuit,
    } = this.props;
    this.messageListener = firebase.messaging().onMessage((message) => {
      let service = message.data;
      this.manageRecieveNotifications(service);
    });
    this.notificationDisplayedListener =
      firebase.notifications().onNotificationDisplayed((notification) => {
        let service = notification.data;
        this.manageRecieveNotifications(service);
      });
    this.notificationListener =
      firebase.notifications().onNotification((notification) => {
        let service = notification.data;
        service = formatters.pushFormat(service);
        this.manageRecieveNotifications(service);
      });
    this.notificationOpenedListener =
      firebase.notifications().onNotificationOpened((notificationOpen) => {
        const notification = { ...notificationOpen.notification };
        let service = { ...notification.data };
        service = formatters.pushFormat(service);
        token ? this.manageClickNotification(service) : onNavigate(constants.navigation.login);
      });
  }

  removeListeners() {
    const { listener } = this.props.location;
    if (listener) {
      navigator.geolocation.clearWatch(this.watchId);
    }
    if (this.messageListener) {
      this.messageListener();
    }
    if (this.notificationDisplayedListener) {
      this.notificationDisplayedListener();
    }
    if (this.notificationOpenedListener) {
      this.notificationOpenedListener();
    }
    if (this.notificationListener) {
      this.notificationListener();
    }
  }

  render() {
    return(
      <View style={styles.container}>
        {this.props.children}
      </View>
    )
  }
} 

Я отправляю это:

{
    "to": "DEVICE FCM",
    "priority": "high",
    "content_available": true,
    "data": {
        "title":"title example",
        "body":"body example"
    },
    "notification": {
        "title":"title example",
        "body":"body example",
        "sound":"default"
    }
}

и он не показывает ошибок, но его тело и заголовок имеют вид undefined и ключ уведомления внутри ключа данных (даже если я не отправляю данные), а внутри ключа уведомления он возвращает e: "1" вот так:

Notification {
  _body: undefined,
  _data: {
    from: "591699987834",
    notification: {
      body: "test",
      e: "1",
      title: "prueba",
      __proto__: Object
    },
    __proto__: Object
  },
  _ios: {
    _notification: Notification,
    _alertAction: undefined, 
    _attachments: Array(0), 
    _badge: undefined, 
    _category: undefined, 
  },
  _notificationId: "-LemY1Pf-aM0PK4a3oRb",
  _sound: undefined,
  _subtitle: undefined,
  _title: undefined,
  android: (...),
  body: (...),
  data: (...),
  ios: (...),
  notificationId: (...),
  sound: (...),
  subtitle: (...),
  title: (...),
  __proto__: Object
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...