管理 Firebase 安裝項目

Firebase 安裝服務 (FIS) 會為 Firebase 應用程式的所有已安裝執行個體提供 Firebase 安裝 ID (FID)。這些 Firebase 服務會在內部使用 Firebase 安裝 ID:

Firebase 服務 Firebase 安裝功能
Firebase 雲端通訊

Firebase 雲端通訊會使用 Firebase 安裝 ID 來指定傳送訊息的裝置。

Firebase Crashlytics

Firebase Crashlytics 會根據應用程式執行個體的 Firebase 安裝 ID 變更,輪替 Crashlytics 安裝 UUID。日後,安裝 ID 可能會用於啟用功能,改善當機回報和當機管理服務。

Firebase 應用程式內通訊

Firebase 應用程式內通訊會使用 Firebase 安裝 ID 來指定傳送訊息的裝置。

Firebase Performance Monitoring

Performance Monitoring 會使用 Firebase 安裝 ID 計算存取網路資源的不重複 Firebase 安裝數量,確保存取模式可以充分匿名。這項功能也會搭配使用 Firebase 安裝 ID 和 Firebase 遠端設定,管理效能事件報表的執行頻率。

Firebase 遠端設定

遠端設定會使用 Firebase 安裝 ID,選取要傳回至使用者裝置的設定值。

Firebase ML

與應用程式執行個體互動時,Firebase ML 會使用名為 安裝驗證權杖的憑證,以便進行裝置驗證,例如將開發人員模型發布至應用程式執行個體。

Firebase 使用者區隔儲存空間

Firebase User Segmentation Storage 會儲存 Firebase 安裝 ID 和相關屬性和區隔,為使用這些 ID 的其他 Firebase 服務提供指定目標資訊。

一般而言,Firebase 服務會使用 Firebase 安裝服務,而開發人員無須直接與 FIS API 互動。但是,在某些情況下,應用程式開發人員可能會想直接呼叫 FIS API,例如:

  • 如何刪除 Firebase 安裝項目和與安裝作業相關的資料。
  • 擷取 ID (Firebase 安裝 ID),以指定特定應用程式安裝。
  • 擷取安裝驗證權杖以驗證 Firebase 安裝。

如要開始直接呼叫 FIS API,請將 SDK 新增至您的應用程式。

在應用程式中加入 Firebase Installs SDK

iOS+

  1. 將 Firebase 安裝項目的依附元件新增至 Podfile:
    pod 'FirebaseInstallations'
  2. 執行 pod install,然後開啟建立的 .xcworkspace 檔案。
  3. FirebaseCore 模組匯入 UIApplicationDelegate,以及應用程式委派使用的任何其他 Firebase 模組。例如,如要使用 Cloud Firestore 和驗證:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. 在應用程式委派的 application(_:didFinishLaunchingWithOptions:) 方法中設定 FirebaseApp 共用例項:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. 如果您使用 SwiftUI,則必須建立應用程式委派,並透過 UIApplicationDelegateAdaptorNSApplicationDelegateAdaptor 將其附加至 App 結構體。您也必須停用應用程式委派功能切換功能。詳情請參閱 SwiftUI 操作說明

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

Android

將 Firebase 安裝作業 Android SDK 的依附元件新增至模組 (應用程式層級) Gradle 檔案 (通常是 app/build.gradle):

implementation 'com.google.firebase:firebase-installations:18.0.0'

JavaScript

視網頁應用程式的託管方式而定,系統可能會自動處理您的設定,或者您可能需要更新 Firebase 設定物件

舉例來說,如果您的依附元件已新增至 index.html,請在 <head> 元素中加入依附元件:

<script src="/__/firebase/10.12.2/firebase-installations.js"></script>

Flutter

  1. 在 Flutter 專案的根目錄中執行下列指令,安裝 Firebase 安裝外掛程式:

    flutter pub add firebase_app_installations
    
  2. 重新建構您的專案:

    flutter run
    
  3. 匯入 Firebase 安裝外掛程式:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

