React-native-onesignal: onIds 麻烦

创建于 2017-02-19  ·  25评论  ·  资料来源: OneSignal/react-native-onesignal

嗨,我有一个包含在 Main.js 中的 OneSignalController

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' ...在 redux-persist rehydration 之后被调用 => 告别回调。

修复这里是我(黑客?)修复它的方式,目前(当前的 react-native-onesignal 版本 3.0.3):

有一个未公开的 js 端方法OneSignal.configure()使本机端( androidios )将ids事件广播回 js 端。

因此,在为 'ids' 添加事件侦听器后立即调用它:

// ... 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 服务器? 但是,Doc 说它无论如何都应该返回 null。 我每隔几次尝试就会遇到这个问题,它不一致。 我不确定这个事件现在有多可靠。

我今天在模拟器上再次检查,在通过 OneSignal.requestPermissions() 接受权限后,花了 10 秒的时间来获得“onIds”事件。

我在应用程序中的另一个地方放置了相同的事件,以查看我是否仍然获得 Id,每当我刷新(演示项目行为),但它根本不起作用。

此外,尚不清楚“注册”事件应该是关于在任何情况下都不会触发的原因。

伙计们,当应用程序关闭并再次打开时,该事件永远不会被调用。 我的意思是如果 ids 可用,这不应该每次都被触发吗?

另一个问题是,当用户接受推送通知时,它不会被触发 5 次(平均)。 如果第一个问题没问题,这不会成为问题,因此我们可以在用户下次打开应用程序时获取 id。

我刚开始使用这个库并遇到了同样的问题。 在这里也使用 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' ...在 redux-persist rehydration 之后被调用 => 告别回调。

修复这里是我(黑客?)修复它的方式,目前(当前的 react-native-onesignal 版本 3.0.3):

有一个未公开的 js 端方法OneSignal.configure()使本机端( androidios )将ids事件广播回 js 端。

因此,在为 'ids' 添加事件侦听器后立即调用它:

// ... 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(); 在事件侦听器之前这工作正常。 我什至不确定它是否是 redux-persist。

只是一个简短的说明,我刚刚遇到了这个问题,即 onIds 事件未触发的不稳定行为。

现在将配置函数添加到另一个组件,该组件在应用程序启动后加载一段时间,我有时会触发一个 onIds 事件,有时会触发两个(因为原始事件有时仍然会触发)。

值得注意的是,我没有在发布版本上测试过这个,目前正在 Android、React Native 0.38 上进行调试,因为其他人认为这是一个 redux 持久性问题,值得注意的是我也在使用它。

如果多次调用配置确实没有负面影响,那么我想它很好。 每次用户偶尔恢复应用程序时,我只会处理它两次点击我的 API。

如果这样做有某种负面结果(除了效率低下),请告诉我,因为这不是我的专业领域。

我有同样的,我们正在生产中。 ;) 是的,我调用了 API 两次。 :(

@edo1493 ,我也有同样的问题。 如何调用 API 两次?

我注意到没有重新加载应用程序(开发模式),事件只会在 35 秒后触发

编辑:
这发生在应用程序的第一次加载
平台:安卓

也许@jkasten2可以在这里提供帮助,我认为这个特定库没有问题,

@edo1493 onIds不会触发,除非它可以从 OneSignal 服务器获取玩家/用户 ID。 这意味着userId永远不会是null但是如果 APNs / FCM 没有及时响应, pushToken可能会。 看到的问题似乎与连接有关。 您可以尝试在本机代码中调用setLogLevel以启用网络调用记录吗? 如果您能够在 Android 上重现该问题,它将提供有关在 logcat 与 iOS 的 Xcode 日志中进行的调用的更多详细信息。

然而,大多数人注意到这个问题似乎与redux-persist ,这很可能意味着 OneSignal 插件的 javascript 层中的问题。 @avishayil您可以尝试使用redux-persist重现该问题并尝试找出问题所在吗? 完成后共享项目,我也可以尝试调试它。

@jkasten2我目前没有在我的项目中使用 redux-persist,所以很难找到时间来重现。 我认为如果这里的一个人将使用 redux-persist 与重现的问题共享一个 repo 会更容易。

不使用 redux,这仍然是一个问题。

谢谢@rcuutOneSignal.configure()立即修复! 我也在使用redux-persist ! 需要解决这个问题!

添加 .configure 也为我修复了它,我没有使用 react-persist。

对我来说OneSignal.configure() hack 也有效,但我注意到OneSignal.removeEventListener("ids", this.onIds)不起作用。 不确定这是否相关。 任何想法如何解决这一问题?

面临与@junedomingo 相同的事情

在 android 中,在第一次加载应用程序时,35 秒后调用 ids 事件

我在 Android 上没有任何问题,事件启动没有任何问题。
但是我在 iOS 上挣扎,在那里我永远不会进入onIds()函数......
在事件侦听器之前或之后以及补液完成之前或之后添加OneSignal.configure() (是的,我正在使用redux-persist )没有帮助。
有人有想法吗?

@jkasten2我遇到了@junedomingo在这里提到的关于 ids 侦听器的相同问题。 我把日志放在这个方法的外面和里面

     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

还有人遇到这个问题吗?
该事件仅在 android 中的清除启动后约 30 秒后触发。

@damathryx嗨,我在首次启动问题上面临相同的 userId null。 你找到解决办法了吗?

这个issue应该重开😩

对我来说,没有.configure推送通知不会在 Android 上出现。 现在可以很好地触发 ID,收到设备信息,但通知本身不起作用。

此页面是否有帮助?
0 / 5 - 0 等级