ios icon indicating copy to clipboard operation
ios copied to clipboard

Foreground IOS push doesn't work

Open khaledBou opened this issue 5 years ago • 13 comments

Bug report

Summary

Environment info

react-native info output:

# System:
    OS: macOS 10.15.5
    CPU: (4) x64 Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
    Memory: 2.49 GB / 24.00 GB
    Shell: 5.7.1 - /bin/zsh
  Binaries:
    Node: 14.4.0 - /usr/local/bin/node
    Yarn: 1.19.1 - ~/.npm-global/bin/yarn
    npm: 6.13.4 - /usr/local/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  SDKs:
    iOS SDK:
      Platforms: iOS 13.5, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
  IDEs:
    Android Studio: 4.0 AI-193.6911.18.40.6626763
    Xcode: 11.5/11E608c - /usr/bin/xcodebuild
  npmPackages:
    react: 16.9.0 => 16.9.0
    react-native: 0.61.5 => 0.61.5
  npmGlobalPackages:
    react-native: 0.61.5

Library version: x.x.x

Steps to reproduce

  1. installing "@react-native-firebase/app": "^8.2.0",
  2. installing "@react-native-firebase/messaging": "^7.4.2",
  3. config AppDelegate.m

My AppDelegate.m code :

/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#import "AppDelegate.h"

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>

// Implement UNUserNotificationCenterDelegate to receive display notification via APNS for devices
// running iOS 10 and above.
@interface AppDelegate () <UNUserNotificationCenterDelegate>
@end

@implementation AppDelegate

NSString *const kGCMMessageIDKey = @"gcm.message_id";

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // Use Firebase library to configure APIs
  // [START configure_firebase]
  [FIRApp configure];
  // [END configure_firebase]

  // [START set_messaging_delegate]
  [FIRMessaging messaging].delegate = self;
  // [END set_messaging_delegate]

  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"eXpanded"
                                            initialProperties:nil];

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

  // ####################################
  if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
  } else {
    // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
    UIUserNotificationType allNotificationTypes =
    (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
    UIUserNotificationSettings *settings =
    [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
    [application registerUserNotificationSettings:settings];
  }

  [application registerForRemoteNotifications];
  // ####################################

   // Define UNUserNotificationCenter
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  center.delegate = self;

  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

// Receive displayed notifications for iOS 10 devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

// Required to register for notifications
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
 [RNCPushNotificationIOS didRegisterUserNotificationSettings:notificationSettings];
}

// Required for the register event.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
 [RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
 NSLog(@"APNs device token retrieved: %@", deviceToken);
}

// [START receive_message]
// Required for the notification event. You must call the completion handler after handling the remote notification.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }
  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);

  [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
// [END receive_message]

// Required for the registrationError event.
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
 [RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
 NSLog(@"Unable to register for remote notifications: %@", error);
}
// IOS 10+ Required for localNotification event
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void (^)(void))completionHandler
{
  [RNCPushNotificationIOS didReceiveNotificationResponse:response];
  completionHandler();
}
// IOS 4-10 Required for the localNotification event.
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
 [RNCPushNotificationIOS didReceiveLocalNotification:notification];
}

@end

Problem

I can't receive the notifications in foreground, push works only on background

khaledBou avatar Jul 16 '20 11:07 khaledBou

i also have this problem!

Flouwrian avatar Jul 16 '20 12:07 Flouwrian

too

majirosstefan avatar Jul 20 '20 21:07 majirosstefan

+1

itryapitsin2 avatar Jul 22 '20 13:07 itryapitsin2

check my answer here: https://github.com/react-native-community/push-notification-ios/issues/151#issuecomment-663827410

//Called when a notification is delivered to a foreground app.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{

    NSDictionary *userInfo = notification.request.content.userInfo;
    //Foreground
    NSLog(@"APP_PUSH from foreground %@", userInfo);
   
   [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo
   fetchCompletionHandler:^void (UIBackgroundFetchResult result){}];
   completionHandler(UNNotificationPresentationOptionAlert);
}

arnaudambro avatar Jul 25 '20 08:07 arnaudambro

@arnaudambro I'm also having the same problem. In my case willPresentNotification is not being called when receiving a notification in the foreground. It works fine though for receiving in the background.

maxperry avatar Jul 29 '20 21:07 maxperry

Hi, I had same issue, was not receiving Push notification in iOS foreground, but adding the following in AppDeligate.h and AppDeligate.m fixed the issue for me, This was all mentioned in the manual linking of react-native-community/push-notification-ios

