messaging (). onNotificationOpenedApp никогда не запускается, Messaging (). getInitialNotification () запускается, но remoteMessage всегда имеет значение null - PullRequest
1 голос
/ 13 апреля 2020

Я использую response-native-firebase v6.4.0. Я успешно зарегистрировал фоновый обработчик с setBackgroundMessageHandler и все работает нормально. Теперь я пытаюсь обработать нажатие уведомлений, когда приложение находится в фоновом режиме / выйти, и я использую onNotificationOpenedApp / getInitialNotification. Проблема, с которой я сталкиваюсь, заключается в том, что первый метод никогда не запускается, в то время как второй запускается, но параметр remoteMessage всегда равен null. Я также пытался сгенерировать сборку релиза, но результат тот же.

index. js

// imports

messaging().setBackgroundMessageHandler(async remoteMessage => {
  // storing the message with redux
});

function HeadlessCheck({isHeadless}) {
  return isHeadless ? null : <App />;
}

AppRegistry.registerComponent(appName, () => HeadlessCheck);

Приложение. js

// other imports
import messaging from '@react-native-firebase/messaging';
import {store, persistor} from './Store';

export default function App() {
  useEffect(() => {
    (async () => await messaging().registerDeviceForRemoteMessages())();

    const unsubscribe = messaging().onMessage(async remoteMessage => {
      store.dispatch(storeNews(remoteMessage));
    });

    messaging().onNotificationOpenedApp(remoteMessage => {
      // The below code gets never executed
      Alert.alert('here');
      console.log(
        'Notification caused app to open from background state:',
        remoteMessage,
      );
    });

    messaging()
      .getInitialNotification()
      .then(remoteMessage => {
        console.log(remoteMessage); // always prints null
        if (remoteMessage) {
          // Never reached
          Alert.alert('here');
          console.log(
            'Notification caused app to open from quit state:',
            remoteMessage,
          );
        }
      });

    return unsubscribe;
  }, []);

  return (
    <>
      <StatusBar barStyle="dark-content" />
      <Provider store={store}>
        <PersistGate loading={null} persistor={persistor}>
          <RootNavigator />
        </PersistGate>
      </Provider>
    </>
  );
}

ответная информация:

System:
    OS: Windows 10 10.0.18363
    CPU: (8) x64 Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
    Memory: 6.90 GB / 15.73 GB
  Binaries:
    Node: 10.15.3 - C:\Program Files\nodejs\node.EXE
    Yarn: 1.9.4 - C:\Users\user\AppData\Roaming\npm\yarn.CMD
    npm: 6.14.1 - C:\Program Files\nodejs\npm.CMD
  SDKs:
    Android SDK:
    API Levels: 21, 22, 23, 24, 25, 26, 27, 28
    Build Tools: 23.0.1, 25.0.0, 26.0.1, 26.0.2, 26.0.3, 27.0.3, 28.0.2, 28.0.3
    System Images: Google APIs Intel x86 Atom, android-27
Intel x86 Atom
  IDEs:
    Android Studio: Version  3.5.0.0 AI-191.8026.42.35.6010548
  npmPackages:
    react: 16.9.0 => 16.9.0
    react-native: 0.61.5 => 0.61.5

пакет. json:

{
  ...
  "@react-native-firebase/app": "^6.4.0",
  "@react-native-firebase/messaging": "^6.4.0",
  ...
}

Я пытался запустить код как на физическом устройстве Android, так и на Android эмулятор и я получили то же поведение.

Характеристики физического устройства:

Model code: SM-G975F 
Android version: 10

Характеристики эмулятора:

Name: Nexus_5X_API_27_x86
Device: Nexus 5X (Google)
Path: C:\Users\user\.android\avd\Nexus_5X_API_27_x86.avd
Based on: Android API 27 Tag/ABI: google_apis/x86

Я ценю любую помощь. Большое спасибо заранее.

1 Ответ

2 голосов
/ 17 апреля 2020

Я нахожу причину моей проблемы. В моем приложении есть конфиг для собственного экрана Spla sh, реализация которого необходима для использования пакета реагировать-родной-спла sh -screen .

Я добавил файл новостей с именем SplashActivity.java:

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            Intent intent = new Intent(this, MainActivity.class);
            startActivity(intent);
            finish();
       }
        catch(Exception e) {
           System.out.println(e.getMessage());
       }

Я управляю SplashActivity моей основной деятельностью в AndroidManifest.xml:

       <activity
          android:name=".SplashActivity"
          android:theme="@style/SplashTheme"
          android:label="@string/app_name">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>

      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize"
        android:exported="true" />

Затем некоторые изменения logi c на моем MainActivity.java, который выглядит следующим образом:

import android.os.Bundle;
import org.devio.rn.splashscreen.SplashScreen;
public class MainActivity extends ReactActivity {
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        SplashScreen.show(this);
        super.onCreate(savedInstanceState);
    }
}

Таким образом, события не переданы правильно, более подробную информацию об этом смотрите в комментариях к этому репозиторию response-native-firebase проблема

Мое решение этой проблемы - довольно конкретная реализация c, но вы Никогда не знаешь, что может помочь.

Моя проблема заключалась в том, что у меня была операция spla sh, которая была действительной активностью запуска. Чтобы вызвать обратные вызовы в приложении. js Мне пришлось: Добавить «singleTop» в тег активности для SplashActivity. java в AndroidManifest. xml Использовать «this.getIntent ();»; в методе onCreate объекта SplashActivity. java для перехвата намерения из события открытия уведомления firebase Используйте .getExtras (), чтобы извлечь пакет из перехваченного намерения и прикрепить его к новому намерению, перенаправленному в .MainActivity Как только .MainActivity доступ к цели Все обратные вызовы начали срабатывать на правильные события.

Поэтому я добавил эту логику c на май SplashActivity:

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            intent.putExtras(extras);
        }

Теперь выглядит так:

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
  //  Block of code to try
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);

        // Pass along FCM messages/notifications etc.
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            intent.putExtras(extras);
        }
        startActivity(intent);
        finish();
}
catch(Exception e) {
  //  Block of code to handle errors
  System.out.println(e.getMessage());
}
    }
}

Теперь я могу получить getInitialNotification() return и onNotificationOpenedApp() events. На Android, если приложение находится в фоновом режиме или состояние выхода всегда вызывается getInitialNotification (), это, вероятно, потому, что мои логи c с экрана Spla sh. Но для меня все нормально, я бы сделал то же самое на обоих

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