-
Notifications
You must be signed in to change notification settings - Fork 2.2k
🔥 messaging().onNotificationOpenedApp is never triggered, messaging().getInitialNotification() is triggered but remoteMessage is always null #3469
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Almost the same problems here. In IOS the Using 6.4.0 How do you implemented the listener for notification interaction before the introduction this methods on version 6.4.0 ? |
Before this version I was working with v5.5.5, there I was able to handle these behaviours throught |
I'm thinking that I will have to go back do V5, two days working on that an nothing for now. |
I find what cause my problem. I have in my app a config for native Splash Screen, implementation necessary to use the react-native-splash-screen package. I added a news file called 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());
}
}
} I mande the SplashActivity my main Activity , in <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" /> Then changes some logic on my 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);
}
} So the events are not passed correctly, more information about see this comments on issue #1272
So I added this logic on may SplashActivity: Bundle extras = getIntent().getExtras();
if (extras != null) {
intent.putExtras(extras);
} Now looks like: 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());
}
}
} Now I can get |
You made my day. Same problem, your solution worked brilliantly. I think |
We are using https://github.com/zo0r/react-native-push-notification to emit local notifications (since its not part of this library) and expected that To make this work for iOS we simply added On Android this is not as easy..
But Maybe this will help someone who also trys to integrate with |
@mirco312312 the problem is, if we don't check for a |
Yap makes sense! Just wanted to note here, maybe somebody else wants to handle local notifications as well as firebase. If there is an issue I think its on |
@LucasGarcez thanks worked form me i had SplashActivity so your same code worked for me too |
Awesome, thanks @LucasGarcez ! This worked for me. I think a lot of people use |
@jasperkuperus your can go ahead and submit a PR using the edit button at the to of the doc pages. If you do, though, you should take note of this: #3894 (comment) |
@andersonaddo Thanks for pointing that out! I'll give |
@jasperkuperus I think regardless it couldn't hurt for the docs to talk about this a bit to prevent people from using react-native-splash-screen |
@andersonaddo Alright, there we go: #3966 |
that happens if tap on a notification from quit or background mode invertase/react-native-firebase#3469 (comment)
Thank you so much @LucasGarcez Sir, was stuck on it for 2 days, thanks a lot again |
I don't use |
@axeljeremy7 you should try |
I had the same problem on edit: This behavior is the same in a newly created RN (0.63.2) app. I will create a new issue for this. |
I don't use react-native-splash-screen , any help? |
All I can is I strongly recommend using react-native-boot-splash in order to do a boot screen |
@mikehardy thanks, it was that in the backend they were sending the push notification with 'send' and not with 'sendToDevice'. |
What if I don't have a SplashScreen.java file but I'm still using react-native-splash-screen library. |
To be clear, my opinion is that you should not under any circumstances use that library, and I will not address any issues that involve it. Switch to a maintained splash screen library that does not have documented failures. Why would you do anything with a library that has documented failures and is unmaintained? I simply do not understand that, and certainly don't have time to discover yet another problem with an unmaintained library, who does? https://github.com/zoontek/react-native-bootsplash |
I am coming from docs. Sorry to ping you all. As of now, react-native-splash-screen library does not guide us to create separate |
That's nice that the old react-native-splash-screen library is finally doing that right but I can tell you which commit graph looks like a well maintained package and which doesn't - I'd still never use react-native-splash-screen now that bootsplash exists: https://github.com/crazycodeboy/react-native-splash-screen/graphs/code-frequency https://github.com/zoontek/react-native-bootsplash/graphs/code-frequency |
@mikehardy I agree with you, another indicator is the issue count which is ~300 for The issue is that we already have the |
I was facing the same problem and I found a solution that solved all the problems for me and I'm still using react-native-splash-screen as it is already in production and refactor this part would not be productive for me at the moment. The fact is that both Then I realized that Notifee has methods that could help handle the user's click on the notification, whether the app is open (foreground), in the background or closed (quit). First step - Quit stateTo work we need to create the listener in index.js // index.js
// ...
import notifee, {EventType} from '@notifee/react-native';
// ...
notifee.onBackgroundEvent(async ({type, detail}) => {
if (type === EventType.PRESS) {
global.toNotifications = true;
}
}); However index.js does not have the power to change the state of the react application created by app.js, so the solution is to save any change that will be applied to the application when it is opened to a variable, in my case global.toNotifications, because when the user opens the app by clicking on a notification I want them to be taken to the notifications screen. Now it is enough that when the application is assembled, the global variable is taken into account, in my case I called the method that checks the variable and applies the change of // app.js
async componentDidMount() {
// ...
this.testNotifications();
}
testNotifications() {
if (global.toNotifications) {
// your other logic here
this.setState({
// your new state here
// or could be a react navigation as well
// or whatever you use
});
// disassemble the var to not
// reapply repeatably
global.toNotifications = false;
} else {
// do nothing (in my case)
}
} With this logic you good to go with open app from a quit state and manipulate their state. Second step - background stateBackground state is when the app is open but minimized. Here I use almost the same logic as the quit state, but I can't call the testNotifications function in componentDidMount since the app is already assembled. In this case, I use logic that uses the AppState of react-native. // app.js
import {
// ...
AppState,
// ...
} from 'react-native';
// other code ...
state = {
// ...
appState: AppState.currentState,
// ...
};
// componentDidMount:
this.appStateUnsub = AppState.addEventListener(
'change',
this._handleAppStateChange,
);
// ...
_handleAppStateChange = nextAppState => {
if (
this.state.appState.match(/inactive|background/) &&
nextAppState === 'active'
) {
// other logic of my application ...
// in this case, app como to foreground, so:
this.testNotifications();
} catch (e) {}
} else {
// ...
} catch (e) {}
}
try {
this.state.appState = nextAppState;
} catch (e) {}
}; Third Step - Foreground stateFor the foreground it is the simplest logic of all. Notifee already has a method to handle this, just implement it. // app.js
// ...
import notifee, {EventType} from '@notifee/react-native';
// ...
// on componentDidMount...
notifee.onForegroundEvent(async ({type, detail}) => {
if (type === EventType.PRESS) {
global.toNotifications = true;
this.testNotifications();
}
}); ConclusionSo, with this code I fix my notifications. |
@mikehardy Shall we do this while using notifee? |
Below replacement worked for me.. Refer: wix/react-native-notifications#884 (comment). ./android/app/build.gradle
|
someone help when app is killed, getInitialNotification dont work, getLastNotificationResponseAsync dont work, |
After looking for solution to this issue, I decided to give-up and just utilize the |
I have similar issue, even using My workaround is to make sure that Here's my solutions -- by creating HoC component and call import { Component, ComponentType } from 'react';
import { LoaderScreen } from 'react-native-ui-lib';
import { messaging } from '@react-native-firebase/messaging';
export function withNotification<T extends WithNotificationProps>(
WrappedComponent: ComponentType<T>
) {
return class WithNotification extends Component<T, WithNotificationState> {
state = {
loading: true,
allowNotification: false,
};
componentDidMount(): void {
messaging().requestPermission()
.then((authStatus) => {
const allowed =
authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
authStatus === messaging.AuthorizationStatus.PROVISIONAL;
this.setState({
loading: false,
allowNotification: allowed
});
})
.catch(() => {
this.setState({ loading: false });
});
}
render() {
return this.state.loading ? (
<LoaderScreen />
) : (
<WrappedComponent
{...this.props}
allowNotification={this.state.allowNotification}
/>
);
}
};
}
export interface WithNotificationState {
loading: boolean;
allowNotification: boolean;
}
export interface WithNotificationProps {
allowNotification?: boolean;
} Not sure is this the best way, but it worked! 🙂 |
# Key Changes - SplashScreen의 패키지를 변경하였습니다. - FCM Token을 가져올 때 알림 허용을 하지 않았다면 storage에 토큰을 저장하지 않도록 변경하였습니다. # Details - 'base-64' 패키지에서 btoa를 가져와 global 변수로 지정하였습니다. - topic을 구독하고, 목록을 가져오는 API를 작성하였습니다. - SplashScreen의 패키지를 [react-native-bootsplash](https://github.com/zoontek/react-native-bootsplash)로 변경하였습니다. 기존 splash-screen 패키지는 아래와 같은 문제가 있었습니다. - splash screen에서 requestPermission 호출시 알림 권한 허용 동의 모달이 뜨지 않음. - invertase/react-native-firebase#3469 (comment) - 앱 접근시 FCM Token을 가져올 때 알림 허용을 하지 않았다면 storage에 토큰을 저장하지 않도록 변경하였습니다. - NotificationService의 registerMessageHandler 메서드에서 setBackgroundMessageHandler를 분리하여 index.js파일에서 호출하도록 변경하였습니다. - refactor: setUserInfo에서 유저 정보를 가져오는 getUserInfo 함수를 분리하고, 가져오고 저장하는 handleUserInfo 함수를 작성하였습니다. # Closes Issue close #141
I am not using splash screen what to do now? |
@suriya-hub - examine how to use github formatting, specifically enclose your code in triple quotes with a keyword on the language. It is unreadable as it is now // this is what a formatted code block should look like
if (formatted) {
peopleMayReadAndHelpYou();
} |
We also hit this issue in 2024, app background is completely ok, but from app in quit (killed) state -> build.gradle:
package.json:
simplest code fragment:
other context:
Any help appreciated.🙏🏻 |
We also are still facing the issue that the result of getInitialNotification is null and onNotificationOpenedApp does not trigger. We are also using react-native-bootsplash and are not using react-native-notifications. Please re-open the issue since this seems to be still a problem. Both does not work on iOS and Android. |
sure, will probably need a minimal + fully self-contained App.js to reproduce, based on current versions of everything - https://stackoverflow.com/help/minimal-reproducible-example |
Hello 👋, to help manage issues we automatically close stale issues. This issue has been automatically marked as stale because it has not had activity for quite some time.Has this issue been fixed, or does it still require attention?
Thank you for your contributions. |
Using
|
@LucasGarcez thank you so much , i was struggling with issues since last 2 days , your are a life saver man, thank |
Issue
I successfully registered a background handler with
setBackgroundMessageHandler
and everything works fine. Now I'm trying to handle notification tap when the app is in background/quit and I'm usingonNotificationOpenedApp
/getInitialNotification
respectively. The problem I'm facing is that the first method is never triggered while the second is triggered butremoteMessage
parameter is alwaysnull
. I've also tried to generate a release build but the result is the same.index.js
App.js
Project Files
Javascript
Click To Expand
package.json
:react-native info:
iOS
Click To Expand
ios/Podfile
:# N/A
AppDelegate.m
:// N/A
Android
Click To Expand
Have you converted to AndroidX?
android/gradle.settings
jetifier=true
for Android compatibility?jetifier
for react-native compatibility?android/build.gradle
:// N/A
android/app/build.gradle
:// N/A
android/settings.gradle
:// N/A
MainApplication.java
:// N/A
AndroidManifest.xml
:<!-- N/A -->
Environment
Click To Expand
react-native info
output:react-native-firebase
version you're using that has this issue:6.4.0
Firebase
module(s) you're using that has the issue:react-native-firebase/messaging
TypeScript
?N
I tried to run the code on both a physical Android device and on an Android emulator and I got the same behaviour.
Physical device specs:
Emulator specs:
I appreciate any help. Many thanks in advance.
React Native Firebase
andInvertase
on Twitter for updates on the library.The text was updated successfully, but these errors were encountered: