Android, iOS: Push notification với Google Cloud Messaging (GCM)

Google Cloud Messaging (GCM)

Là dịch vụ hỗ trợ việc truyền tải thông điệp (message) giữa clientserver của mình.
gcm
GCM hỗ trợ:
– Gửi thông điệp 2 chiều: server->client(Downstream message) và ngược lại.
– 2 giao thức: HTTPXMPP.
– 2 định dạng tin nhắn: JSONplain-text.

Trong phạm vi bài viết này, mình sẽ đề cập đến server->client (android, ios) (hay còn gọi là push notification) với giao thức HTTP và định dạng JSON– một use case rất phổ biến hiện nay trong việc phát triển ứng dụng di động.

Một số thuật ngữ cần biết

  • SENDER_ID: là một chuỗi số, client sẽ dùng để liên lạc với GCM và lấy về device_token. Trên trang quản lý, chuỗi này được gọi với tên Project number.
    project
  • device_token: là “Chứng minh thư” của client. Được dùng khi server thực hiện việc push notifivation. Vì vậy, sau khi lấy được device_token từ GCM, client phải gửi nó lên server.

Lưu ý: device_token sẽ thay đổi thường xuyên, vì vậy client cần thường xuyên lấy từ GCM và cập nhật lên server.

  • API_KEY: key giúp server chứng thực mình với GCM rằng tao được phép push notification cho một số client nào đó.

Ok, bắt tay vào cấu hình thôi.

Cấu hình GCM app

Để có được mấy thông số trên kia, ta cần tạo một GCM app.

Trước tiên, iOS dev sẽ gửi cho bạn 2 file *.p12 (1 cho môi trường development và 1 cho production) cùng với Bundle app id (thường là dạng com.domain.appname).

Truy cập vào trang chủ GCM, chọn TRY ON IOS và làm theo hướng dẫn.

Sau khi tạo xong GCM app, bạn tải file GoogleService-Info_staging.plist về và gửi nó cho iOS dev. Trong file này có chứa đầy đủ thông tin về GCM app rồi (bao gồm cả SENDER_ID (Project number) ).

Với Android dev, bạn vào App dashboard sẽ thấy thông số Project number.

Mặc định, GCM sinh sẵn cho ta một API_KEY, bạn truy cập https://console.cloud.google.com/apis/credentials?project={SENDER_ID} để lấy hoặc tạo 1 key mới.

Chuẩn bị dữ liệu

Client sẽ dùng SENDER_ID để lấy device_tokentừ GCM. Gửi cho server. server lưu nó vào database để lát nữa push.

Push push push

