描述:
大家好你们好。 我在 android 上遇到了 onOpened/onReceived 事件的问题。 模拟器和真实设备上的行为不同,但在两种情况下都会传递准确的推送消息。
在模拟器上:
在真实设备上:
环境
重现问题的步骤:
由于我公司的保密政策,无法提供重现步骤。
还要别的吗:
android/build.gradle
```// 顶级构建文件,您可以在其中添加所有子项目/模块通用的配置选项。
构建脚本 {
存储库{
中心()
谷歌()
}
依赖{
类路径'com.android.tools. 构建:分级:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
所有项目{
存储库{
maven { url " https://jitpack.io " } // 用于 MPAndroidChart
mavenLocal()
谷歌()
中心()
行家{
// 所有的 React Native(JS、Obj-C 源代码、Android 二进制文件)都是从 npm 安装的
网址“$rootDir/../node_modules/react-native/android”
}
}
}
`android/app/build.gradle`
应用插件:'com.onesignal.androidsdk.onesignal-gradle-plugin'
应用插件:“com.android.application”
导入 com.android.build.OutputFile
构建脚本 {
存储库{
maven { url ' https://plugins.gradle.org/m2/ ' } // Gradle 插件门户
}
依赖{
类路径'gradle.plugin.com. onesignal:onesignal-gradle-plugin :[0.10.0, 0.99.99]'
}
}
应用插件:'com.onesignal.androidsdk.onesignal-gradle-plugin'
/**
react-native bundle
apply from: "../../node_modules/react-native/react.gradle"
行。项目.ext.react = [
cliPath:“node_modules/haul/bin/cli.js”
]
申请自:“../../node_modules/react-native/react.gradle”
/**
/**
安卓 {
compileSdkVersion 27
构建工具版本“27.0.3”
defaultConfig {
applicationId "com.binomysteryshopper"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
signingConfigs {
release {
if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
storeFile file(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD
}
}
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86"
}
}
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
def versionCodes = ["armeabi-v7a":1, "x86":2]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
}
}
}
}
依赖{
编译(项目(':react-native-onesignal')){
排除组:“com.google.android.gms”
}
编译(“com.google.android.gms:play-services-base:12.0.1”){
力=真;
}
编译项目(':react-native-sound')
编译项目(':react-native-audio')
编译项目(':react-native-fetch-blob')
编译项目(':react-native-fs')
编译项目(':react-native-geocoder')
编译项目(':react-native-image-crop-picker')
编译项目(':react-native-version-check')
编译项目(':react-native-charts-wrapper')
编译项目(':react-native-spinkit')
编译项目(':react-native-svg')
编译项目(':react-native-maps')
编译 fileTree(dir: "libs", include: ["*.jar"])
编译“ com.android.support:appcompat-v7:23.0.1 ”
编译 "com.facebook.react :react-native :+" // 来自 node_modules
}
// 运行一次即可使用 BUCK 运行应用程序
// 将所有编译依赖项放入文件夹 libs 以供 BUCK 使用
任务copyDownloadableDepsToLibs(类型:复制){
来自configurations.compile
进入“库”
}
`android/app/src/main/java/com/binomysteryshopper/MainApplication.java`
包 com.binomysteryshopper;
导入android.app.Application;
导入 com.facebook.react.ReactApplication;
导入 com.geektime.rnonesignalandroid.ReactNativeOneSignalPackage;
导入 com.zmxv.RNSound.RNSoundPackage;
导入 com.rnim.rn.audio.ReactNativeAudioPackage;
导入 com.RNFetchBlob.RNFetchBlobPackage;
导入 com.rnfs.RNFSPackage;
导入 com.reactnative.ivpusic.imagepicker.PickerPackage;
导入 io.xogus.reactnative.versioncheck.RNVersionCheckPackage;
导入 com.github.wuxudong.rncharts.MPAndroidChartPackage;
导入 com.react.rnspinkit.RNSpinkitPackage;
导入 com.horcrux.svg.SvgPackage;
导入 com.facebook.react.ReactNativeHost;
导入 com.facebook.react.ReactPackage;
导入 com.facebook.react.shell.MainReactPackage;
导入 com.devfd.RNGeocoder.RNGeocoderPackage;
导入 com.facebook.soloader.SoLoader;
导入 com.airbnb.android.react.maps.MapsPackage;
导入 java.util.Arrays;
导入 java.util.List;
公共类 MainApplication 扩展应用程序实现 ReactApplication {
私有最终 ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
公共布尔 getUseDeveloperSupport() {
返回 BuildConfig.DEBUG;
}
<strong i="13">@Override</strong>
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactNativeOneSignalPackage(),
new RNSoundPackage(),
new ReactNativeAudioPackage(),
new RNFetchBlobPackage(),
new RNFSPackage(),
new PickerPackage(),
new RNVersionCheckPackage(),
new MPAndroidChartPackage(),
new RNSpinkitPackage(),
new RNGeocoderPackage(),
new SvgPackage(),
new MapsPackage()
);
}
<strong i="14">@Override</strong>
protected String getJSMainModuleName() {
return "index";
}
};
@Override
公共 ReactNativeHost getReactNativeHost() {
返回 mReactNativeHost;
}
@Override
公共无效 onCreate() {
超级.onCreate();
SoLoader.init(this, /* native exopackage */ false);
}
}
`AndroidManifest.xml`
android:targetSdkVersion="22" />
机器人:allowBackup="真"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
机器人:大堆=“真”
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="binoshopper" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
`my OneSignal init`
组件WillMount() {
OneSignal.init(ONESIGNAL_APP_ID, {
kOSSettingsKeyAutoPrompt:真,
kOSSettingsKeyInAppLaunchURL:假,
kOSSSettingsKeyPromptBeforeOpeningPushURL: true,
})
OneSignal.inFocusDisplaying(2)
OneSignal.addEventListener('received', this.onPushNotificationReceived)
OneSignal.addEventListener('opened', this.onPushNotificationOpened)
}
组件WillUnmount() {
OneSignal.removeEventListener('received', this.onPushNotificationReceived)
OneSignal.removeEventListener('opened', this.onPushNotificationOpened)
}
onPushNotificationReceived(通知) {
Alert.alert('onReceived') // 用于在真实设备上进行测试
}
onPushNotificationOpened(openResult) {
Alert.alert('onOpened') // 用于真实设备上的测试
}
```
在 IOS 上运行完美。 不幸的是,我无法提供来自 android logcat 的日志,因为我没有真正的设备。 由于 TeamViewer,我正在我远方朋友的设备上进行测试。
我还尝试在真实设备上OneSignal.setLogLevel(0, 6)
。 但是没有发现任何错误,所有请求都成功了,只有事件没有触发。
嗨@Ble3k ,我们最近一直在忙于开发新的 Flutter SDK,还没有时间调查您的问题,但是我明天会进行调查,很快就会回复您,对于延误表示歉意!
你好,
只是想说我在开发设备上看到了 3.2.5 上的相同行为。 很奇怪,因为我最近没有改变任何东西,而且我很确定它在几天前就起作用了,因为我的重点推送显示为应用内祝酒词,我记得我测试过这些并且它正在工作。
我不会进一步调查,因为我们决定转移到正常的推送通知,即使应用程序是专注的
@Nightsd01 Thx,将等待您的调查。
在 Android 上接收通知延迟,在我的 android 手机上测试并在 30-40 分钟后收到通知,多次测试
这事有进一步更新吗? 我在 Android 设备(三星 Galaxy S7)上遇到了同样的问题。
没有任何 onOpened 或 onReceived 事件被触发,但是,正在接收通知。 当 onOpened 事件被触发时,我们需要能够将用户导航到特定屏幕。
是否有人对通过双击 R 或使用 react-native-restart 包重新加载本机 android 应用程序后未触发的事件(接收、打开)有问题。
@ackosumane我实际上在我的开发工作流程中经常使用 Expo 和Updates.reload()
。
你是对的:
@Nightsd01所以看起来 OneSignal RN Android 集成目前不能很好地支持应用程序重新加载。 它不像我想象的那样有影响力,大多数时候用户不会重新加载应用程序,但在某些生产案例中,我们希望用户重新加载应用程序(OverTheAir 更新,如 Expo/CodePush,或用户注销?)。 在这种情况下,重新加载后推送不会被破坏会很棒;)
@Nightsd01嗨,有更新吗?
你好,我也面临同样的问题。任何解决方案?
作为此问题的更新:我们计划在下一次更新中解决此问题!
@Nightsd01 有日期吗? 有没有我们可以用修复分叉的分支?
@sofianegargouri这是公关: https ://github.com/geektimecoil/react-native-onesignal/pull/592
我们将在明天或后天发布更新。
谢谢@Nightsd01 ,我猜这个问题可以关闭
你能发布一个新的 npm 版本吗?
对于遇到此问题的任何人,master 的代码现在运行良好。
只需运行以下命令:
npm install git+ https://github.com/geektimecoil/react-native-onesignal#master --save
@eabuslaiman30仍然面临问题。 如上所述,我正在使用 git+ https://github.com/geektimecoil/react-native-onesignal#master 。 在android中仍然没有触发任何事件。 任何人都可以建议哪个最新版本是稳定的? 以前我使用的是 3.0.5 版本,除了应用程序被杀死并且在 android 8.0 (Oreo) 中没有收到通知外,它工作正常。 为了解决这个问题,我更新到最新版本,我收到了这个错误。
@eabuslaiman30 @Nightsd01我也试过了,就像@shahchaitanya我仍然面临这个问题。
我做了一个 PR 似乎可以解决听众不再订阅的问题: https ://github.com/geektimecoil/react-native-onesignal/pull/593
@shahchaitanya ,您可以通过这个微小的更改来编辑本地项目 Java 代码,这应该可以暂时解决您的问题。
嘿@slorber您的解决方案触发 onOpened 和 onReceived 方法。 但是onIds事件还没有触发? 您是否检查了代码中是否触发了 onIds 事件? 我在想坚持 react-native-onesignal 版本 3.0.5 直到最新版本变得稳定。
我刚刚测试过,所有 3 个回调都会在我的应用程序重启时触发,从 onIds 开始。
即使 onIds 没有触发,对我来说也没什么大不了的,因为 id 不太可能在重启后发生变化,并且它们已经发送到我的后端。
@slorber对我来说,如果 onIds 在重新启动应用程序时没有触发,这很重要。 我也将 idToken 存储在本地存储和后端。 在注销时,我将其从后端中删除,并且不知何故,如果用户清除本地存储,那么如果 onIds 每次都没有触发,我如何获取用户的 idToken。 在 3.2.0 (Major Update) 之前的版本中,每次重启应用时都会触发 onIds。
嘿伙计们@slorber @shahchaitanya。 让我复制一些我的实现代码,也许它会对你有所帮助(我需要添加一些以前版本不需要的代码行)。
OneSignal.init('YOUR_APP_ID');
OneSignal.addEventListener('ids', this.onIds);
OneSignal.configure();
例如,我在以前的版本中没有使用“init”函数,因为初始化显然是通过 Java 代码完成的。
此外,我使用npm install git+https://github.com/geektimecoil/react-native-onesignal\#master --save
作为依赖项,并且我正确接收了三个事件(onIds、接收、打开)。
我也在使用 init 和 configure 并记住在不调用 configure 时 ids 没有触发的问题
OneSignal.init(OneSignalAppId, OneSignalSettings);
OneSignal.addEventListener('received', onReceived);
OneSignal.addEventListener('opened', onOpened);
OneSignal.addEventListener('ids', onIds);
// Quickfix for ids event not firing!
// See https://github.com/geektimecoil/react-native-onesignal/issues/200#issuecomment-288579373
OneSignal.configure();
OneSignal.inFocusDisplaying(inFocusDisplaying);
OneSignal.setSubscription(true);
OneSignal.syncHashedEmail(email);
OneSignal.sendTags(tags);
@slorber @eabuslaiman30现在它工作正常。 我错过了添加 OneSignal.configure()。 以前我不需要它来触发 onIds 监听器。 嘿@slorber现在我不需要添加你上面提到的那个补丁。 @eabuslaiman30解决方案工作得非常好。
完美的@shahchaitanya ,我很高兴它成功了!
我们将很快发布包含此修复程序的正式版本。
我最近修复了 Android SDK 的一个重大问题,所以在发布官方 react-native 更新之前,我正在等待 PR 得到审核。
感谢大家的耐心等待! 同时,您可以简单地使用 master
@shahchaitanya ids
事件旨在在用户的 ID 或使用 OneSignal 更改的推送令牌时简单地触发。 如果自上次使用您的应用程序后它们没有更改,则默认情况下不会触发这些事件。
这是令人困惑的遗留代码,我打算在下一个主要版本中对其进行重构,使其更加直观。
您可以通过调用configure()
来强制它们开火,但我不推荐这样做。 一个更优雅的解决方案是调用OneSignal.getPermissionSubscriptionState()
它将包含用户的 OneSignal ID
现在应该在 3.2.6 中修复问题(以及其他一些问题)。 感谢大家的耐心等待!
你好! 我仍然在 Android 上遇到这个问题(未完全检查 iOS)。
我在 3.2.6 版本上,我的事件监听器设置是......
componentDidMount() {
OneSignal.init(APP_ID, { kOSSettingsKeyAutoPrompt: true });
OneSignal.addEventListener('ids', this.onIds);
OneSignal.addEventListener('opened', (result) => alert('text'));
OneSignal.inFocusDisplaying(2);
// OneSignal.setLogLevel(0, 6);
OneSignal.configure();
}
componentWillUnmount() {
OneSignal.removeEventListener('ids', this.onIds);
OneSignal.removeEventListener('opened', (result) => alert('text'));
}
@joefazz我无法重现您的问题,您可以尝试运行yarn remove react-native onesignal
和yarn add react-native-onesignal
以确保它已更新到 3.2.6 吗? 如果是这样,我将重新打开这个问题。
这个问题对你来说是 100% 发生的吗?
你能在我们的演示项目中重现这个问题吗?
它确实发生了 100% 的时间,并且在删除和阅读后仍然发生。
我将尝试在今天晚些时候的某个时间进行复制,并根据我的发现编辑此评论。
我不知道它有多相关,但在我正在处理的项目中,我们使用的是 3.0.9 版本并一直升级到 3.2.6。 我运行 react-native unlink 然后重新链接,手动升级 iOS 并删除所有本机初始化以使用 OneSignal.init() 方法。
编辑:不知道发生了什么,但它现在在 Android 上 100% 的时间都在工作,感谢您的帮助,抱歉对已关闭的问题发表评论😅
如果有人在 3.2.6 或更高版本中再次看到此问题,请随时打开一个新问题。
@joefazz很高兴听到它! 我修复了导致初始问题的问题,但完全有可能发生某种竞争情况。 如果您再次看到此问题,请随时打开一个新问题
在我的应用程序中,新版本解决了我的问题,但我没有看到@joefazz报告的行为
大家好,我有同样的问题OneSignal.addEventListener('opened', (result) => console.log(result));
没有从应用程序的第二次启动中被解雇。 在后台模式下,第一个通知正在获得“打开”事件,杀死应用程序 => 获取通知 =>“打开”将永远不会再次触发。
只有 android - 8 版本
仅在应用程序处于后台时的第二次通知后
react-native-onesignal - 3.9.1
我有同样的问题。 当应用程序在后台时打开不会调用是否有任何修复
@kostiantyn-solianyk @shrolr ,
总而言之,在 Android 8 中第二次打开应用程序时,'opened' 事件不会触发。
传统事件在即将到来的主要版本(现在处于 Beta 版)中被弃用。 我建议迁移到测试版并尝试重现该问题。
如果问题仍然存在,请通过打开一个新问题告知我们。
干杯
最有用的评论
@sofianegargouri这是公关: https ://github.com/geektimecoil/react-native-onesignal/pull/592
我们将在明天或后天发布更新。