刪除 Firebase 安裝項目

與 Firebase 安裝相連結的資料通常無法用於識別個人身分。不過,讓使用者有管理及刪除這類資料的選項會有幫助。

每一種應用程式的安裝作業 ID 都不同;同一裝置上的不同應用程式會有不同的 Firebase 安裝 ID。Firebase 安裝 ID 可識別應用程式安裝,以及與這些應用程式安裝相關的資料。

刪除安裝 ID 後,系統會從所有使用 Firebase 安裝 ID 識別安裝在 180 天內的所有 Firebase 服務,移除與該安裝 ID 相關聯的資料。Google 的刪除與保留聲明中概略說明瞭這項程序。

除非您停用應用程式中的所有 FID 產生服務,否則 FIS 會在幾天內建立新的 ID。Firebase 會將新建立的 ID 視為新的 Firebase 安裝,完全不會將其與先前的 ID 或資料建立關聯。

透過用戶端 API 呼叫刪除 FID

如要刪除 Firebase 服務產生的 FID,請從 Firebase 安裝 SDK 呼叫適當的方法:

Swift

do {
  try await Installations.installations().delete()
  print("Installation deleted");
} catch {
  print("Error deleting installation: \(error)")
}

Objective-C

[[FIRInstallations installations] deleteWithCompletion:^(NSError *error) {
   if (error != nil) {
     NSLog(@"Error deleting Installation %@", error);
     return;
   }
   NSLog(@"Installation deleted");
}];

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

JavaScript

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

使用伺服器 API 呼叫刪除 FID

如要透過伺服器 API 呼叫刪除 FID,請先將 Firebase Admin SDK 新增至伺服器 (如果尚未這麼做)。

SDK 新增完成後,請透過您選擇的語言呼叫刪除函式來刪除 FID (注意:除了 Node.js 以外,這些方法會反映執行個體 ID 的命名)。然而,在使用任何現有 Firebase SDK 呼叫時,這些範本實際上都會刪除 FID)。

Node.js

// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';

admin.installations().deleteInstallation(idToDelete);

Java

// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";

FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();

Python

  from firebase_admin import instance_id

  # An FID sent from a client service SDK
  id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'

  instance_id.delete_instance_id(id_to_delete)

Go

client, err := app.InstanceId(ctx)
if err != nil {
  log.Fatalln("error initializing client", err)
}

iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
  log.Fatalln("error deleting FID", err)
}

透過伺服器 API 呼叫刪除 Firebase 安裝 ID 時,Firebase 服務會啟動程序刪除與該安裝 ID 相關聯的資料,在 1 至 2 天內停止接受該 ID 的新資料,然後通知用戶端應用程式 ID 已遭刪除。在 Firebase 通知用戶端應用程式之前,某些應用程式的服務可能仍會指定該 ID。舉例來說,Firebase 安裝作業可能會在幾個小時內繼續收到 FCM 通知。

如要刪除目前的 Firebase 安裝 ID,並立即透過新的不相關 ID 使用 Firebase 服務,請使用用戶端 API 處理刪除作業。

擷取用戶端 ID

如果您需要辨識應用程式的特定安裝項目,可以擷取 Firebase 安裝 ID 來進行。舉例來說,如要為 BiqQuery 匯入作業建立應用程式安裝區隔,或是在 Firebase 應用程式內通訊開發期間執行測試,可以使用對應的 Firebase 安裝 ID 找出並指定正確的裝置。

如何擷取 Firebase 安裝 ID:

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

JavaScript

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

擷取安裝驗證權杖

Firebase 服務可使用從 FIS 擷取的驗證權杖,驗證 Firebase 安裝作業。舉例來說,為遠端設定設計 A/B 版本測試時,您可以使用安裝驗證權杖,對目標測試裝置進行驗證。

安裝驗證權杖是採用 JSON Web Token (JWT) 格式的短期不記名權杖,內含安裝的下列資訊:

  • Firebase 安裝 ID
  • 相關聯的專案 (projectNumber)
  • 相關聯的 Firebase 應用程式 ID (appId)
  • 權杖到期日

安裝驗證權杖無法撤銷,在到期日前仍然有效。預設權杖生命週期為一週。

如何擷取安裝驗證權杖:

Swift

do {
  let result = try await Installations.installations()
    .authTokenForcingRefresh(true)
  print("Installation auth token: \(result.authToken)")
} catch {
  print("Error fetching token: \(error)")
}

Objective-C

[[FIRInstallations installations] authTokenForcingRefresh:true
                                               completion:^(FIRInstallationsAuthTokenResult *result, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation token %@", error);
    return;
  }
  NSLog(@"Installation auth token: %@", [result authToken]);
}];

Java

FirebaseInstallations.getInstance().getToken(/* forceRefresh */true)
        .addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
    @Override
    public void onComplete(@NonNull Task<InstallationTokenResult> task) {
        if (task.isSuccessful() && task.getResult() != null) {
            Log.d("Installations", "Installation auth token: " + task.getResult().getToken());
        } else {
            Log.e("Installations", "Unable to get Installation auth token");
        }
    }
});

Kotlin+KTX

val forceRefresh = true
FirebaseInstallations.getInstance().getToken(forceRefresh)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d("Installations", "Installation auth token: " + task.result?.token)
        } else {
            Log.e("Installations", "Unable to get Installation auth token")
        }
    }

JavaScript

const installationToken = await firebase.installations()
    .getToken(/* forceRefresh */ true);
console.log(installationToken);

Dart

String token = await FirebaseInstallations.instance.getToken();

監控 Firebase 安裝 ID 的生命週期

在應用程式正常運作期間,Firebase 安裝 ID (FID) 不需要特別監控。不過,明確擷取及使用 FID 的應用程式應新增邏輯,以監控 FID 可能的刪除或旋轉情形。以下列舉一些可能會刪除或旋轉 FID 的情況:

  • 解除安裝或重新安裝應用程式,例如使用者安裝到新裝置時。
  • 使用者清除應用程式或裝置的快取。
  • 應用程式閒置時,會在後端觸發 FID 刪除作業 (目前門檻為閒置 270 天)。

當應用程式在這些情況下發生 FID 旋轉或刪除情形時,系統會指派新的 FID 給應用程式。此外,與已刪除 FID 相關聯的安裝驗證權杖 (無論其成熟度為何) 會遭到刪除,並替換為新的安裝驗證權杖。

應用程式可以監控變更,並做出相應回應。

如何監控 FID 旋轉:

Swift

installationIDObserver = NotificationCenter.default.addObserver(
        forName: .InstallationIDDidChange,
        object: nil,
        queue: nil
) { (notification) in
  // Fetch new Installation ID
  Task {
    await self.fetchInstallationToken()
  }
}

Objective-C

__weak __auto_type weakSelf = self;
self.installationIDObserver = [[NSNotificationCenter defaultCenter]
        addObserverForName: FIRInstallationIDDidChangeNotification
                    object:nil
                     queue:nil
                usingBlock:^(NSNotification * _Nonnull notification) {
    // Fetch new Installation ID
    [weakSelf fetchInstallationsID];
}];

每次指派新的 FID 時,系統會將名為 NSNotificationName.InstallationIDDidChange 的 NSNotification 發布至預設的 NSNotificationCenter。

Android

Kotlin 和 Java 用戶端應新增重試邏輯,以回應失敗的呼叫,以擷取新的 FID。

JavaScript

網頁應用程式可以訂閱 onIdChange 掛鉤。

每當建立新的 FID 時,都會觸發已訂閱的回呼:

await firebase.installations().onIdChange((newId) => {
  console.log(newId);
  // TODO: Handle new installation ID.
});

Dart

FirebaseInstallations.instance.onIdChange.listen((token) {
  print('FID token: $token');
});

從執行個體 ID 遷移至 Firebase 安裝項目

