FCM (Firebase Cloud Messaging)是甚麼?
FIrebase Cloud Messaging是一個跨平台的傳訊方案,讓我們不用花很多錢或是時間就可以穩定地傳送訊息。
是Google以前的Google Cloud Messaging API的升級版(簡稱GCM)。
FCM主要功能
- 傳送訊息推播或是資料 - 傳送顯示在使用者裝置上的推播訊息,或是傳送資料到用戶端。
- 多樣化的訊息傳送對象 - 有三種對象可以選擇: 1. 單一裝置 2. 複數個裝置 3. 訂閱至某個主題的裝置
- 從用戶端應用回覆訊息 - 透過FCM的溝通channel,從用戶端裝置回覆確認訊息、聊天訊息等至Server端。
整體溝通架構
要能做到傳送及接收,主要需要兩大部分:
- Trusted Environment - 例如我們自己寫的App Server、Cloud Function等等。
- 用戶端應用程式 - 例如: iOS、Android手機程式,或是網頁程式。
開發者可以透過Firebase Admin SDK *或是FCM Server Protocol*來傳送訊息。
實作流程
- 實作FCM SDK
- 開發用戶端App(前端)
- 開發Server(後端)
接下來用C#
來詳解一下SDK的架設方式及Server的實作細節。
將Firebase加入自己的Server
- 先從.NET Package Manager下載
.NET Admin SDK
Install-Package FirebaseAdmin -Version 1.9.0
- 用終端機的
dotnet
功能把它下載下來dotnet add package FirebaseAdmin --version 1.9.0
或是加入以下
xml
到.csproj
檔案中<ItemGroup> <PackageReference Include="FirebaseAdmin" Version="1.9.0" /> </ItemGroup>
初始化SDK
首先,要初始化SDK必須要新建Firebase的專案,Firebase連結在此。
因為Firebase專案支援Google的服務帳戶,我們在呼叫Firebase的API時可以用這個來得到請求的認證,呼叫Firebase的API
因此我們必須要授權一個服務帳戶,讓它可以有存取Firebase服務的權限,為此我們必須要生成一個JSON
格式的Private Key。
生成Private Key的步驟:
-
打開Firebase Console,到左邊設定(齒輪) -> 服務帳戶
-
點選產生新的私密金鑰
-
將產生的
JSON
檔案存放在一個安全的地方
在授權服務帳戶時,有兩種方式讓我們選擇:
- 設定
GOOGLE_APPLICATION_CREDENTIALS
環境變數 -> 建議用這個方式,比較安全 - 在程式碼中指定存放服務帳戶金鑰的位置
設定GOOGLE_APPLICATION_CREDENTIALS
環境變數方式
在Windows PowerShell設定環境變數。 *注意: PowerShell的環境變數只在目前的session有效,如果關掉了就要再重新設定一次。
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
完成上面步驟後我們就可以在程式碼中取得GOOGLE_APPLICATION_CREDENTIALS
FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.GetApplicationDefault(),
});
也可以用Google的OAuth 2.0 refresh token:
FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.FromFile("path/to/refreshToken.json"),
});
初始化程式
完成上述的初始化SDK的步驟後,我們就可以來實作伺服器端程式碼:
初始化一個app
// Initialize the default app
var defaultApp = FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.GetApplicationDefault(),
});
Console.WriteLine(defaultApp.Name); // "[DEFAULT]"
// Retrieve services by passing the defaultApp variable...
var defaultAuth = FirebaseAuth.GetAuth(defaultApp);
// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.DefaultInstance;
初始化複數個app
// Initialize the default app
var defaultApp = FirebaseApp.Create(defaultOptions);
// Initialize another app with a different config
var otherApp = FirebaseApp.Create(otherAppConfig, "other");
Console.WriteLine(defaultApp.Name); // "[DEFAULT]"
Console.WriteLine(otherApp.Name); // "other"
// Use the shorthand notation to retrieve the default app's services
var defaultAuth = FirebaseAuth.DefaultInstance;
// Use the otherApp variable to retrieve the other app's services
var otherAuth = FirebaseAuth.GetAuth(otherApp);
*注意: 每個app實體都有獨立的設定及憑證狀態