Привет, у меня есть 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
.
У меня проблемы с 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. Это при первом запуске после чистой установки приложения.
У кого-нибудь еще есть эта проблема?
Событие запускается только через ~ 30 секунд при чистой загрузке в android.
@damathryx Привет, я столкнулся с тем же значением userId null при первом запуске. Вы нашли исправление?
Этот вопрос следует открыть повторно 😩
На мой взгляд, push-уведомления не приходят на Android без .configure
. Идентификаторы теперь срабатывают нормально, информация об устройстве получена, но сами уведомления не работают.
Самый полезный комментарий
Я только начал использовать эту библиотеку и столкнулся с той же проблемой. Здесь тоже используется redux-persist! И после некоторого копания, я твердо убежден , что это связано с перевождь-упорствовать. Или любая отложенная подписка на событие
ids
.Следующий код, если его правильно ввести в
index.xxx.js
(т.е. очень рано при запуске приложения), он будет срабатывать при каждом перезапуске приложения:Однако, если
OneSignal.addEventListener('ids' ...
вызывается после регидратации с сохранением редукции => поцелуй обратного вызова до свидания.ИСПРАВИТЬ вот как я (взломал?) Исправил это на данный момент (текущая версия react-native-onesignal 3.0.3):
существует недокументированный метод js-стороны под названием
OneSignal.configure()
который заставляет нативную сторону ( android и ios ) транслировать событиеids
обратно на js-сторону.Итак, вызовите его сразу после добавления прослушивателя событий для идентификаторов:
По моей оценке того, как это реализовано на нативной стороне, и кажется довольно безопасным вызывать это, даже более одного раза (он просто заменяет внутренний обработчик событий, больше не создает). Но имейте в виду, что он каждый раз запускает слушателей
ids
.Теперь мне интересно, будут ли работать другие события, когда слушатели будут добавлены позже при запуске приложения.
Я думаю, что это, вероятно, лучше исправить с помощью библиотеки react-native-onesignal с внутренней очередью подписчиков. Я постараюсь попробовать, возможно, в ближайшем будущем сделаю пул-реквест для этого сценария с отложенной регистрацией слушателей событий.