OPass 預計以中央 Push Gateway 與 Firebase Cloud Messaging(FCM)取代 OneSignal。本 issue 用於讓 CCIP-Android 開發者確認架構影響、預計改動與驗收範圍並提出回饋;尚未開始實作。下列 checkbox 用於界定預計工作,不表示已排程。
架構摘要
CCIP-Admin-Bueno -> OPass Push Gateway -> FCM topic -> CCIP-Android / CCIP-iOS
- Gateway 由 OPass 團隊維運;活動由驗證成功的 Gateway key 決定,呼叫端不能指定
EVENT_ID 或完整 topic。
- CCIP-Server 不取得 Gateway key,也不參與推播發送。
- 推播內容一定是公開資訊;不建立 device registry,也不逐一向裝置發送。
- App 只有在活動登入成功後才訂閱;每個已登入活動各保留一個角色/推播語系 topic,切換目前活動不會取消其他活動的訂閱。
實作依據
- Gateway 契約:ADR 0001(revision
52b9aab)
- 程式碼檢視基準:
36ef95b17cfcc2ad6ca192b891045298cb5e4b4b
若實作需要改變 topic、payload 或跨 repository 責任,應先更新 Gateway 契約,再調整本 issue。
現況與風險
CCIPApplication 在 App 啟動時初始化 OneSignal,並註冊 NotificationClickListener。
TokenCheckFragment 只有在 /status 驗證成功後才儲存 token、role 並加入 <EVENT_ID><ROLE> tag,符合「登入成功後才訂閱」的產品規則。
- 成功登入新身分時不會移除舊 OneSignal tag。過去向「全體」發送時,OneSignal 可能將多個符合條件的 tag 合併成同一位收件者;改成每個 FCM role topic 各送一則後,殘留訂閱可能造成重複通知。
- token 與 role 已依活動分開儲存,符合每個已登入活動各自訂閱的需求。FCM topic 狀態也必須依
EVENT_ID 儲存;同一活動重新登入不同身分時,只替換該活動的舊 topic。
- App 透過 AppCompat 的 per-app locale 切換語言;
LocaleUtil 可取得套用後的實際 locale。
- AndroidManifest 尚未直接宣告
POST_NOTIFICATIONS。移除 OneSignal 後不能再依賴 manifest merge 間接提供。
- 現有
session_bookmark channel 是議程提醒,不應拿來顯示活動公告推播。
需求與限制
- 只支援採用新契約的 App 版本,不做 OneSignal 雙送或舊版遷移。
- 使用者只有成功登入後才訂閱 topic;通知權限不影響訂閱資格。
- Android 目前沒有登出功能。再次成功登入同一活動的不同身分時,新身分只取代該活動的舊身分。
- 每個 App 安裝實例可同時訂閱多個活動,但同一個
EVENT_ID 至多保留一個 OPass topic。
- topic 格式為
opass-v1.<EVENT_ID>.<ROLE>.<PUSH_LOCALE>,不建立 .all topic。
- App 不儲存 Gateway key、Firebase service-account credential,也不把 FID 或 registration token 上傳到 Gateway。
1. SDK 與既有 OneSignal 清理
2. Topic 推導與訂閱同步
至少在下列時機同步訂閱:
3. 通知顯示、權限與點擊
4. Analytics 與驗證
人工驗收矩陣:
不在本 issue 範圍
- device registry 或 registration token 上傳 API。
- App 內的 Gateway key、service-account credential 或發布功能。
.all topic、逐裝置發送、OneSignal 相容層。
- 為這次遷移新增登出 UI。
請協助回饋
- 上述登入、活動切換與語系切換流程是否符合目前維護者的理解。
- 每個已登入活動各一個 topic 的同步時機,是否遺漏其他 Android lifecycle 路徑。
- 通知顯示、點擊、權限、Analytics 或測試範圍是否有平台限制未納入。
參考資料
OPass 預計以中央 Push Gateway 與 Firebase Cloud Messaging(FCM)取代 OneSignal。本 issue 用於讓 CCIP-Android 開發者確認架構影響、預計改動與驗收範圍並提出回饋;尚未開始實作。下列 checkbox 用於界定預計工作,不表示已排程。
架構摘要
EVENT_ID或完整 topic。實作依據
52b9aab)36ef95b17cfcc2ad6ca192b891045298cb5e4b4b若實作需要改變 topic、payload 或跨 repository 責任,應先更新 Gateway 契約,再調整本 issue。
現況與風險
CCIPApplication在 App 啟動時初始化 OneSignal,並註冊NotificationClickListener。TokenCheckFragment只有在/status驗證成功後才儲存 token、role 並加入<EVENT_ID><ROLE>tag,符合「登入成功後才訂閱」的產品規則。EVENT_ID儲存;同一活動重新登入不同身分時,只替換該活動的舊 topic。LocaleUtil可取得套用後的實際 locale。POST_NOTIFICATIONS。移除 OneSignal 後不能再依賴 manifest merge 間接提供。session_bookmarkchannel 是議程提醒,不應拿來顯示活動公告推播。需求與限制
EVENT_ID至多保留一個 OPass topic。opass-v1.<EVENT_ID>.<ROLE>.<PUSH_LOCALE>,不建立.alltopic。1. SDK 與既有 OneSignal 清理
google-services.json、Google Services plugin 與 Firebase Analytics。CCIPApplication的 OneSignal 初始化與 click listener 註冊。NotificationClickListener。POST_NOTIFICATIONS;目前可能由 OneSignal dependency 合併提供,移除 dependency 後不可再依賴它。AndroidManifest.xml設定firebase_messaging_installation_id_enabled=true,採用 Firebase Messaging 目前的 FID registration 流程,不沿用已棄用的 registration token API。opass-8b7db專案,不建立第二套 Firebase 設定。2. Topic 推導與訂閱同步
EVENT_ID與ROLE均符合[A-Za-z0-9_-]{1,64},並拒絕角色all。zh-Hans-*→zh-Hanszh-Hant-*→zh-Hantnan-Hant-*、nan-Latn-*→zh-Hantx-default→ 先解析目前系統 locale,再套用相同規則enEVENT_ID到目前 topic 的對應;不得只保存單一 topic。至少在下列時機同步訂閱:
TokenCheckFragment驗證身分成功並儲存新 token 與 role 後。3. 通知顯示、權限與點擊
announcements、IMPORTANCE_DEFAULT且使用預設提示音的公開活動推播NotificationChannel。announcements設為 FCM default notification channel,並指定符合 Android 規範的 default notification icon,確保背景通知不落入其他 channel。FirebaseMessagingService並在 AndroidManifest 宣告com.google.firebase.MESSAGING_EVENTintent filter,讓 App 在前景時也能顯示 notification message。FirebaseMessagingService.onRegistered()收到 FID registration 完成或更新時觸發 topic 同步;不得把 FID 上傳到 Gateway。LauncherActivity讀取背景通知點擊帶入的 data;前景通知建立的PendingIntent也走同一條路徑,不維護兩套解析邏輯。push_id與event_id時才視為 Gateway 推播通知。uri為 HTTPS 時開啟該 URI;沒有uri時切換至event_id對應的活動並進入公告頁。ActivityResultContracts.RequestPermission。4. Analytics 與驗證
push_id用作 FCM Analytics label;Android 只將它用於通知點擊辨識,不另造識別碼。./gradlew testDebugUnitTest lintDebug assembleDebug,並記錄無法在本機執行的驗證。人工驗收矩陣:
zh-Hant、zh-Hans、英文 fallback 與x-default。uri的通知時,點擊後開啟event_id對應活動的公告頁。uri、無uri、拒絕通知權限三種路徑。不在本 issue 範圍
.alltopic、逐裝置發送、OneSignal 相容層。請協助回饋
參考資料