NativeScript / NativeScript/firebase
[@nativescript/firebase-messaging-core][iOS] Notification token is regenerated after app is killed
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 62
- Forks
- 53
- Avg merge
- 8d 4h
- Merged PRs (30d)
- 2
Description
There is a weird behavior with our app about the notification token in iOS only.
We have search everywhere to find for a fix for this issue but we didn't find anything.
When I launch the first time the app, I get the notification token with firebase().messaging().getToken(), then we save the token in our user database and send notification from our server.
The first time the app is launch, the notification are not received, it only works after killing the app and relaunch it again.
But that's not it!
After the second launch, if I kill the app and then launch it again, the token change!!
firebase().messaging().getToken() is called twice, the first one return the old token and the second one return the new token
According to firebase documentation, the token only change if the app is uninstalled or data is reset which is not the case
package.json:
{
"name": "tina",
"main": "./src/main.ts",
"version": "1.0.0",
"private": true,
"dependencies": {
"@angular/animations": "~14.3.0",
"@angular/common": "~14.3.0",
"@angular/compiler": "~14.3.0",
"@angular/core": "~14.3.0",
"@angular/forms": "~14.3.0",
"@angular/platform-browser": "~14.3.0",
"@angular/platform-browser-dynamic": "~14.3.0",
"@angular/router": "~14.3.0",
"@nativescript/angular": "^14.2.8",
"@nativescript/camera": "^5.1.1",
"@nativescript/core": "~8.5.0",
"@nativescript/firebase-core": "^2.3.4",
"@nativescript/firebase-messaging": "^2.3.4",
"@nativescript/firebase-messaging-core": "^2.3.4",
"@nativescript/geolocation": "^8.3.1",
"@nativescript/imagepicker": "^3.1.1",
"@nativescript/local-notifications": "^6.1.1",
"@nativescript/mlkit-barcode-scanning": "^2.1.0",
"@nativescript/mlkit-core": "^2.1.0",
"@nativescript/theme": "~3.0.2",
"nativescript-webview-interface": "^1.4.5",
"rxjs": "~7.5.0",
"zone.js": "~0.11.5"
},
"devDependencies": {
"@angular-devkit/build-angular": "^14.2.13",
"@angular/compiler-cli": "~14.3.0",
"@nativescript/android": "8.5.0",
"@nativescript/ios": "8.6.4",
"@nativescript/types": "~8.5.0",
"@nativescript/webpack": "5.0.14",
"@ngtools/webpack": "^14.2.13",
"@types/node": "^14.18.63",
"typescript": "^4.6.2"
}
}
main.ts
import { platformNativeScript, registerElement, runNativeScriptAngularApp } from '@nativescript/angular';
import '@nativescript/firebase-messaging'
import { AppModule } from './app/app.module';
import { firebase } from '@nativescript/firebase-core';
import '@nativescript/firebase-messaging';
import { AuthorizationStatus } from '@nativescript/firebase-messaging';
import { setString } from '@nativescript/core/application-settings';
import { requestPermissions } from '@nativescript/camera';
import * as geolocation from '@nativescript/geolocation';
import { isIOS } from "@nativescript/core";
import { MLKitView } from '@nativescript/mlkit-core';
runNativeScriptAngularApp({
appModuleBootstrap: () => platformNativeScript().bootstrapModule(AppModule),
});
try {
registerElement('MLKitView', () => MLKitView);
firebase().initializeApp().then(
() => {
firebase().messaging().requestPermission({
ios: {
alert: true,
},
}).then((p) => {
if(p == AuthorizationStatus.AUTHORIZED || p == AuthorizationStatus.PROVISIONAL){
firebase().messaging().registerDeviceForRemoteMessages();
firebase().messaging().showNotificationsWhenInForeground = true;
firebase().messaging().getToken().then(token => {
setString("notificationToken", token);
})
}
}).finally(() => {
if(isIOS){
requestPermissions().finally(() => { // for camera
geolocation.isEnabled().then((isEnabled) => { //for gps
if(!isEnabled){
geolocation.enableLocationRequest(true).then(() => {
});
}
})
})
}
})
console.log("firebase.init done");
},
error => {
console.log(`firebase.init error: ${error}`);
}
);
}
catch (err) {
console.log("err in try and catch " + err);
}
Let me know if you need something else to provide.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in main.ts and trace firebase().messaging().registerDeviceForRemoteMessages() and getToken() during initialization. Reproduce the first and subsequent iOS launches, checking the package versions in package.json and the two token results. Done means notifications work on the first launch and getToken() remains stable across app termination and relaunch.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, typescript
- Domain
- mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100