React-native-onesignal: un problema

Creado en 19 feb. 2017  ·  25Comentarios  ·  Fuente: OneSignal/react-native-onesignal

Hola, tengo OneSignalController que incluyo en Main.js

class OneSignalController extends Component {
    props: Props

    constructor(props) {
        super(props);
    }
    componentWillMount() {
        OneSignal.addEventListener('opened', this.onOpened);
        OneSignal.addEventListener('ids', this.onIds);
    }

    componentWillUnmount() {
        OneSignal.removeEventListener('opened', this.onOpened);
        OneSignal.removeEventListener('ids', this.onIds);
    }

    onIds = (device) => {
        this.props.dispatch_set_device_id(device.userId);
    }

    render() {
        return null;
    }
}

Utilizo redux-persist y no quiero iniciar la aplicación antes de que rehydration haya terminado.
así que quiero hacer esto en mi index.android.js

...
        this.state = { rehydrated: false };
    }

    componentWillMount() {
      Storage.restoreData(store, {}, () => {
        this.setState({ rehydrated: true });
        });
    }

    render() {
        return (
            this.state.rehydrated === true
            ? <Provider store={store}>
                <View style={styles.container}>
                    <Main />
                </View>
            </Provider>
            : null
        );
    }

Pero si hago oneSignal ya no activa la función onIds .

Help Wanted

Comentario más útil

Acabo de comenzar a usar esta biblioteca y encontré el mismo problema. ¡Usando redux-persist aquí también! Y después de investigar un poco, creo firmemente que tiene que ver con redux-persist. O cualquier suscripción retrasada al evento ids .

El siguiente código, si se coloca correctamente en index.xxx.js (es decir, muy temprano en el inicio de la aplicación), se activará cada vez que se reinicie la aplicación:

//... other imports
import OneSignal from "react-native-onesignal";

OneSignal.addEventListener('ids', (device) => {
    console.log("[OneSignal]>>ids: ", device);
});

// ....

AppRegistry.registerComponent ....

Sin embargo, si se llama a OneSignal.addEventListener('ids' ... después de la rehidratación redux-persist => despídase de la devolución de llamada.

CORREGIR Así es como yo (¿hack?) Lo arreglé, por ahora (versión actual de react-native-onesignal 3.0.3):

hay un método del lado js no documentado llamado OneSignal.configure() que hace que el lado nativo ( android e ios ) transmita el evento ids vuelta al lado js.

Entonces, llámelo justo después de agregar el detector de eventos para 'ids':

// ... after store rehydration complete ...

OneSignal.addEventListener('ids', (device) => {
   // ... do whatever with device
});

OneSignal.configure();  // add this to trigger `ids` event

Según mi evaluación de cómo se implementa en el lado nativo, parece bastante seguro llamar a eso, incluso más de una vez (solo reemplaza el controlador de eventos interno, no crea más). Pero tenga en cuenta que dispara a los oyentes ids cada vez.

Ahora me pregunto si los otros eventos funcionarán cuando se agreguen oyentes más adelante en el inicio de la aplicación.

Creo que esto probablemente debería solucionarse mejor con la biblioteca react-native-onesignal con una cola de suscriptores interna. Intentaré intentarlo, tal vez haga una solicitud de extracción en un futuro cercano para este escenario con registro retrasado de los oyentes de eventos.

Todos 25 comentarios

Tengo algunos problemas con onIds, que a veces no se llaman. Sin embargo, esto no está relacionado con redux-persist.

¿Parece que los servidores de OneSignal no son accesibles? Sin embargo, el Doc dice que debería devolver nulo de todos modos. Tengo este problema una vez cada pocos intentos, no es consistente. No estoy seguro de cuán confiable sea este evento ahora.

Hoy estaba revisando nuevamente el simulador y me tomó unos buenos 10 segundos obtener el evento "onIds", después de haber aceptado los permisos a través de OneSignal.requestPermissions ().

He colocado el mismo evento en otro lugar dentro de la aplicación para ver si todavía obtengo los ID, cada vez que actualizo (comportamiento del proyecto de demostración), pero no funciona en absoluto.

Además, no está claro de qué debería tratarse el evento "registrado" porque en ningún caso nunca se activa.

Chicos, el evento nunca se llama cuando la aplicación se cierra y se abre de nuevo. Quiero decir, si los identificadores están disponibles, ¿no debería activarse esto cada vez?

El otro problema es que no se activa 1 de cada 5 veces (promedio), cuando el usuario acepta notificaciones automáticas. Esto no sería un problema si el primer problema estuviera bien, por lo que podríamos recoger la identificación la próxima vez que el usuario abra la aplicación.

Acabo de comenzar a usar esta biblioteca y encontré el mismo problema. ¡Usando redux-persist aquí también! Y después de investigar un poco, creo firmemente que tiene que ver con redux-persist. O cualquier suscripción retrasada al evento ids .

El siguiente código, si se coloca correctamente en index.xxx.js (es decir, muy temprano en el inicio de la aplicación), se activará cada vez que se reinicie la aplicación:

//... other imports
import OneSignal from "react-native-onesignal";

OneSignal.addEventListener('ids', (device) => {
    console.log("[OneSignal]>>ids: ", device);
});

// ....

AppRegistry.registerComponent ....

Sin embargo, si se llama a OneSignal.addEventListener('ids' ... después de la rehidratación redux-persist => despídase de la devolución de llamada.

CORREGIR Así es como yo (¿hack?) Lo arreglé, por ahora (versión actual de react-native-onesignal 3.0.3):

hay un método del lado js no documentado llamado OneSignal.configure() que hace que el lado nativo ( android e ios ) transmita el evento ids vuelta al lado js.

Entonces, llámelo justo después de agregar el detector de eventos para 'ids':

// ... after store rehydration complete ...

OneSignal.addEventListener('ids', (device) => {
   // ... do whatever with device
});

OneSignal.configure();  // add this to trigger `ids` event

Según mi evaluación de cómo se implementa en el lado nativo, parece bastante seguro llamar a eso, incluso más de una vez (solo reemplaza el controlador de eventos interno, no crea más). Pero tenga en cuenta que dispara a los oyentes ids cada vez.

Ahora me pregunto si los otros eventos funcionarán cuando se agreguen oyentes más adelante en el inicio de la aplicación.

Creo que esto probablemente debería solucionarse mejor con la biblioteca react-native-onesignal con una cola de suscriptores interna. Intentaré intentarlo, tal vez haga una solicitud de extracción en un futuro cercano para este escenario con registro retrasado de los oyentes de eventos.

Si llama a OneSignal.configure (); antes del oyente de eventos, esto funciona bien. Ni siquiera estoy seguro de si es redux-persist.

Solo una nota rápida Acabo de tener este problema con un comportamiento errático con el evento onIds que no se activa.

Ahora, habiendo agregado la función de configuración a otro componente que se carga un poco más tarde en el lanzamiento de la aplicación, a veces obtengo un solo evento onIds que se activa y, a veces, dos (ya que el original todavía se está disparando en ocasiones).

Vale la pena señalar que no he probado esto en versiones de lanzamiento y actualmente estoy depurando en Android, React Native 0.38 y, dado que otros han sugerido que este es un problema de persistencia de redux, vale la pena señalar que también lo estoy usando.

Si de hecho no hay ningún efecto negativo en llamar a configure varias veces, supongo que está bien. Me ocuparé de que llegue a mi API dos veces cada vez que un usuario reanude la aplicación en alguna ocasión.

Si hay algún tipo de resultado negativo de hacer esto (que no sea la ineficiencia), hágamelo saber, ya que esta no es un área de especialización para mí.

Yo tengo lo mismo y estamos en producción. ;) Sí, estoy llamando a la API dos veces. :(

Hola @ edo1493 , también tengo el mismo problema. ¿Cómo se llama a la API dos veces?

Noté que sin recargar la aplicación (modo Dev), el evento solo se activará después de 35 segundos.

Editar:
Esto sucede en la primera carga de la aplicación.
Plataforma: Android

Tal vez @ jkasten2 pueda ayudar aquí, creo que no es un problema con esta biblioteca específica,

@ edo1493 onIds no se activará a menos que pueda obtener una identificación de jugador / usuario del servidor OneSignal. Esto significa que el userId nunca será null sin embargo, el pushToken puede hacerlo si los APN / FCM no respondieron a tiempo. El problema que estamos viendo parece estar relacionado con la conexión. ¿Puedes intentar llamar a setLogLevel en código nativo para habilitar el registro de llamadas de red? Si puede reproducir el problema con Android, proporcionará más detalles sobre las llamadas que se realizan en logcat frente al registro de Xcode con iOS.

Sin embargo, la mayoría notó que el problema parece estar relacionado con redux-persist lo que probablemente significaría un problema en la capa de javascript con el complemento OneSignal. @avishayil ¿Puedes intentar reproducir el problema con redux-persist e intentar identificar el problema? Comparta el proyecto una vez que lo haga. Puedo intentar depurarlo también.

@ jkasten2 Actualmente no uso redux-persist en mis proyectos, por lo que sería difícil encontrar tiempo para reproducir. Creo que sería más fácil si una de las personas aquí compartiera un repositorio usando redux-persist con el problema reproducido.

No usar redux y esto sigue siendo un problema.

¡Gracias @rcugut ! OneSignal.configure() arréglalo inmediatamente! ¡También estoy usando redux-persist ! ¡Necesito que esto se arregle!

Agregar .configure lo solucionó para mí también, no estoy usando react-persist.

Para mí, OneSignal.configure() hack también funciona, pero noté que OneSignal.removeEventListener("ids", this.onIds) no funciona. No estoy seguro si esto está relacionado. Alguna idea de cómo solucionar este problema?

frente a lo mismo que @junedomingo

En Android, en la primera carga de la aplicación, se llama al evento ids después de 35 segundos

No tengo ningún problema en Android, el evento se inicia sin ningún problema.
Pero lucho en iOS, donde no, nunca, entro en la función onIds() ...
Agregar OneSignal.configure() antes o después de los oyentes del evento y antes o después de que se completara la rehidratación (sí, estoy usando redux-persist ) no ayudó.
¿Alguien tiene una idea?

@ jkasten2 tengo el mismo problema que @junedomingo mencionó aquí sobre el oyente de ids. pongo log fuera y dentro de este método

     OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
            public void idsAvailable(String userId, String registrationId) {
                final WritableMap params = Arguments.createMap();

                params.putString("userId", userId);
                params.putString("pushToken", registrationId);

                sendEvent("OneSignal-idsAvailable", params);
            }
        });

¡Responde después de 30 segundos!
¿tienes alguna idea / solución?

si tiene OneSignal.setRequiresUserPrivacyConsent (true);
¡no funcionará hasta que dé su consentimiento!
OneSignal.provideUserConsent (verdadero);

también llame a OneSignal.configure () después de agregar oyentes.
¡La esperanza funciona para ti!

El mismo problema
versión: v3.3.1
Plataforma: iOS

Como puede ver aquí, userId es nulo, solo después de 29 segundos el detector de eventos se activa con el userId. Esto es en el primer lanzamiento después de una instalación limpia de la aplicación.
Screen Shot 2019-08-05 at 3 04 59 PM

¿Alguien todavía tiene este problema?
El evento solo se activa después de ~ 30 segundos en el arranque claro en Android.

@damathryx Hola, me enfrento al mismo userId null en el primer problema de lanzamiento. ¿Encontraste una solución?

Este problema debería reabrirse 😩

Para mí, las notificaciones push no llegan a Android sin .configure . Los ID se activan bien ahora, se recibe la información del dispositivo, pero las notificaciones en sí no funcionan.

¿Fue útil esta página
0 / 5 - 0 calificaciones