説明:
みなさん、こんにちは。 AndroidのonOpened / onReceivedイベントで問題が発生しました。 エミュレータと実際のデバイスでは動作が異なりますが、どちらの場合も正確なプッシュメッセージが配信されます。
エミュレーターの場合:
実際のデバイスの場合:
環境
問題を再現する手順:
私の会社の信頼の方針のため、複製するための手順を提供できません。
他に何か:
android/build.gradle
`` `//すべてのサブプロジェクト/モジュールに共通の構成オプションを追加できるトップレベルのビルドファイル。
buildscript {
リポジトリ{
jcenter()
グーグル()
}
依存関係{
クラスパス 'com.android.tools。 build:gradle :3.0.1 '
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
リポジトリ{
maven {url " https://jitpack.io "} // MPAndroidChartに使用
mavenLocal()
グーグル()
jcenter()
Maven {
//すべてのReactNative(JS、Obj-Cソース、Androidバイナリ)はnpmからインストールされます
url "$ rootDir /../ node_modules / react-native / android"
}
}
}
`android/app/build.gradle`
プラグインを適用します: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
プラグインを適用する:「com.android.application」
com.android.build.OutputFileをインポートします
buildscript {
リポジトリ{
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"
行。project.ext.react = [
cliPath: "node_modules / haul / bin / cli.js"
]
適用元: "../../ node_modules / react-native / react.gradle"
/ **
/ **
アンドロイド{
compileSdkVersion 27
buildToolsVersion "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
}
}
}
}
依存関係{
コンパイル(project( ':react-native-onesignal')){
グループを除外: "com.google.android.gms"
}
コンパイル( "com.google.android.gms:play-services-base:12.0.1"){
force = true;
}
プロジェクトをコンパイルします( ':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から
}
//これを1回実行すると、BUCKでアプリケーションを実行できるようになります
// BUCKが使用できるように、すべてのコンパイル依存関係をフォルダーライブラリに配置します
task copyDownloadableDepsToLibs(type:Copy){
configuration.compileから
'libs'に
}
`android/app/src/main/java/com/binomysteryshopper/MainApplication.java`
パッケージcom.binomysteryshopper;
import 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;
import 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をインポートします。
import java.util.List;
パブリッククラスMainApplicationextendsApplicationはReactApplicationを実装します{
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this){
@オーバーライド
public boolean 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";
}
};
@オーバーライド
public ReactNativeHost getReactNativeHost(){
mReactNativeHostを返します。
}
@オーバーライド
public void onCreate(){
super.onCreate();
SoLoader.init(this、/ *ネイティブexopackage * / false);
}
}
`AndroidManifest.xml`
android:targetSdkVersion = "22" />
android:allowBackup = "true"
android:label = "@ string / app_name"
android:icon = "@ mipmap / ic_launcher"
android:largeHeap = "true"
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`
componentWillMount(){
OneSignal.init(ONESIGNAL_APP_ID、{
kOSSettingsKeyAutoPrompt:true、
kOSSettingsKeyInAppLaunchURL:false、
kOSSSettingsKeyPromptBeforeOpeningPushURL:true、
})
OneSignal.inFocusDisplaying(2)
OneSignal.addEventListener('received', this.onPushNotificationReceived)
OneSignal.addEventListener('opened', this.onPushNotificationOpened)
}
componentWillUnmount(){
OneSignal.removeEventListener( 'received'、this.onPushNotificationReceived)
OneSignal.removeEventListener( 'opened'、this.onPushNotificationOpened)
}
onPushNotificationReceived(notification){
Alert.alert( 'onReceived')//実際のデバイスでのテスト用
}
onPushNotificationOpened(openResult){
Alert.alert( 'onOpened')//実際のデバイスでのテスト用
}
`` `
IOSでは完璧に動作しています。 残念ながら、実際のデバイスを持っていないため、androidlogcatからログを提供することはできません。 TeamViewerを使用して、遠く離れた友人のデバイスでテストしていました。
また、実際のデバイスでOneSignal.setLogLevel(0, 6)
を試してみました。 しかし、エラーは見つかりませんでした。すべてのリクエストは成功し、イベントのみが発生しませんでした。
こんにちは@ Ble3k 、私たちは最近新しいFlutter SDKの作業に忙しく、まだ問題を調査する時間がありませんが、明日調査し、すぐに返信します。遅れて申し訳ありません。
こんにちは、
開発デバイスの3.2.5でも同じ動作が見られると言いたかっただけです。 最近何も変更していないので奇妙です。数日前にうまくいったと確信しています。フォーカスされたプッシュがアプリ内トーストとして表示されるので、これらをテストして機能していたことを覚えています。
アプリがフォーカスされている場合でも通常のプッシュ通知に移行することにしたため、これ以上調査しません
@ Nightsd01 Thx、あなたの調査を待ちます。
通知の受信が遅れるAndroidの場合、Androidスマートフォンでテストし、30〜40分後に通知を受信し、複数回テストしました
これに関する更新はありますか? Androidデバイス(Samsung Galaxy S7)でも同じ問題が発生しています。
onOpenedまたはonReceivedイベントは発生していませんが、通知は受信されています。 onOpenedイベントが発生したときに、ユーザーを特定の画面に移動できるようにする必要があります。
Rを2回押すか、react-native-restartパッケージを使用して、react Native androidアプリをリロードした後にイベント(受信、オープン)が発生しないという問題がありますか?
@ackosumane私は実際に開発ワークフローでExpoとUpdates.reload()
を頻繁に使用しています。
そして、あなたは正しいです:
@ Nightsd01したがって、OneSignal RN Android統合は現在、アプリのリロードを十分にサポートしていないようです。 ほとんどの場合、ユーザーがアプリをリロードしないと思っていたほど影響はありませんが、ユーザーにアプリをリロードさせたい本番環境のケースがあります(Expo / CodePushなどのOverTheAirの更新、またはユーザーのログアウト?)。 そのような場合、リロード後にプッシュが壊れないのは素晴らしいことです;)
@ Nightsd01こんにちは、更新はありますか?
こんにちは、私も同じ問題に直面しています。これに対する解決策はありますか?
この問題の更新として:次の更新でこれを修正する予定です!
@Nightsd01日付は? 修正でフォークできるブランチはありますか?
@sofianegargouriこれがPRです: https ://github.com/geektimecoil/react-native-onesignal/pull/592
明日または翌日にアップデートをリリースします。
ありがとう@ Nightsd01 、この問題は閉じることができると思います
修正を加えた新しいnpmリリースを公開できますか?
この問題にこだわった人にとっては、マスターからのコードは現在うまく機能しています。
次を実行するだけです。
npm install git + https://github.com/geektimecoil/react-native-onesignal#master --save
@ eabuslaiman30まだ問題に直面しています。 上記のように、私はgit + https://github.com/geektimecoil/react-native-onesignal#masterを使用しています。 それでも、Androidではどのイベントもトリガーされません。 誰でも安定している最新バージョンを提案できますか? 以前は、アプリが強制終了され、Android 8.0(Oreo)で通知が受信されないことを除いて、正常に機能していた3.0.5バージョンを使用していました。 この問題を修正するために、最新バージョンに更新すると、このエラーが発生します。
@ 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に固執することを考えていました。
テストしたところ、onIdsから始めて、アプリの再起動時に3つのコールバックがすべて起動しました。
onIdsが起動しなかったとしても、再起動時にIDが変更される可能性は低く、すでにバックエンドに送信されているため、大した問題にはなりません。
@slorber私にとって、アプリの再起動時にonIdsが起動しなかった場合は大したことです。 idTokenをローカルストレージとバックエンドにも保存します。 サインアウト時にバックエンドから削除しました。ユーザーがローカルストレージをクリアした場合、onIdsが毎回起動されなかった場合、どうすればユーザーのidTokenを取得できますか。 3.2.0(メジャーアップデート)までの以前のバージョンでは、アプリの再起動中に毎回onIdsがトリガーされていました。
やあみんな@ slorber @ shahchaitanya。 私の実装コードのいくつかをコピーさせてください、多分それはあなたを助けるでしょう(私は以前のバージョンでは必要とされなかったコードのいくつかの行を追加する必要がありました)。
OneSignal.init('YOUR_APP_ID');
OneSignal.addEventListener('ids', this.onIds);
OneSignal.configure();
たとえば、初期化は明らかにJavaコードから行われていたため、以前のバージョンでは「init」関数を使用していませんでした。
また、依存関係としてnpm install git+https://github.com/geektimecoil/react-native-onesignal\#master --save
を使用しており、3つのイベント(onIds、received、opened)を正しく受信しています。
また、initとconfigureを使用していますが、configureを呼び出さないときにIDが起動しないという問題があったことを覚えています。
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がレビューされるのを待っています。
皆さん、今しばらくお待ちいただきますようお願いいたします。 その間、あなたは単にマスターを使うことができます
@shahchaitanya ids
イベントは、ユーザーのIDまたはOneSignalの変更を伴うプッシュトークンが発生するたびに発生することを目的としています。 前回アプリを使用してから変更されていない場合、イベントはデフォルトで発生しません。
これはレガシーコードを混乱させるものです。次のメジャーリリースでリファクタリングして、より直感的にするつもりです。
configure()
を呼び出すことで強制的に発砲させることができますが、お勧めしません。 より洗練された解決策は、ユーザーのOneSignal IDを含むOneSignal.getPermissionSubscriptionState()
を呼び出すことです。
問題は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-nativeunlinkを実行してから再リンクし、iOSを手動でアップグレードし、OneSignal.init()メソッドを使用するためにすべてのネイティブ初期化を削除しました。
編集:何が起こったのかわかりませんが、Androidでは100%動作しています。クローズされた問題についてコメントして申し訳ありませんが、ご協力いただきありがとうございます😅
3.2.6以降でこの問題が再び発生した場合は、新しい問題を開いてください。
@joefazz聞いてよかった! 最初の問題の原因となった問題を修正しましたが、何らかの競合状態が発生している可能性があります。 この問題が再び発生した場合は、新しい問題を開いてください。
私のアプリでは、新しいバージョンで問題が修正され、 @ joefazzによって報告された動作が表示されません
こんにちは、私は同じ問題を抱えていますOneSignal.addEventListener('opened', (result) => console.log(result));
はアプリの2回目の起動から起動されません。 バックグラウンドモードでは、最初の通知は「opened」イベントを取得しています。アプリを強制終了します=> get Notification =>「opened」は二度と発生しません。
アンドロイドのみ-8バージョン
アプリがバックグラウンドであった場合の2回目の通知後のみ
react-native-onesignal-3.9.1
私は同じ問題を抱えています。 アプリがバックグラウンドであるときに開かれた電話はありません修正はありますか
@ kostiantyn-solianyk @shrolr 、
要約すると、「opened」イベントは、Android8でアプリを2回目に開いたときに発生しません。
従来のイベントは、次のメジャーリリース(現在はベータ版)で非推奨になっています。 ベータ版に移行して、問題の再現を試みることをお勧めします。
問題が解決しない場合は、新しい問題を開いてお知らせください。
乾杯
最も参考になるコメント
@sofianegargouriこれがPRです: https ://github.com/geektimecoil/react-native-onesignal/pull/592
明日または翌日にアップデートをリリースします。