OPass 預計以中央 Push Gateway 與 Firebase Cloud Messaging(FCM)取代 OneSignal。本 issue 用於讓 CCIP-iOS 開發者確認架構影響、預計改動與驗收範圍並提出回饋;尚未開始實作。下列 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)
- 程式碼檢視基準:
11edb506834e7772fbb74607822df202b06ea2b9
若實作需要改變 topic、payload 或跨 repository 責任,應先更新 Gateway 契約,再調整本 issue。
現況與風險
OPassApp.swift 在 App 啟動時初始化 OneSignal,並立即要求通知權限。
EventStore.redeem 只有在身分驗證成功後才加入 <EVENT_ID><ROLE> tag,符合「登入成功後才訂閱」的產品規則。
- 登入新身分時,只有現有 tag 數量至少為 2 才全部移除;恰好有一個舊 tag 時會留下舊身分。
signOut 也只是把 tag value 設為空字串。改成每個 FCM role topic 各送一則後,殘留訂閱可能造成重複通知。
- iOS 已有登出功能;目前活動、token 與 role 會分別儲存在
NSUbiquitousKeyValueStore、可同步 Keychain 與 per-event UserDefaults。每個活動的 FCM topic 對應是單一裝置的狀態,不得跟著 iCloud 或 Keychain 同步到其他裝置。
- 切換活動時可以回到過去已登入的活動,因此切換目前活動不得取消先前活動的訂閱。
- 專案已連接與 Android 相同的 Firebase 專案
opass-8b7db,但 App target 尚未加入 Firebase Messaging product。既有 SDK 已提供 Analytics、App Check、Crashlytics 與 Performance。
- OneSignal 另有 Swift Package、Notification Service Extension target、App Group entitlement 與 Diagnostic 畫面;目前程式碼未發現其他 App Group 用途。
1. Firebase Messaging 與 OneSignal 清理
2. APNs、FCM registration 與通知權限
3. Topic 推導與訂閱同步
至少在下列時機同步訂閱:
4. 前景顯示與通知點擊
5. Analytics 與驗證
人工驗收:
不在本 issue 範圍
- registration、FID 或 APNs token 上傳 API。
- App 內的 Gateway key、service account credential 或發布功能。
.all topic、逐裝置發送、OneSignal 相容層或新的 notification service extension。
- 為這次遷移重構登入資料、iCloud 同步或整套 navigation architecture。
請協助回饋
- 上述每個已登入活動各保留一個 topic,以及登入、登出、活動切換與本機/同步儲存邊界,是否符合目前維護者的理解。
- 是否同意維持現行做法,在 App 啟動時詢問通知權限,但只在登入成功後訂閱 topic。
- OneSignal extension、App Group、非目前活動的通知點擊、Analytics 或實體裝置驗收是否有平台限制未納入。
參考資料
OPass 預計以中央 Push Gateway 與 Firebase Cloud Messaging(FCM)取代 OneSignal。本 issue 用於讓 CCIP-iOS 開發者確認架構影響、預計改動與驗收範圍並提出回饋;尚未開始實作。下列 checkbox 用於界定預計工作,不表示已排程。
架構摘要
EVENT_ID或完整 topic。實作依據
52b9aab)11edb506834e7772fbb74607822df202b06ea2b9若實作需要改變 topic、payload 或跨 repository 責任,應先更新 Gateway 契約,再調整本 issue。
現況與風險
OPassApp.swift在 App 啟動時初始化 OneSignal,並立即要求通知權限。EventStore.redeem只有在身分驗證成功後才加入<EVENT_ID><ROLE>tag,符合「登入成功後才訂閱」的產品規則。signOut也只是把 tag value 設為空字串。改成每個 FCM role topic 各送一則後,殘留訂閱可能造成重複通知。NSUbiquitousKeyValueStore、可同步 Keychain 與 per-eventUserDefaults。每個活動的 FCM topic 對應是單一裝置的狀態,不得跟著 iCloud 或 Keychain 同步到其他裝置。opass-8b7db,但 App target 尚未加入 Firebase Messaging product。既有 SDK 已提供 Analytics、App Check、Crashlytics 與 Performance。1. Firebase Messaging 與 OneSignal 清理
app.opass.ccip的 APNs authentication key 可供開發與正式環境使用。OneSignal-XCFrameworkpackage reference。group.app.opass.ccipApp Group entitlement。remote-notificationbackground mode,供 FCM callback 與 delivery metrics 使用。2. APNs、FCM registration 與通知權限
AppDelegate同時擔任UNUserNotificationCenterDelegate與 Firebase Messaging delegate。Info.plist設定FirebaseMessagingInstallationIdEnabled = YES,採用 Firebase Messaging 目前的 FID registration 流程,不沿用已棄用的 registration token API。registerForRemoteNotifications(),並在 APNs registration callback 明確把 APNs token 交給 Firebase Messaging;SwiftUI App 不依賴隱含 swizzling 完成這一步。3. Topic 推導與訂閱同步
EVENT_ID與ROLE均符合[A-Za-z0-9_-]{1,64},並拒絕角色all。zh-Hant與nan使用zh-Hant,zh-Hans使用zh-Hans,其他使用en。UserDefaults.standard儲存EVENT_ID到目前 topic 的對應;不可放入NSUbiquitousKeyValueStore、synchronizable Keychain 或 per-event defaults。至少在下列時機同步訂閱:
EventStore.redeem驗證身分並儲存新 attendee、token 與 role 後。EventStore.signOut清除登入資料時,只移除該活動的 topic。OPassStore.loadEvent後,核對所有已登入活動;切換目前活動本身不得取消其他活動的 topic。4. 前景顯示與通知點擊
UNUserNotificationCenterDelegate的前景 callback 顯示 list、banner 與預設提示音。push_id與event_id的 Gateway 通知。uri是 HTTPS 時交由系統開啟;沒有uri時,切換至event_id對應的活動,再沿用現有Router與FeatureDestinations.announcement進入公告頁。NotificationCenter或既有狀態傳遞通知點擊,不新增第二套 navigation framework。5. Analytics 與驗證
exportDeliveryMetricsToBigQuery;不得把完整 payload、token 或 FID 寫入 log。appDidReceiveMessage。人工驗收:
zh-Hant、nan、英文 fallback;目前沒有zh-HansApp localization,確認不會誤判。uri、無uri的點擊結果都正確。uri的通知時,點擊後開啟event_id對應活動的公告頁。不在本 issue 範圍
.alltopic、逐裝置發送、OneSignal 相容層或新的 notification service extension。請協助回饋
參考資料