Получить токен первого исполнения от RNPushNotification - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в React Native. Я разрабатываю приложение, которое подключается к службам AWS и может отправлять уведомления pu sh на телефон, на котором установлено приложение. Я использую следующие службы: AWS Amplify, PushNotification, AWS Pinpoint, AWS Kinesis.

Сначала я начинаю с этого, когда я вхожу в свое приложение, мне будет показан экран входа в систему.

enter image description here

Этот логин не имеет валидации, единственное, что сейчас имеет ценность, - это первый ввод и кнопка входа в систему. Когда я напишу идентификатор клиента, он отправит меня на другой экран, где будет показано уведомление pu sh. Чтобы отправить это pushNotification, мне нужно идентифицировать токен устройства, на котором я работаю.

Для этого я использую функцию:

let tokenDispositivo;
NativeModules.RNPushNotification.getToken(token => 
   {  console.log(token);
      tokenDispositivo = token;
  }

Но когда я запускаю приложение в первый раз , переменная Token имеет значение undefined.

enter image description here

Это происходит при первом запуске приложения, когда я перезагружаю приложение в том же экземпляре, который он находит жетон. У меня есть подозрение, что, возможно, я неправильно использую компоненты React и отправляю его неправильно.

Это мой код:

Приложение. js:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */
import 'react-native-gesture-handler';
import React from 'react';
import { NativeModules, Linking, Alert } from 'react-native';

//AWS
import Amplify, { Analytics } from 'aws-amplify';
import awsmobile from './aws-exports';
import PushNotification from '@aws-amplify/pushnotification';

//Navigation
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

// Screens 
import LoginScreen from './screens/loginScreen';
import LoginSuccessfulScreen from './screens/loginSuccessful';

//Configuraciones
Amplify.configure(awsmobile);
Analytics.configure(awsmobile);
PushNotification.configure(awsmobile);

Amplify.Logger.LOG_LEVEL = 'VERBOSE';

// Obtener datos de la notificación recibida
PushNotification.onNotification((notification) => {

  if (notification.foreground) {
    console.log('onNotification foreground', notification);
    const data = JSON.parse(notification.data['pinpoint.jsonBody']);
    console.log('onNotification data', data);
    Alert.alert(
      "Mensaje de oferta",
      "Usted ha recibido una nueva oferta, si desea visualizarla, presione Ok",
      [
        {
          text: "Cancel",
          onPress: () => console.log("Cancel Pressed"),
          style: "cancel"
        },
        { text: "OK", onPress: () => OpenURLButton(data.Url) }
      ],
      { cancelable: false }
    );

  } else {
    console.log('onNotification background or closed',
               notification);
    }
});
  const OpenURLButton = async ( url ) => {
    await Linking.openURL(url);
  }
// Obtener token de registro
PushNotification.onRegister(async(token) => {
  console.log('in app registration', token);
});

// Obtener datos de la notificación al momento de abrirla (background)
PushNotification.onNotificationOpened((notification) => {
    console.log('the notification is opened', notification);
    OpenURLButton("reservedNameOfUrl.html");
});

let tokenDispositivo;
NativeModules.RNPushNotification.getToken(token => 
   {  console.log(token);
      tokenDispositivo = token;
  }
);


//Navigation 
const Stack = createStackNavigator();
const App = () => {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name= "Login"> 
        {props => <LoginScreen {...props} extraData={tokenDispositivo}/>}
        </Stack.Screen>
        <Stack.Screen name="Login exitoso" component = {LoginSuccessfulScreen}/>
      </Stack.Navigator>
    </NavigationContainer>
  );
};

export default App;

LoginScreen. js:

import React, { useState } from 'react';
import { Text, View, StyleSheet, TextInput, Button, Alert, PermissionsAndroid } from 'react-native';
import Geolocation from '@react-native-community/geolocation';
import AWS from 'aws-sdk';
import config from '../config';
import moment from 'moment';


function sendRecord(event) {
  // Update AWS Config
  if (config.aws) {
    AWS.config.update(config.aws);
  }
  if (event != null) {
    console.log('event = ' + JSON.stringify(event));
  }
  else {
    console.log('No event object');
  }

  var record = JSON.stringify(event);

  var recordParams = {
    Data: record,
    PartitionKey: 'partitionkey',
    StreamName: 'AnyStreamNameForEvent'
  };

  var kinesis = new AWS.Kinesis({ region: config.kinesis.region });
  try {
    kinesis.putRecord(recordParams, function (err, data) {
      if (err) {
        console.log(err);
      }
      else {
        console.log('Successfully sent data to Kinesis.');
      }
    });
  } catch (e) {
    console.log(e);
  }
};

//Obtener coordenadas de longitud y latitud
const handleData = (idCliente, token) => {
  let now = moment().format('YYYY-MM-DD HH:mm:ss');
  console.log('Tipo de variable now', typeof now);


  Geolocation.getCurrentPosition(
    (position) => {
      // Obtener latitud y longitud
      var latitud = position.coords.latitude;
      var longitud = position.coords.longitude;

      // Formato de los datos a enviar
      var data = {
        idCliente: idCliente,
        longitud: longitud,
        latitud: latitud,
        tiempo: now, 
        token: token
      }

      console.log('Handle data: ', data);
      sendRecord(data);
    }
  )
}

// Permisos para utilizar el GPS
let requestLocationPermission = async () => {
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
      {
        title: "Permiso para utilizar el GPS",
        message:
          "La aplicación necesita permisos para utilizar el GPS",
        buttonNeutral: "Preguntar más tarde",
        buttonNegative: "Cancelar",
        buttonPositive: "OK"
      }
    );
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      console.log("Puede utilizar el GPS");
    } else {
      console.log("Acceso al GPS no permitido");
    }
  } catch (err) {
    console.warn(err);
  }
};

// Manejar el envio de los datos
const handleSendData = (idCliente,token) => {
  requestLocationPermission();
  handleData(idCliente,token);
}

export const LoginScreen = (props) => {
  let [clientId, setClientId] = useState('');
  let token = props.extraData;
  console.log('Token LS:', token); // HERE IS UNDEFINED THE FIRST EXECUTION
  return (

    <View style={styles.container}>
      <View>
        <Text style={styles.title}>
          App
        </Text>
      </View>
      <TextInput
        placeholder="Client ID ..."
        style={styles.inputs}
        onChangeText={text => setClientId(text)}
      />
      <TextInput
        placeholder="Password"
        style={styles.inputs}
        secureTextEntry={true} />
      <Button title="Login"
        onPress={() => {
          handleSendData(clientId, token);
          props.navigation.navigate('Login exitoso', { clientId: clientId });
        }
        }
      />
    </View>

  );
}


const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center'
  },
  inputs: {
    borderColor: 'black',
    borderWidth: 1,
    padding: 5,
    textAlign: "center",
    marginTop: 3,
    marginBottom: 3,
    width: '40%'
  },
  title: {
    fontSize: 20
  }
});

export default LoginScreen;

Я хотел бы знать, что я должен сделать, чтобы этот токен имел соответствующее значение на экране входа в систему. Заранее благодарен за вашу помощь.

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