Реагирование на сбой собственного приложения при открытии из push-уведомления в настраиваемом приемнике вещания - PullRequest
0 голосов
/ 03 октября 2018

Я только что создал собственный модуль для отправки события в React Native, желаемый эффект - получение push-уведомлений, отправляемых через Braze, очистка глубоких ссылок от них в реагировать родным для правильной маршрутизации моего приложения.Это прекрасно работает, если приложение является фоновым, но если оно закрыто, это приведет к сбою со следующей ошибкой в ​​Logcat:

10-02 15:11:34.888 20942-20942/com.my.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.my.app, PID: 20942
    java.lang.RuntimeException: Unable to start receiver com.my.app.AppboyBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactApplicationContext.getJSModule(java.lang.Class)' on a null object reference
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3259)
        at android.app.ActivityThread.-wrap17(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactApplicationContext.getJSModule(java.lang.Class)' on a null object reference
        at com.my.app.AppboyNotification.sendEvent(AppboyNotification.java:36)
        at com.my.app.AppboyBroadcastReceiver.onReceive(AppboyBroadcastReceiver.java:42)
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3252)

Я предполагаю, что это вызвано тем, что приложение неправильноначалось еще, и он уже пытается уволить вещи, которые он не должен.Мой широковещательный приемник выглядит так, где notificationOpenedAction.equals(action) называется:

public class AppboyBroadcastReceiver extends BroadcastReceiver{
    private static final String TAG = AppboyLogger.getAppboyLogTag(AppboyBroadcastReceiver.class);

    @Override
    public void onReceive(Context context, Intent intent) {
        String packageName = context.getPackageName();
        String pushReceivedAction = packageName + AppboyNotificationUtils.APPBOY_NOTIFICATION_RECEIVED_SUFFIX;
        String notificationOpenedAction = packageName + AppboyNotificationUtils.APPBOY_NOTIFICATION_OPENED_SUFFIX;
        String notificationDeletedAction = packageName + AppboyNotificationUtils.APPBOY_NOTIFICATION_DELETED_SUFFIX;

        String action = intent.getAction();
        Log.d(TAG, String.format("Received intent with action %s", action));

        logNotificationDuration(intent);

        if (pushReceivedAction.equals(action)) {
            Log.d(TAG, "Received push notification.");
        } else if (notificationOpenedAction.equals(action)) {
            String deepLink = intent.getStringExtra(Constants.APPBOY_PUSH_DEEP_LINK_KEY);
            WritableNativeMap params = new WritableNativeMap();

            params.putString("appboyDeeplink", deepLink);

            Log.d(TAG, "Received push open action notification.");
            Log.d(TAG, String.format("DeeplinkData: %s", deepLink));

            AppboyNotification.sendEvent("appboyNotificationReceived", params);
        } else if (notificationDeletedAction.equals(action)) {
            Log.d(TAG, "Received push notification deleted intent.");
        } else {
            Log.d(TAG, String.format("Ignoring intent with unsupported action %s", action));
        }
    }

Мой ActivityEventListener выглядит следующим образом:

public class AppboyNotification extends ReactContextBaseJavaModule implements ActivityEventListener{
    private static final String TAG = "AppboyMessaging";
    private static ReactApplicationContext reactContext;
    private String thisApp;


    public AppboyNotification(ReactApplicationContext reactContext){
        super(reactContext);

        this.reactContext = reactContext;
        Log.d(TAG, String.format("React_context %s", reactContext));
        reactContext.addActivityEventListener(this);

        thisApp = reactContext.getPackageName();
    }

    @Override
    public String getName() {
        return TAG;
    }

    public static void sendEvent(String event, WritableNativeMap params) {
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(event, params);
    }

    @Override
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {}

    @Override
    public void onNewIntent(Intent intent){}
}

И мой файл пакета:

public class AppboyMessaging implements ReactPackage {

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new AppboyNotification(reactContext));

        return modules;
    }


    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

есть ли способ, как я могу избежать этой ошибки и изящно обработать ее, чтобы при открытии из push-уведомления я все еще получал данные, которые мне нужны?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...