Thông báo đẩy
Gửi phản hồi của nhân viên và các chiến dịch khi ứng dụng đã đóng, với một deep link thẳng vào đúng cuộc hội thoại. Ứng dụng của bạn sở hữu hệ thống con push; SDK đăng ký token và mở các cuộc hội thoại.
Respondo gửi gì#
- Push tin nhắn — một phản hồi của nhân viên hoặc AI trong một cuộc trò chuyện mà khách truy cập là một phần trong đó.
- Push chiến dịch — các chiến dịch push gửi đi, cũng báo cáo một beacon mở.
Push tin nhắn luôn mang một deep link dạng respondo://conversation/<id>. Push chiến dịch mang deep link được cấu hình trên chiến dịch — nó là tùy chọn, và khi không được đặt thì push không chứa deep link nào.
Apple (APNs)#
Push iOS chạy trực tiếp trên APNs — không phụ thuộc Firebase. Từ tài khoản Apple Developer của bạn, hãy lấy:
- Một APNs Auth Key (token key
.p8). - Key ID của khóa đó.
- Team ID của bạn.
- bundle id của ứng dụng.
Google (FCM)#
Push Android đi qua Firebase Cloud Messaging. Từ dự án Firebase của bạn, hãy lấy:
- Một service account JSON với vai trò Cloud Messaging.
- Firebase project ID (Firebase console → Cài đặt dự án) — được nhập trong một trường riêng trong biểu mẫu push của dashboard, bên cạnh service-account JSON.
- package name của ứng dụng Android, và kết nối ứng dụng với cùng dự án Firebase (
google-services.json).
Cấu hình trong Respondo#
Thêm khóa APNs và service account FCM cùng project ID của nó vào kênh widget của bạn trong dashboard. Đó là tất cả những gì Respondo cần để gửi đến cả hai nền tảng.
Định dạng payload#
Payload luôn nằm dưới một khóa gốc respondo — sự hiện diện của nó là cách SDK phân biệt push của chính nó với những cái khác (trên iOS trong userInfo, trên Android dưới dạng một chuỗi JSON trong data["respondo"]).
{
"respondo": {
"type": "message",
"conversation_id": "a1c4e7b2-5d38-4f6a-9e10-3b7c2d5f8a90",
"message_id": "e9a3c1f6-4b8d-4e0a-b5f3-1d7b2a4e9c63",
"deep_link": "respondo://conversation/a1c4e7b2-5d38-4f6a-9e10-3b7c2d5f8a90"
}
}Mọi giá trị đều là chuỗi phẳng. Tiêu đề và nội dung thông báo được chuyển bởi transport của nền tảng — aps.alert trên APNs và message.notification trên FCM — không nằm bên trong đối tượng respondo.
Push chiến dịch cũng bao gồm một delivery_id dùng để báo cáo beacon mở, và có thể mang thêm các khóa chuỗi phẳng từ dữ liệu push của chiến dịch.
Xử lý chạm & tiền cảnh#
Khi một thông báo được chạm, hãy trao payload thô cho SDK. Nó phân tích payload và mở đúng cuộc hội thoại, trả về false nếu push không phải là push của Respondo (trong trường hợp đó bạn tự xử lý nó).
Android: RespondoPushPayload.from(data)?.let { Respondo.handlePush(it) }
iOS: Respondo.handlePush(userInfo: userInfo)
Flutter: Respondo.handlePushData(message.data)Các bản trùng lặp được gộp lại theo message_id, và trong khi cùng một cuộc hội thoại đang mở ở tiền cảnh thì thông báo hệ thống bị chặn — SDK xử lý cả hai một cách tự động.
Đăng ký device token#
Ứng dụng của bạn lấy device token từ hệ thống con push của nó và truyền nó cho setPushToken. Gọi clearPushToken khi đăng xuất.
- Android — token đăng ký FCM từ
FirebaseMessaging.getToken(). - iOS (native) — device token APNs (hex) từ
didRegisterForRemoteNotificationsWithDeviceToken. - iOS qua Flutter (firebase_messaging) — dùng
getAPNSToken(), không phảigetToken(). Truyền token FCM trên iOS sẽ gửi nó đến APNs, nơi nó không phải là một device token hợp lệ và push không bao giờ đến.getAPNSToken()có thể null trong những khoảnh khắc đầu tiên sau khi khởi chạy — nếu vậy hãy thử lại sau một khoảng trễ ngắn.
override fun onNewToken(token: String) {
Respondo.setPushToken(token)
}func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let token = deviceToken.map { String(format: "%02x", $0) }.joined()
Respondo.setPushToken(token)
}// iOS cần token APNs; Android cần token FCM.
final token = Platform.isIOS
? await FirebaseMessaging.instance.getAPNSToken()
: await FirebaseMessaging.instance.getToken();
if (token != null) Respondo.setPushToken(token);
// FCM xoay vòng token đăng ký của nó; giữ Android đồng bộ.
if (!Platform.isIOS) {
FirebaseMessaging.instance.onTokenRefresh.listen(Respondo.setPushToken);
}