NativeScript / NativeScript/firebase

[@nativescript/firebase-messaging-core][iOS] Notification token is regenerated after app is killed

オープン
#276 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
TypeScript
スター
62
フォーク
53
平均マージ
8日 4時間
マージ済み PR(30日)
2

説明

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.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

main.ts から開始し、初期化中の firebase().messaging().registerDeviceForRemoteMessages() と getToken() を追跡します。iOS の初回起動とその後の起動を再現し、package.json のパッケージバージョンと 2 つのトークン結果を確認します。初回起動で通知が機能し、アプリの終了と再起動の後も getToken() が安定していれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
ios, typescript
領域
mobile
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。