在 Firebase 安裝功能推出前,Firebase 會使用執行個體 ID SDK 來提供應用程式安裝的 ID。相較於執行個體 ID,Firebase 安裝功能在可靠性、效能和安全性方面都具有明顯優勢。需要執行個體 ID SDK 的 Firebase 應用程式應遷移至 Firebase 安裝。

遷移程序會因您的應用程式而異:

  • 未直接呼叫執行個體 ID API 的應用程式可藉由更新 SDK 版本來遷移。大多數的 Firebase 應用程式都屬於這個類別。

  • 如果應用程式明確對執行個體 ID 發出 API 呼叫,就必須更新 SDK 版本 變更程式碼,將執行個體 ID 方法替換為其 Firebase 安裝項目或 FCM 同等項目。如果您的應用程式使用執行個體 ID 擷取 FCM 註冊權杖,或明確使用執行個體 ID 來指定應用程式執行個體或用於其他任何用途,您就必須更新應用程式程式碼。

FIS 目前與舊版 ID Firebase 執行個體 ID 回溯相容。您也可以使用刪除 IID,直接使用這些 Firebase SDK 要求刪除資料:

  • iOS 6.14.0 以下版本
  • 2020 年 2 月 27 日前的 Android SDK

也就是說,「必須」將應用程式遷移至 Firebase 安裝項目,但我們強烈建議您這麼做。

為 Firebase 安裝項目升級至最低 SDK 版本

如要從執行個體 ID 遷移至 Firebase 安裝,請先確認應用程式至少使用下列 Firebase SDK 所列的最低版本號碼:

Firebase SDK 最低 Android 版本 iOS 最低版本
Firebase 雲端通訊 20.3.0 版 6.34.0 版
遠端設定 19.2.0 版 6.24.0 版
Google Analytics for Firebase \ (Measurement SDK) 17.4.4 版 6.18.0 版
應用程式內通訊 19.0.7 版 6.24.0 版
監控效能 19.0.8 版 6.21.0 版
Crashlytics 17.2.1 版 6.23.0 版
機器學習套件 22.1.2 版 6.28.0 版

更新明確呼叫執行個體 ID API 的程式碼

如果您的 Android 或 Apple 應用程式直接使用執行個體 ID SDK 方法,您可以使用 Firebase 安裝 SDK 或 FCM SDK 中的相同替代方案取代該用法。

擷取 ID

取得執行個體 ID 的方法會替換成取得安裝 ID 的方法。例如:

之前

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                Log.d("IID_TOKEN", task.getResult().getToken());
            }
        });

Kotlin+KTX

FirebaseInstanceId.getInstance().instanceId
        .addOnSuccessListener { result ->
            Log.d("IID_TOKEN", result.token)
        }

之後

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

刪除 ID

刪除執行個體 ID 的方法會替換成刪除 Firebase 安裝 ID 的方法。例如:

之前

Swift

InstanceID.instanceID().deleteID { error in
  if let error = error {
    print("Error deleting instance ID: \(error)")
  }
}

Objective-C

[FIRInstanceID instanceID] deleteIDWithHandler:^(NSError *error) {
  if error != nil {
    NSLog(@"Error deleting instance ID: %@", error);
  }
}];

Android

FirebaseInstanceId.deleteInstanceId();

之後

Swift

func delete(completion: @escaping (Error?) -> Void)

Objective-C

- (void)deleteWithCompletion:(nonnull void (^)(NSError *_Nullable))completion;

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin+KTX

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

擷取 FCM 註冊權杖

在 Firebase 安裝功能推出前,FCM 用戶端會從執行個體 ID 擷取註冊權杖。現在,FCM SDK 提供了擷取註冊權杖的方法。

之前

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Kotlin+KTX

FirebaseInstanceId.getInstance().instanceId
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                Log.w(TAG, "getInstanceId failed", task.exception)
                return@OnCompleteListener
            }

            // Get new Instance ID token
            val token = task.result?.token

            // Log and toast
            val msg = getString(R.string.msg_token_fmt, token)
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        })

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

之後

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Kotlin+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];