React-native-onesignal: проблемы onIds

Созданный на 19 февр. 2017  ·  25Комментарии  ·  Источник: OneSignal/react-native-onesignal

Привет, у меня есть OneSignalController, который я включаю в 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;
    }
}

Я использую redux-persist и не хочу запускать приложение до завершения rehydration .
так что я хочу сделать это в моем 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
        );
    }

Но если я сделаю oneSignal, больше не вызовет функцию onIds .

Help Wanted

Самый полезный комментарий

Я только начал использовать эту библиотеку и столкнулся с той же проблемой. Здесь тоже используется redux-persist! И после некоторого копания, я твердо убежден , что это связано с перевождь-упорствовать. Или любая отложенная подписка на событие ids .

Следующий код, если его правильно ввести в index.xxx.js (т.е. очень рано при запуске приложения), он будет срабатывать при каждом перезапуске приложения:

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

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

// ....

AppRegistry.registerComponent ....

Однако, если OneSignal.addEventListener('ids' ... вызывается после регидратации с сохранением редукции => поцелуй обратного вызова до свидания.

ИСПРАВИТЬ вот как я (взломал?) Исправил это на данный момент (текущая версия react-native-onesignal 3.0.3):

существует недокументированный метод js-стороны под названием OneSignal.configure() который заставляет нативную сторону ( android и ios ) транслировать событие ids обратно на js-сторону.

Итак, вызовите его сразу после добавления прослушивателя событий для идентификаторов:

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

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

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

По моей оценке того, как это реализовано на нативной стороне, и кажется довольно безопасным вызывать это, даже более одного раза (он просто заменяет внутренний обработчик событий, больше не создает). Но имейте в виду, что он каждый раз запускает слушателей ids .

Теперь мне интересно, будут ли работать другие события, когда слушатели будут добавлены позже при запуске приложения.

Я думаю, что это, вероятно, лучше исправить с помощью библиотеки react-native-onesignal с внутренней очередью подписчиков. Я постараюсь попробовать, возможно, в ближайшем будущем сделаю пул-реквест для этого сценария с отложенной регистрацией слушателей событий.

Все 25 Комментарий

У меня проблемы с onIds, которые иногда не вызываются. Однако это не связано с redux-persist.

Кажется, что серверы OneSignal недоступны? Однако документ говорит, что в любом случае он должен возвращать null. У меня эта проблема возникает каждые несколько попыток, это непоследовательно. Я не уверен, насколько достоверно это событие сейчас.

Сегодня я снова проверял симулятор, и мне потребовалось добрых 10 секунд, чтобы получить событие onIds после принятия разрешений через OneSignal.requestPermissions ().

Я поместил то же событие в другое место в приложении, чтобы проверить, получаю ли я идентификаторы при каждом обновлении (поведение демонстрационного проекта), но оно вообще не работает.

Кроме того, неясно, что должно означать «зарегистрированное» событие, причина которого никогда не запускается в любом случае.

Ребята, событие никогда не вызывается при закрытии и повторном открытии приложения. Я имею в виду, что если идентификаторы доступны, разве это не должно срабатывать каждый раз?

Другая проблема заключается в том, что он не запускается 1 раз из 5 (в среднем), когда пользователь принимает push-уведомления. Это не было бы проблемой, если бы первая проблема была в порядке, поэтому мы могли бы получить идентификатор в следующий раз, когда пользователь откроет приложение.

Я только начал использовать эту библиотеку и столкнулся с той же проблемой. Здесь тоже используется redux-persist! И после некоторого копания, я твердо убежден , что это связано с перевождь-упорствовать. Или любая отложенная подписка на событие ids .

Следующий код, если его правильно ввести в index.xxx.js (т.е. очень рано при запуске приложения), он будет срабатывать при каждом перезапуске приложения:

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

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

// ....

AppRegistry.registerComponent ....

Однако, если OneSignal.addEventListener('ids' ... вызывается после регидратации с сохранением редукции => поцелуй обратного вызова до свидания.

ИСПРАВИТЬ вот как я (взломал?) Исправил это на данный момент (текущая версия react-native-onesignal 3.0.3):

существует недокументированный метод js-стороны под названием OneSignal.configure() который заставляет нативную сторону ( android и ios ) транслировать событие ids обратно на js-сторону.

Итак, вызовите его сразу после добавления прослушивателя событий для идентификаторов:

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

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

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

По моей оценке того, как это реализовано на нативной стороне, и кажется довольно безопасным вызывать это, даже более одного раза (он просто заменяет внутренний обработчик событий, больше не создает). Но имейте в виду, что он каждый раз запускает слушателей ids .

Теперь мне интересно, будут ли работать другие события, когда слушатели будут добавлены позже при запуске приложения.

Я думаю, что это, вероятно, лучше исправить с помощью библиотеки react-native-onesignal с внутренней очередью подписчиков. Я постараюсь попробовать, возможно, в ближайшем будущем сделаю пул-реквест для этого сценария с отложенной регистрацией слушателей событий.

Если вы вызываете OneSignal.configure (); перед слушателем событий это работает нормально. Я даже не уверен, сохраняется ли это сокращение.

Просто небольшое примечание. У меня только что возникла проблема с неустойчивым поведением, когда событие onIds не запускалось.

Теперь, добавив функцию настройки к другому компоненту, который загружается немного позже при запуске приложения, я иногда получаю одно событие onIds, а иногда два (поскольку исходное событие все еще срабатывает).

Стоит отметить, что я не тестировал это на сборках релизов и в настоящее время отлаживаю его на Android, React Native 0.38, и, поскольку другие предположили, что это проблема с сохранением редукции, стоит отметить, что я тоже использую ее.

Если действительно нет отрицательного влияния на вызов configure несколько раз, я думаю, все в порядке. Я просто разберусь с этим, дважды ударяя мой API каждый раз, когда пользователь иногда возобновляет приложение.

Если есть какой-то негативный результат (кроме неэффективности), дайте мне знать, поскольку это не область моей компетенции.

У меня такой же, и мы в производстве. ;) Да, я дважды вызываю API. :(

Привет @ edo1493 , у меня такая же проблема. Как вызвать API дважды?

Я заметил, что без перезагрузки приложения (режим разработки) событие сработает только через 35 секунд.

Редактировать:
Это происходит при первой загрузке приложения.
Платформа: Android

Может быть, @ jkasten2 сможет здесь помочь, я думаю, что это не проблема с этой конкретной библиотекой,

@ edo1493 onIds не сработает, если не получит идентификатор игрока / пользователя с сервера OneSignal. Это означает, что userId никогда не будет null однако pushToken может быть, если APN / FCM не ответят вовремя. Проблема, похоже, связана с подключением. Можете ли вы попробовать вызвать setLogLevel в машинном коде, чтобы включить регистрацию сетевых вызовов? Если вы можете воспроизвести проблему с Android, он предоставит более подробную информацию о вызовах, выполняемых в logcat, по сравнению с журналом Xcode с iOS.

Однако наиболее заметная проблема, похоже, связана с redux-persist что, скорее всего, будет означать проблему на уровне javascript с плагином OneSignal. @avishayil Можете ли вы воспроизвести проблему с помощью redux-persist и попытаться определить причину проблемы? Поделитесь проектом, как только вы это сделаете, я тоже могу попробовать отладить его.

@ jkasten2 В настоящее время я не использую

Не использовать redux, и это все еще проблема.

Спасибо @rcugut ! OneSignal.configure() исправьте это немедленно! Я тоже использую redux-persist ! Это нужно исправить!

Добавление .configure тоже исправило это для меня, я не использую response-persist.

Для меня OneSignal.configure() hack тоже работает, но я заметил, что OneSignal.removeEventListener("ids", this.onIds) не работает. Не уверен, связано ли это. Любые идеи, как это исправить?

сталкивается с тем же, что и @junedomingo

В Android при первой загрузке приложения событие ids вызывается через 35 секунд.

У меня нет проблем с Android, событие запускается без проблем.
Но у меня проблемы с iOS, где я никогда не попадаю в функцию onIds() ...
Добавление OneSignal.configure() до или после прослушивателей событий и до или после завершения регидратации (да, я использую redux-persist ) не помогло.
Есть у кого-нибудь идея?

@ jkasten2 У меня та же проблема, о которой упоминал

     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);
            }
        });

он отвечает через 30 секунд!
у вас есть идея / решение?

если у вас есть OneSignal.setRequiresUserPrivacyConsent (true);
это не сработает, пока вы не дадите согласие!
OneSignal.provideUserConsent (true);

также вызовите OneSignal.configure () после добавления слушателей.
Надежда работает на вас !!!

Та же проблема
версия: v3.3.1
Платформа: iOS

Как вы можете видеть, здесь userId имеет значение null, только через 29 секунд прослушиватель событий запускается с userId. Это при первом запуске после чистой установки приложения.
Screen Shot 2019-08-05 at 3 04 59 PM

У кого-нибудь еще есть эта проблема?
Событие запускается только через ~ 30 секунд при чистой загрузке в android.

@damathryx Привет, я столкнулся с тем же значением userId null при первом запуске. Вы нашли исправление?

Этот вопрос следует открыть повторно 😩

На мой взгляд, push-уведомления не приходят на Android без .configure . Идентификаторы теперь срабатывают нормально, информация об устройстве получена, но сами уведомления не работают.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги