在带有Firebase的推送通知中单击操作并做出本机反应

时间:2018-10-02 11:08:30

标签: android ios react-native push-notification firebase-cloud-messaging

我已经在我的应用及其工作中实现了推送通知。 现在,当有人单击该应用程序正在打开的通知时。

除此之外,当用户按下通知时,我还想做另一件事:

1。将请求发布到服务器(我想记录有人单击通知的记录)。

2。像现在一样打开应用程序

我的问题是我该怎么做?我需要在服务器端还是在本机端实现它? 如果有人掌握了操作方法的教程(适用于android和iOS,甚至其中之一),将大有帮助!

我看了很多,但没找到可以帮助我的东西。

我正在添加我的工具:

在服务器端:

       public void sendNotification(String token,String msg)  {

    // This registration token comes from the client FCM SDKs.
    String registrationToken =token;

  // See documentation on defining a message payload.
    Message message = Message.builder()
            .setNotification(new com.google.firebase.messaging.Notification( null,msg))
            .setToken(registrationToken).setApnsConfig(ApnsConfig.builder().setAps(Aps.builder().setSound("default").build()).build()).setAndroidConfig(AndroidConfig.builder().setNotification(AndroidNotification.builder().setSound("default").build()).build())
            .build();

    try {
        String response = FirebaseMessaging.getInstance().send(message);
    } catch (FirebaseMessagingException e) {

    }
}

关于本机响应: 对于Android:

 public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
    private static int count = 0;
@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //Displaying data in log
        //It is optional
        Log.d(TAG, "Notification Message TITLE: " + remoteMessage.getNotification().getTitle());
        Log.d(TAG, "Notification Message BODY: " + remoteMessage.getNotification().getBody());
        Log.d(TAG, "Notification Message DATA: " + remoteMessage.getData().toString());
        String click_action= remoteMessage.getNotification().getClickAction();
//Calling method to generate notification
        sendNotification(remoteMessage.getNotification().getTitle(),
                remoteMessage.getNotification().getBody(), remoteMessage.getData());
    }
//This method is only generating push notification
    private void sendNotification(String messageTitle, String messageBody, Map<String, String> row) {
        PendingIntent contentIntent = null;
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                //.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(contentIntent);
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(count, notificationBuilder.build());
        count++;
    }
 }

在iOS上:

@implementation AppDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
   NSURL *jsCodeLocation;
   jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
   [FIRApp configure];
   RCTRootView *rootView = [[RCTRootView alloc]  initWithBundleURL:jsCodeLocation
                                                  moduleName:@"**"
                                           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];

  return YES;

    }

  // Required to register for notifications
  - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
  {

    [RCTPushNotificationManager didRegisterUserNotificationSettings:notificationSettings];

     }
 // Required for the register event.
   - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
     {
      [RCTPushNotificationManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
       }
 // 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

  {
     [RCTPushNotificationManager didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
    //NSLog(@"push-notification received: %@", notification)   
     }
  // Required for the registrationError event.
   - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
  {
   [RCTPushNotificationManager didFailToRegisterForRemoteNotificationsWithError:error];
    }
  // Required for the localNotification event.
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
   {
   [RCTPushNotificationManager didReceiveLocalNotification:notification];
    }

即时获得令牌时:

  setNotification(userid){

   const version =  DeviceInfo.getUniqueID()
      firebase.app().onReady().then(app => { 
      const again=  AsyncStorage.getItem('deviceToken', (err, token) =>  {
      this.props.profileActions.updateLoginTrack()
       console.log("checkingTokenFromLogin",token)
       console.log('version', version)
       if(token==null)    {
      console.log("tokenNull")

    app.messaging().getToken()
    .then(fcmToken => {
      if (fcmToken) {
          console.log('fcmtokenApp', fcmToken)
          this.saveDeviceToken(fcmToken)
          //need to save in database too
          let deviceTokenData = {
            userId:       userid,
            deviceUniqueId:        version,
            deviceToken:         fcmToken,
          }
          this.props.profileActions.updateDeviceToken(deviceTokenData)

      } else {
        console.log('error with getting token')
      } 
    })


  }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

解决方案:

我找到的解决方案是

right here

我只使用了功能

getInitialNotification()

使用此功能,您可以在应用关闭时触发通知。

如果您想在应用程序处于后台时触发通知,请使用此功能:

onNotificationOpened()

使用此功能,我没有使用监听器(对我不起作用),我仅在

中使用了此功能
componentDidMount

而不是

componentWillUnmount

希望它会帮助某人并为您节省一些时间