Нажмите действие в push-уведомлении с помощью firebase и отреагируйте на нативный - PullRequest
0 голосов
/ 02 октября 2018

Я уже внедрил push-уведомление в своем приложении и оно работает.прямо сейчас, когда кто-то нажимает на уведомление, приложение открывается.

Кроме того, я хочу сделать еще одну вещь, когда пользователь нажимает на уведомление:

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 голосов
/ 03 октября 2018

Решение:

решение, которое я нашел,

прямо здесь

Я использовал только функцию

getInitialNotification()

с помощью этой функции вы можете вызвать уведомление при закрытии приложения.

Если вы хотите, чтобы запустить уведомление, когда приложение находится в фоновом режиме, вы хотите использовать эту функцию:

onNotificationOpened()

с этой функцией я не использовал слушателя (он не работал для меня), я использую эту функцию только в

componentDidMount

, а не в

componentWillUnmount

надеюсь, это поможет кому-то и сэкономит вам время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...