React-native-onesignal: problemas onIds

Criado em 19 fev. 2017  ·  25Comentários  ·  Fonte: OneSignal/react-native-onesignal

Olá, tenho OneSignalController que incluo no 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;
    }
}

Eu uso redux-persist e não quero iniciar o aplicativo antes de rehydration terminar.
então eu quero fazer isso no meu 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
        );
    }

Mas se eu fizer isso, oneSignal não acionará mais a função onIds .

Help Wanted

Comentários muito úteis

Acabei de começar a usar esta biblioteca e tive o mesmo problema. Usando redux-persist aqui também! E depois de alguma escavação, acredito fortemente que tem a ver com redux-persist. Ou qualquer inscrição atrasada para o evento ids .

O código a seguir, se colocado em index.xxx.js (ou seja, bem no início do aplicativo), será acionado a cada reinicialização do aplicativo:

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

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

// ....

AppRegistry.registerComponent ....

No entanto, se o OneSignal.addEventListener('ids' ... for chamado após a reidratação redux-persist => dê adeus ao callback.

CORRIGIR aqui está como eu (hack?) Consertei, por enquanto (versão atual react-native-onesignal versão 3.0.3):

existe um método não documentado do lado js chamado OneSignal.configure() que faz com que o lado nativo ( android e ios ) transmita o evento ids volta para o lado js.

Então, chame-o logo após adicionar o ouvinte de evento para 'ids':

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

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

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

Pela minha avaliação de como ele é implementado no lado nativo e parece ser bastante seguro chamar isso, ainda mais de uma vez (ele apenas substitui o manipulador de eventos interno, não cria mais). Mas lembre-se de que ele dispara os ouvintes ids todas as vezes.

Agora me pergunto se os outros eventos funcionarão quando os ouvintes forem adicionados posteriormente na inicialização do aplicativo.

Eu acho que isso provavelmente deve ser corrigido melhor pela lib react-native-onesignal com uma fila de assinantes interna. Vou tentar tentar, talvez fazer um pull-request em um futuro próximo para este cenário com registro atrasado de ouvintes de evento.

Todos 25 comentários

Estou tendo alguns problemas com o onIds, que às vezes não é chamado. No entanto, isso não está relacionado a redux-persist.

Parece que os servidores OneSignal não estão acessíveis? No entanto, o Doc diz que ele deve retornar nulo de qualquer maneira. Estou tendo esse problema a cada poucas tentativas, não é consistente. Não tenho certeza de quão confiável este evento é agora.

Eu estava checando novamente no simulador hoje e demorou uns bons 10 segundos para obter o evento "onIds", após ter aceito as permissões através de OneSignal.requestPermissions ().

Coloquei o mesmo evento em outro lugar dentro do aplicativo para ver se ainda obtenho os Ids, sempre que atualizar (comportamento do projeto de demonstração), mas não funciona de todo.

Além disso, não está claro o que o evento "registrado" deve ser sobre a causa que nunca foi acionada em nenhum caso.

Pessoal, o evento nunca é chamado quando o app é fechado e aberto novamente. Quero dizer, se os ids estiverem disponíveis, isso não deveria ser acionado todas as vezes?

O outro problema é que ele não é acionado 1 em 5 vezes (média), quando o usuário aceita notificações push. Isso não seria um problema se o primeiro problema estivesse bem, então poderíamos pegar o id na próxima vez que o usuário abrir o aplicativo.

Acabei de começar a usar esta biblioteca e tive o mesmo problema. Usando redux-persist aqui também! E depois de alguma escavação, acredito fortemente que tem a ver com redux-persist. Ou qualquer inscrição atrasada para o evento ids .

O código a seguir, se colocado em index.xxx.js (ou seja, bem no início do aplicativo), será acionado a cada reinicialização do aplicativo:

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

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

// ....

AppRegistry.registerComponent ....

No entanto, se o OneSignal.addEventListener('ids' ... for chamado após a reidratação redux-persist => dê adeus ao callback.

CORRIGIR aqui está como eu (hack?) Consertei, por enquanto (versão atual react-native-onesignal versão 3.0.3):

existe um método não documentado do lado js chamado OneSignal.configure() que faz com que o lado nativo ( android e ios ) transmita o evento ids volta para o lado js.

Então, chame-o logo após adicionar o ouvinte de evento para 'ids':

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

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

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

Pela minha avaliação de como ele é implementado no lado nativo e parece ser bastante seguro chamar isso, ainda mais de uma vez (ele apenas substitui o manipulador de eventos interno, não cria mais). Mas lembre-se de que ele dispara os ouvintes ids todas as vezes.

Agora me pergunto se os outros eventos funcionarão quando os ouvintes forem adicionados posteriormente na inicialização do aplicativo.

Eu acho que isso provavelmente deve ser corrigido melhor pela lib react-native-onesignal com uma fila de assinantes interna. Vou tentar tentar, talvez fazer um pull-request em um futuro próximo para este cenário com registro atrasado de ouvintes de evento.

Se você chamar OneSignal.configure (); antes do ouvinte de evento, isso funciona bem. Eu nem tenho certeza se é redux-persist.

Apenas uma nota rápida. Acabei de ter esse problema com o comportamento errático com o evento onIds não disparando.

Agora, tendo adicionado a função de configuração a outro componente que carrega um pouco mais tarde no lançamento do aplicativo, às vezes recebo um único evento onIds disparando e às vezes dois (já que o original ainda dispara ocasionalmente).

É importante notar que eu não testei isso em compilações de lançamento e atualmente estou depurando no Android, React Native 0.38 e como outros sugeriram que este é um problema de persistência de redux, é importante notar que estou usando isso também.

Se de fato não houver nenhum efeito negativo em chamar o configure várias vezes, acho que não há problema. Vou lidar com isso atingindo minha API duas vezes cada vez que um usuário reiniciar o aplicativo ocasionalmente.

Se houver algum tipo de resultado negativo em fazer isso (além de ineficiência), por favor, me avise, pois esta não é uma área de especialização para mim.

Eu tenho o mesmo e estamos em produção. ;) Sim, estou chamando a API duas vezes. :(

Olá @ edo1493 , também estou tendo o mesmo problema. Como faço para chamar a API duas vezes?

Percebi que sem recarregar o aplicativo (modo Dev), o evento só será disparado após 35s

Editar:
Isso acontece na primeira carga do aplicativo
Plataforma: Android

Talvez @ jkasten2 possa ajudar aqui, acho que não é um problema com esta biblioteca específica,

@ edo1493 onIds não disparará a menos que possa obter um ID de jogador / usuário do servidor OneSignal. Isso significa que userId nunca será null mas pushToken poderá se os APNs / FCM não responderem a tempo. O problema parece estar relacionado à conexão. Você pode tentar chamar setLogLevel em código nativo para habilitar o registro de chamadas de rede? Se você conseguir reproduzir o problema com o Android, ele fornecerá mais detalhes sobre as chamadas feitas no logcat em comparação ao log do Xcode com iOS.

No entanto, a maioria notou que o problema parece estar relacionado a redux-persist que provavelmente significaria um problema na camada de javascript com o plug-in OneSignal. @avishayil Você pode tentar reproduzir o problema com redux-persist e tentar apontar o problema? Depois de compartilhar o projeto, posso tentar depurá-lo também.

@ jkasten2 Atualmente não estou usando redux-persist em meus projetos, então seria difícil encontrar tempo para reproduzir. Acho que seria mais fácil se alguém aqui compartilhasse um repo usando redux-persist com o problema reproduzido.

Não usar redux e isso ainda é um problema.

Obrigado @rcugut ! OneSignal.configure() conserte imediatamente! Estou usando redux-persist também! Precisa que isso seja consertado!

Adicionar .configure corrigiu para mim também, não estou usando react-persist.

Para mim, OneSignal.configure() hack também funciona, mas percebi que OneSignal.removeEventListener("ids", this.onIds) não está funcionando. Não tenho certeza se isso está relacionado. Alguma ideia de como consertar isso?

enfrentando a mesma coisa que @junedomingo

No Android, no primeiro carregamento do aplicativo, o evento ids é chamado após 35 segundos

Não tenho nenhum problema no Android, o evento dispara sem problemas.
Mas tenho dificuldades em iOS, onde nunca, nunca, entro na função onIds() ...
Adicionar OneSignal.configure() antes ou depois dos ouvintes do evento e antes ou depois que a reidratação foi concluída (sim, estou usando redux-persist ) não ajudou.
Alguém tem uma ideia?

@ jkasten2 eu tenho o mesmo problema que @junedomingo mencionou aqui sobre no ouvinte de ids. eu coloco log fora e dentro deste 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);
            }
        });

