React-native-onesignal: onOpened/onReceived 事件不会在 android 上触发

创建于 2018-07-09  ·  35评论  ·  资料来源: OneSignal/react-native-onesignal

描述:
大家好你们好。 我在 android 上遇到了 onOpened/onReceived 事件的问题。 模拟器和真实设备上的行为不同,但在两种情况下都会传递准确的推送消息。

在模拟器上:

  1. 前台 - 调用 onReceived 事件,仅在轻按推送时调用 onOpened(正确)
  2. 背景活动 - 根本没有触发(不正确)
  3. 后台不活动(应用程序已关闭)-仅在轻按推送时调用 onOpened(正确)

在真实设备上:

  1. 前景 - 根本没有开火(不正确)
  2. 背景活动 - 根本没有触发(不正确)
  3. 后台不活动(应用程序已关闭)-仅在轻按推送时调用 onOpened(正确)

环境

  1. 反应原生单信号:“3.2.4”
  2. 反应原生:“0.50.4”
  3. compileSdkVersion:“27”
  4. 构建工具版本:“27.0.3”
  5. 毕业:“4.1”

重现问题的步骤:
由于我公司的保密政策,无法提供重现步骤。

还要别的吗:
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.gradle 文件为每个构建变体注册一个任务(例如 bundleDebugJsAndAssets
  • 和 bundleReleaseJsAndAssets)。
  • 这些基本上在 Android 构建期间使用正确的参数调用react-native bundle
  • 循环。 默认情况下,bundleDebugJsAndAssets 被跳过,因为在调试/开发模式下,我们更喜欢加载
  • 直接从开发服务器捆绑。 您可以在下面看到所有可能的配置
  • 及其默认值。 如果您决定添加配置块,请确保在
  • apply from: "../../node_modules/react-native/react.gradle"行。
    *
  • 项目.ext.react = [
  • // 包含您的 JS 包的生成资产文件的名称
  • bundleAssetName: "index.android.bundle",
    *
  • // bundle 生成的入口文件
  • entryFile: "index.android.js",
    *
  • // 是否在调试模式下捆绑 JS 和 assets
  • 捆绑调试:假,
    *
  • // 是否在发布模式下捆绑 JS 和 assets
  • 捆绑释放:真,
    *
  • // 是否在另一个构建变体中捆绑 JS 和资产(如果已配置)。
  • // 见http://tools.android.com/tech-docs/new-build-system/user-guide#TOC -Build-Variants
  • // 配置属性可以是以下格式
  • // 'bundleIn${productFlavor}${buildType}'
  • // 'bundleIn${buildType}'
  • // bundleInFreeDebug: true,
  • // bundleInPaidRelease: true,
  • // bundleInBeta: true,
    *
  • // 是否在自定义构建变体中禁用开发模式(默认仅在发布时禁用)
  • // 例如:在暂存构建类型中禁用开发模式(如果已配置)
  • devDisabledInStaging:真,
  • // 配置属性可以是以下格式
  • // 'devDisabledIn${productFlavor}${buildType}'
  • // 'devDisabledIn${buildType}'
    *
  • // 项目的根目录,即“package.json”所在的位置
  • 根: ”../../”,
    *
  • // 将 JS 包资源置于调试模式的位置
  • jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
    *
  • // 将 JS 捆绑资源置于发布模式的位置
  • jsBundleDirRelease: "$buildDir/intermediates/assets/release",
    *
  • // 在哪里放置可绘制资源/React Native 资产,例如你使用的那些
  • // require('./image.png')),在调试模式下
  • resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
    *
  • // 在哪里放置可绘制资源/React Native 资产,例如你使用的那些
  • // require('./image.png')),在发布模式下
  • resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
    *
  • // 默认情况下,如果没有 JS 文件或资产更改,则跳过 gradle 任务; 这意味着
  • // 我们不查看 android/ 或 ios/ 中的文件来确定任务是否达到
  • // 日期; 如果您有任何其他出于性能原因要忽略的文件夹(gradle
  • // 索引整个树),在此处添加它们。 或者,如果您在 android/ 中有 JS 文件
  • // 例如,您可能希望从此处删除它。
  • 输入排除:[“android/ ”,“ios/ ”],
    *
  • // 覆盖调用哪个节点以及使用哪些附加参数
  • nodeExecutableAndArgs:[“节点”],
    *
  • // 为打包器提供额外的参数
  • extraPackagerArgs:[]
  • ]
    */

项目.ext.react = [
cliPath:“node_modules/haul/bin/cli.js”
]

申请自:“../../node_modules/react-native/react.gradle”

/**

  • 将此设置为 true 以创建两个单独的 APK 而不是一个:

    • 仅适用于 ARM 设备的 APK


    • 仅适用于 x86 设备的 APK

  • 好处是APK的大小减少了大约4MB。
  • 将所有 APK 上传到 Play 商店,人们就会下载
  • 基于他们设备的 CPU 架构的正确的。
    */
    def enableSeparateBuildPerCPUArchitecture = false

/**

  • 运行 Proguard 以缩小发布版本中的 Java 字节码。
    */
    def enableProguardInReleaseBuilds = false

安卓 {
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`

package="com.binomysteryshopper">









安卓:m​​inSdkVersion="16"
android:targetSdkVersion="22" />

android:name=".MainApplication"
机器人: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') // 用于真实设备上的测试
}
```

最有用的评论

@sofianegargouri这是公关: https ://github.com/geektimecoil/react-native-onesignal/pull/592

我们将在明天或后天发布更新。

所有35条评论

在 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)。

  • 应用程序焦点 - 打开的事件正确触发
  • 应用程序已关闭 - Opened 事件正确触发
  • 后台应用程序 - 打开的事件永远不会触发

我在 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 onesignalyarn 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 版)中被弃用。 我建议迁移到测试版并尝试重现该问题。

如果问题仍然存在,请通过打开一个新问题告知我们。

干杯

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