Main missing code for me was creating UNUserNotificationCenter *center in didFinishLaunchingWithOptions

  • In AppDeligate.h ---> Add import #import <UserNotifications/UNUserNotificationCenter.h> and add UNUserNotificationCenterDelegate to protocols

My AppDeligate.h

#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
#import <UserNotifications/UNUserNotificationCenter.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, UNUserNotificationCenterDelegate>

@property (nonatomic, strong) UIWindow *window;

@narender2031 

  • In AppDeligate.m ---> Add import #import "RNCPushNotificationIOS.h" and the following code
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
-------------------------
  rest of your code here
-------------------------

// Define UNUserNotificationCenter
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  center.delegate = self;
  
  return YES;
}
--------------------------------------------------
    rest of appdeligate implementation here
--------------------------------------------------


// IOS 10+ Required for localNotification event
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
  [RNCPushNotificationIOS didReceiveNotificationResponse:response];
  completionHandler();
}


//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
  completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}

@end

Also added the following to Podfile pod 'RNCPushNotificationIOS', :path => '../node_modules/@react-native-community/push-notification-ios'

Project specification :

react-native : 61.5 react-native-community/push-notification-ios : 1.4.0 cocoapods : 1.8.4

Hope this helps.

stealth-grid avatar Aug 19 '20 14:08 stealth-grid

Hi, I had same issue, was not receiving Push notification in iOS foreground, but adding the following in AppDeligate.h and AppDeligate.m fixed the issue for me, This was all mentioned in the manual linking of react-native-community/push-notification-ios

Main missing code for me was creating UNUserNotificationCenter *center in didFinishLaunchingWithOptions

  • In AppDeligate.h ---> Add import #import <UserNotifications/UNUserNotificationCenter.h> and add UNUserNotificationCenterDelegate to protocols

My AppDeligate.h

#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
#import <UserNotifications/UNUserNotificationCenter.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, UNUserNotificationCenterDelegate>

@property (nonatomic, strong) UIWindow *window;

@narender2031 
  • In AppDeligate.m ---> Add import #import "RNCPushNotificationIOS.h" and the following code
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
-------------------------
  rest of your code here
-------------------------

// Define UNUserNotificationCenter
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  center.delegate = self;
  
  return YES;
}
--------------------------------------------------
    rest of appdeligate implementation here
--------------------------------------------------


// IOS 10+ Required for localNotification event
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
  [RNCPushNotificationIOS didReceiveNotificationResponse:response];
  completionHandler();
}


//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
  completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}

@end

Also added the following to Podfile pod 'RNCPushNotificationIOS', :path => '../node_modules/@react-native-community/push-notification-ios'

Project specification :

react-native : 61.5 react-native-community/push-notification-ios : 1.4.0 cocoapods : 1.8.4

Hope this helps.

tried this solution but in my case not work

fflsogliani avatar Oct 07 '20 15:10 fflsogliani

Thanks, that made it work. However, I don't see the push notification when the app is in the foreground. It right away opens it. Any chance I can display the push notification and depending on if the user clicks on it it opens it?

Benzer1406 avatar Nov 14 '20 22:11 Benzer1406

@maxperry did you make any progress

Naveen562117 avatar Nov 17 '20 09:11 Naveen562117

@Benzer1406 for me background notification is working fine as it is working for you and also when notification received in foreground are captured by listeners and getting printed in console as well but the problem is the push notification is not visible when the app is open @fflsogliani any help would be appreciated will be thank full

Naveen562117 avatar Nov 17 '20 09:11 Naveen562117

currently having the same issue, any useful resource or solution ?

thepearl avatar Nov 27 '20 12:11 thepearl

hi @thepearl in iOS push notification foreground will not work by just configuring you will have to push local notification on notification in push controller

import messaging from '@react-native-firebase/messaging'; import PushNotification from "react-native-push-notification";

messaging().setBackgroundMessageHandler(async remoteMessage => { console.log('Message handled in the background!', remoteMessage); }); const unsubscribe = messaging().onMessage(async remoteMessage => { console.log('A new FCM message arrived!', remoteMessage); PushNotification.localNotification(remoteMessage.data) });

this is what I have done so far I have intalled this push notification iOS only for getting pushnotifiation is dependent on this package

Naveen562117 avatar Nov 30 '20 06:11 Naveen562117

I can get remote notifications in the foreground. I used the example project to get the code for AppDelegate.m https://github.com/react-native-push-notification/ios/blob/master/example/ios/example/AppDelegate.m The only problem is that 'notification' event is not triggered when I press a notification in Notification Center.

anisimov74 avatar Sep 08 '21 11:09 anisimov74