-
Notifications
You must be signed in to change notification settings - Fork 4
Description
Начальные условия
[email protected]
[email protected]
Подключаю по инструкции: https://developers.mindbox.ru/docs/firebase-send-push-notifications-react-native
Результат: пуши приходят, но обработчик в onPushClickReceived не срабатывает, переход по ссылкам не происходит.
Выполненные действия
В node_modules/mindbox-sdk/android/src/main/java/com/mindboxsdk/MindboxSdkLifecycleListener.kt внизу нашел метод initPushServicesForReactNative и комментарий к нему, что в файле MainApplication.kt нужно подключать именно его.
/**
* Initializes push notification services for React Native integration.
*
* This method performs two crucial initialization steps:
* 1. Initializes the specified push services (FCM, HMS, RuStore) through Mindbox SDK
* 2. Registers the Mindbox lifecycle listener to handle React Native specific events
*
* @param application The Android Application context used for initialization
* @param pushServices List of push notification services to initialize. Typically includes
* [MindboxFirebase] for Firebase Cloud Messaging and/or
* [MindboxHuawei] for Huawei Cloud Messaging and/or
* [MindboxRuStore] for Huawei Cloud Messaging
*
* @example
* // Typical usage:
* Mindbox.initPushServicesForReactNative(
* application,
* listOf(MindboxFirebase, MindboxHuawei, MindboxRuStore)
* )
*
* @note This method should be called once during application startup,
* in the Application.onCreate() method.
*/
public fun Mindbox.initPushServicesForReactNative(application: Application, pushServices: List<MindboxPushService>) {
Mindbox.initPushServices(application, pushServices)
MindboxSdkLifecycleListener.register(application)
}В файл MainApplication.kt моего приложения сделал следующие изменения:
import com.mindboxsdk.initPushServicesForReactNative // Добавил импорт
class MainApplication : Application(), ReactApplication {
// ...
override fun onCreate() {
super.onCreate()
Mindbox.initPushServicesForReactNative(this, listOf(MindboxFirebase)) // Добавил вызов initPushServicesForReactNative убрав initPushServices
loadReactNative(this)
}
}После этого приложение собралось, но после запуска сразу упало с ошибкой:
--------- beginning of crash
11-18 11:32:46.500 32230 32230 E AndroidRuntime: FATAL EXCEPTION: main
11-18 11:32:46.500 32230 32230 E AndroidRuntime: Process: com.myapp, PID: 32230
11-18 11:32:46.500 32230 32230 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MainActivity}
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4496)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4699)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:224)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2961)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:132)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.os.Looper.dispatchMessage(Looper.java:333)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:263)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.os.Looper.loop(Looper.java:367)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9282)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: Caused by: java.lang.RuntimeException: You should not use ReactNativeHost directly in the New Architecture
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.facebook.react.ReactApplication.getReactNativeHost(ReactApplication.kt:20)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.mindboxsdk.MindboxSdkLifecycleListener.getReactInstanceManager(MindboxSdkLifecycleListener.kt:146)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.mindboxsdk.MindboxSdkLifecycleListener.onActivityCreated(MindboxSdkLifecycleListener.kt:93)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.Application.dispatchActivityCreated(Application.java:383)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.Activity.dispatchActivityCreated(Activity.java:1592)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.Activity.onCreate(Activity.java:1917)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.kt:68)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:359)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:216)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.facebook.react.ReactActivity.onCreate(ReactActivity.java:60)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at com.myapp.MainActivity.onCreate(MainActivity.kt:32)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:9306)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:9284)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1541)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4480)
11-18 11:32:46.500 32230 32230 E AndroidRuntime: ... 14 more
В метод onActivityCreated класса MindboxSdkLifecycleListener добавил try catch:
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
if (!isMainActivity(activity)) return
try {
getReactInstanceManager()?.currentReactContext?.let {
onReactContextAvailable(it, activity)
Mindbox.writeLog("[RN] ReactContext already available; skipping listener registration ", Level.INFO)
return
}
} catch (e: Exception) {
Mindbox.writeLog("[RN] Could not get ReactInstanceManager. Likely due to New Architecture. Continuing with listener registration.", Level.INFO)
}
registerReactContextListener(application) { reactContext ->
onReactContextAvailable(reactContext, activity)
}
}После этого приложение снова упало с ошибкой:
11-18 11:37:37.343 32375 32375 E AndroidRuntime: FATAL EXCEPTION: main
11-18 11:37:37.343 32375 32375 E AndroidRuntime: Process: com.myapp, PID: 32375
11-18 11:37:37.343 32375 32375 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/myapp.MainActivity}
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4496)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4699)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:224)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2961)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:132)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.os.Looper.dispatchMessage(Looper.java:333)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:263)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.os.Looper.loop(Looper.java:367)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9282)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: Caused by: java.lang.RuntimeException: You should not use ReactNativeHost directly in the New Architecture
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.facebook.react.ReactApplication.getReactNativeHost(ReactApplication.kt:20)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.mindboxsdk.MindboxSdkLifecycleListener.getReactInstanceManager(MindboxSdkLifecycleListener.kt:150)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.mindboxsdk.MindboxSdkLifecycleListener.registerReactContextListener(MindboxSdkLifecycleListener.kt:68)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.mindboxsdk.MindboxSdkLifecycleListener.onActivityCreated(MindboxSdkLifecycleListener.kt:103)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.Application.dispatchActivityCreated(Application.java:383)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.Activity.dispatchActivityCreated(Activity.java:1592)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.Activity.onCreate(Activity.java:1917)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.kt:68)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:359)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:216)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.facebook.react.ReactActivity.onCreate(ReactActivity.java:60)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at com.myapp.MainActivity.onCreate(MainActivity.kt:32)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:9306)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:9284)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1541)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4480)
11-18 11:37:37.343 32375 32375 E AndroidRuntime: ... 14 more
Добавил еще один try catch в метод registerReactContextListener класса MindboxSdkLifecycleListener:
private fun registerReactContextListener(
application: Application,
onReady: (ReactContext) -> Unit
) {
val reactApplication = application.getReactApplication() ?: return
val wrapperListener = object : ReactInstanceManager.ReactInstanceEventListener {
private val called = AtomicBoolean(false)
override fun onReactContextInitialized(context: ReactContext) {
if (called.compareAndSet(false, true)) {
onReady(context)
}
}
}
try {
val reactInstanceManager = getReactInstanceManager()
reactInstanceManager?.addReactInstanceEventListener(wrapperListener)
} catch (e: Exception) {
Mindbox.writeLog("[RN] Could not get ReactInstanceManager in registerReactContextListener. Likely due to New Architecture.", Level.INFO)
}
// RN 0.78+ introduced ReactHost.addReactInstanceEventListener(...).
// Older RN versions (<= 0.74) expose only ReactInstanceManager.addReactInstanceEventListener(...).
// In New Architecture the ReactInstanceManager listener might not fire
// To support RN 0.78+ reliably while keeping backward compatibility,
// we try to register via ReactHost using reflection (no compile-time dependency).
// If ReactHost API is unavailable (older RN), this call is silently ignored and we rely on
// the ReactInstanceManager path.
addReactHostListener(application, wrapperListener)
}После этого приложение собралось и запустилось, переход по ссылкам стал работать.
Не совсем уверен, что правки я делал правильные.