Skip to content

Проблема с подключением Android, не работает onPushClickReceived #131

@SergeyMikhryakov

Description

@SergeyMikhryakov

Начальные условия

[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)
    }

После этого приложение собралось и запустилось, переход по ссылкам стал работать.

Не совсем уверен, что правки я делал правильные.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions