Mindbox
React Native SDK

Навигация по клику на push-уведомление

Результат шага

При клике на push-уведомление в консоли разработчика выводится ссылка из этого уведомления.

Для получения ссылки в React Native подпишитесь на событие, которое будет генерироваться в нативной части при клике.

Подписка будет вызвана 2 аргументами:

  • link — ссылка, указанная в уведомлении;
  • payload — сериализованный payload push-уведомления. Если передается JSON, то его десериализовать надо самостоятельно.
TypeScriptCode
MindboxSdk.onPushClickReceived((pushUrl: String | null, pushPayload: String | null) => { console.log(`${pushUrl} ${pushPayload}`); });

Чтобы подписка вызывалась, в нативной части надо реализовать передачу ссылки.


Передача ссылки из iOS-части

В файле ios/AppDelegate нужно указать следующий вызов:

SwiftCode
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { // ... func userNotificationCenter( _ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void ) { Mindbox.shared.pushClicked(response: response) // Проброс события в JS MindboxJsDelivery.emitEvent(response) completionHandler() } }

Передача ссылки из Android-части

В файле android/MainActivity.java нужно передать:

KotlinCode
import android.content.Context import android.content.Intent import android.os.Bundle import cloud.mindbox.mobile_sdk.Mindbox import com.mindboxsdk.MindboxJsDelivery class MainActivity : ReactActivity() { private var mJsDelivery: MindboxJsDelivery? = null private fun sendIntent(context: Context, intent: Intent) { Mindbox.onNewIntent(intent) Mindbox.onPushClicked(context, intent) mJsDelivery?.sendPushClicked(intent) } // Инициализация + отправка интента private fun initializeAndSentIntent(context: ReactContext) { mJsDelivery = MindboxJsDelivery.Shared.getInstance(context) if (context.hasCurrentActivity()) { sendIntent(context, context.currentActivity!!.intent) } else { sendIntent(context, this.intent) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Вместо прямого вызова sendIntent(this, intent) val reactInstanceManager = reactNativeHost.reactInstanceManager val reactContext = reactInstanceManager.currentReactContext if (reactContext != null) { initializeAndSentIntent(reactContext) } else { // Ожидаем инициализацию React-контекста reactInstanceManager.addReactInstanceEventListener(object : ReactInstanceManager.ReactInstanceEventListener { override fun onReactContextInitialized(context: ReactContext) { initializeAndSentIntent(context) reactInstanceManager.removeReactInstanceEventListener(this) } }) } } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) sendIntent(this, intent) } }

Если у вас используется новая архитектура, то перепишите метод onCreate следующим образом

KotlinCode
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val reactHost = getReactHost() val context = reactHost.currentReactContext as? ReactContext if (context != null) { initializeAndSentIntent(context) } else { reactHost.addReactInstanceEventListener(object : ReactInstanceManager.ReactInstanceEventListener { override fun onReactContextInitialized(context: ReactContext) { initializeAndSentIntent(context) reactHost.removeReactInstanceEventListener(this) } }) } }

Проверьте результат шага

При клике на push-уведомление в консоли разработчика выводится ссылка из этого уведомления.

Last modified on