ele responde após 30 segundos!
você tem alguma ideia / solução?

se você tiver OneSignal.setRequiresUserPrivacyConsent (true);
não funcionará até que você dê o seu consentimento!
OneSignal.provideUserConsent (true);

também chame OneSignal.configure () após adicionar ouvintes.
Espero que funcione para você !!!

Mesmo problema
versão: v3.3.1
Plataforma: iOS

Como você pode ver aqui, userId é nulo, somente após 29 segundos o ouvinte de evento é acionado com o userId. Este é o primeiro lançamento após a instalação limpa do aplicativo.
Screen Shot 2019-08-05 at 3 04 59 PM

Alguém ainda está com esse problema?
O evento só é acionado após ~ 30seg na inicialização limpa no Android.

@damathryx Olá, estou enfrentando o mesmo userId null no primeiro problema de inicialização. Você encontrou uma solução para isso?

Este problema deve ser reaberto 😩

Para mim, as notificações push não estão chegando no Android sem .configure . Os IDs são acionados corretamente agora, as informações do dispositivo são recebidas, mas as notificações em si não funcionam.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

andrewworld picture andrewworld  ·  3Comentários

GeoffreyPlitt picture GeoffreyPlitt  ·  4Comentários

carloscuesta picture carloscuesta  ·  4Comentários

bitcoinvsalts picture bitcoinvsalts  ·  5Comentários

rfmejia picture rfmejia  ·  3Comentários