Để gửi push notification, server gửi một HTTP POST request đến GCM(https://gcm-http.googleapis.com/gcm/send) với những thông tin sau:
– danh sách những người nhận (các device_token)
– Nội dung chính của notification
– Các thông số tuỳ chọn

Ngoài ra, trong header phải chứa các thông tin:
– Key chứng thực: Authorization: key=API_KEY
– Kiểu dữ liệu: Content-type: application/json

GCM sẽ tiếp nhận và xử lý, chờ hay gửi xuống các client tuỳ tình trạng online của họ.
Ví dụ về một request's body:

Đoạn trên dễ hiểu, chắc không cần giải thích nhỉ 😛

Đi sâu vào 1 chút nào.

Notification payload vs Data payload

Notification payload Data payload
Hiển thị trực tiếp cho user Chứa thông tin bổ sung của thông điệp
Nằm trong “notification” node Nằm trong “data” node
Được xử lý ngay khi về đến client Chỉ được xử lý sau khi user mở app lên

Ở phạm vi bài viết này mình chỉ dùng Notification payload.

Collapsible vs Non-collapsible

Collapse tạm dịch ra là gộp lại.

Collapsible Non-collapsible
Sử dụng tham số collapse_key Không cần key
Xoá những notification cũ có cùng collapse_key Hiển thị tất cả các tin nhắn
Notification payload mặc định là Collapsible Data payloadmặc định là Non-collapsible
Được dùng tối đa 4 key cho 1 client Lưu được tối đa 100 tin nhắn trên server GCM/client
Vd: cập nhật tỉ số bóng đá, app notification Vd: tin nhắn chat, tin nhắn riêng biệt

Tại sao lại lưu tin nhắn trên GCM?
Vì lúc đó device không thể nhận message liền được, device offline chẳng hạn.

Lưu ý khi gửi cho iOS

Để bắn notification cho iOS, ta cần thêm 2 tham số bổ sung:
content_available: true
priority: “high” – với Android thì logic về priority hơi khác 1 tí. Mặc định priority được đặt là “normal” (mặc định của Google), nếu set là “high” thì nó sẽ bất app lên bất chấp máy user đang khoá để user có thể tương tác được liên (trường hợp có cuộc gọi skype chẳng hạn). Xem thêm về priority

Body sẽ có dạng như này:

Chi tiết các tham số tuỳ chọn, bạn có thể xem tại: https://developers.google.com/cloud-messaging/http-server-ref#downstream-http-messages-json

Phân tích, xử lý kết quả trả về

Sau khi xử lý HTTP POST của server, GCM sẽ gửi trả thông tin trạng thái của từng message về cho server để cập nhật tình hình (push thành công, user gỡ app, device_token đã cũ, có lỗi trong việc xử lý request…).

Cùng xem qua 1 ví dụ: ta bắn 1 push cho 5 user có device_token lần lượt là 1, 2, 3, 4 và 5. GCM trả về response như sau:

Mảng results chứa thông tin về các message tương ứng với mảng registration_idsserver mình gửi sang.
– Với message đầu tiên: thành công.
– Message thứ 2: thành công, nhưng device_token đã cũ, cần cập nhật từ 2 thành 7777 trong database
– Message thứ 3: có trục trặc gì đó, thử gửi lại sau
– Message thứ 4: user đã gỡ app, cần xoá device_token này đi. Lưu ý là lỗi này cũng xảy ra khi iOS cấu hình lỗi (sinh sai file *.p12, provisioning hết hạn…)
– Message thứ 5: device_token không đúng.

Bạn để ý trong response có trường canonical_ids, trường này là tổng số các device_token đã hết hạn, và mình cần cập nhật lại nó (message thứ 2).

Chi tiết các thông báo lỗi khác, bạn có thể tham khảo tại: https://developers.google.com/cloud-messaging/http-server-ref#error-codes

Test thử bằng POSTMan

Việc push notification thực ra chỉ là gửi một HTTP POST request, nên ta có hoàn toàn có thể test bằng cách tạo 1 HTTP POST request: curl, các RESTClient, ở đây mình dùng POSTMan.

Test Push notification với POSTMan Rest Client

Test Push notification với POSTMan Rest Client

One more thing

Ngoài những tính năng mình đề cập ở trên ra, bạn còn có thể đọc thêm về:
– Phân nhóm đối tượng nhận message với
Device Group Messaging

– Gửi message theo chiều client->server với
Send Upstream Messages

– Gửi message cho 1 nhóm đăng ký 1 chủ để với
Send Messages to Topics

– Ngoài Android, iOS, GCM còn push được cho cả Chrome Extension.
– Và nhiều tính năng khác, bạn có thể tìm hiểu rõ hơn tại: trang chủ GCM
– Trang Dashboard: https://console.cloud.google.com

Lập trình và hơn thế nữa

Spread the love
  • 12
  •  
  •  
  •  
  •  
    12
    Shares

Leave a Reply

3 Comments on "Android, iOS: Push notification với Google Cloud Messaging (GCM)"

avatar
  Subscribe  
newest oldest most voted
Notify of
Anonymous
Guest

Cảm ơn bạn bài viết tuyệt vời!

luxbu
Guest

cảm ơn bài viết hay

Anonymous
Guest

Thanks bạn nhé, bài viết hay lắm!