2013-06-04 41 views
9

Nếu tôi gửi một thông báo đến một thiết bị, và thiết bị ngoại tuyến tôi nhận được một cái gì đó như:Gửi thông báo GCM vào một thiết bị ẩn

Error: Unavailable

Và tôi phải gửi lại.

Câu hỏi của tôi là:

Máy chủ GCM có giữ lại các thông báo này trong hàng đợi và tự động gửi lại khi thiết bị trực tuyến không? Hoặc nó phải được xử lý hoàn toàn bởi tôi.

Bởi vì nếu máy chủ GCM sẽ tự động gửi chúng (khi thiết bị đang trực tuyến), cho đến khi nó thực sự gửi thông báo, máy chủ của tôi cho rằng chúng đã được gửi. Làm thế nào để theo dõi thời gian khi các thông báo được gửi lại thành công?

Tôi có thể đánh dấu ở phía máy chủ của mình rằng các thông báo không được gửi bằng cách xem Unavailable error message nhưng không thể tạo ra cách đánh dấu chúng như đã gửi khi GCM gửi thành công thông báo.

cảm ơn

Trả lời

11

A/c để tài liệu --- Khi một bên thứ 3 viết máy chủ một thông điệp tới GCM và nhận được một ID tin nhắn trở lại, nó không có nghĩa rằng thông điệp đã được gửi tới thiết bị. Thay vào đó, nó có nghĩa là nó đã được chấp nhận để giao hàng. Điều gì xảy ra với thông báo sau khi nó được chấp nhận phụ thuộc vào nhiều yếu tố.

Nếu thiết bị được kết nối nhưng không hoạt động, tin nhắn sẽ vẫn được gửi đi ngay lập tức trừ khi cờ delay_while_idle được đặt thành true. Nếu không, nó sẽ được lưu trữ trong các máy chủ GCM cho đến khi thiết bị được tỉnh táo. Và đó là nơi cờ collapse_key đóng một vai trò: nếu đã có thông báo có cùng khóa thu gọn (và ID đăng ký) được lưu trữ và chờ phân phối, tin nhắn cũ sẽ bị hủy và thông báo mới sẽ diễn ra (tức là, tin nhắn cũ sẽ bị thu gọn bởi tin nhắn mới). Tuy nhiên, nếu khóa thu gọn không được đặt, cả tin nhắn mới và cũ sẽ được lưu trữ để phân phối trong tương lai.

Lưu ý: Có giới hạn về số lượng thư có thể được lưu trữ mà không bị thu gọn. Giới hạn đó hiện tại là 100. Nếu đạt đến giới hạn, tất cả các tin nhắn được lưu trữ sẽ bị hủy bỏ.

+0

Làm thế nào sẽ máy chủ của tôi biết khi nào thông báo cuối cùng được gửi (thành công)? – user1537779

+0

Tôi không tin rằng có thể nhận được thông tin đó từ các máy chủ GCM. Điều này có nghĩa là bạn sẽ phải dựa vào một phương thức giao tiếp khác giữa các ứng dụng khách mà nhận được tin nhắn và máy chủ của bạn thành công. Phản hồi bạn nhận được từ máy chủ GCM (như bạn biết) chỉ cho phép bạn biết: thành công: Số lượng thư được xử lý không có lỗi. hoặc không thành công: Số lượng thư không thể xử lý được. –

+0

'Tôi có thể đánh dấu ở phía máy chủ của mình rằng thông báo không được gửi bằng cách xem thông báo lỗi Không khả dụng nhưng không thể tìm cách đánh dấu chúng như đã gửi khi GCM gửi thành công thông báo'. Tôi có thể gửi lại các thông báo tương tự nếu Tôi không thể biết liệu máy chủ gcm đã gửi cho họ đôi khi sau này hay không. – user1537779

2

Điều tôi đã làm là tách biệt chỉ báo đẩy từ trọng tải . Trong thông báo GCM của tôi, tôi chỉ đưa URI vào tải trọng và lưu trữ tải trọng trong bảng cơ sở dữ liệu có thể truy cập thông qua URI trong thư.

Khi khách hàng nhận được tin nhắn, có thể ví dụ: giống như thế này, với HATEOAS liên kết phong cách:

{ 
    _links: { 
    message: { 
     rel: 'message', 
     href: 'https://my-server.com/push/<messageId>' 
    } 
    } 
} 

Khách hàng sau đó đi vào GET payload nhắn từ URI, lúc này máy chủ biết rằng nó được giao và có thể cập nhật cho phù hợp. Tìm nạp trọng tải cũng sẽ xóa nó.

Nếu phân phối lại GCM không đủ mạnh, điều này cũng có nghĩa là khách hàng có thể chọn tìm nạp thủ công tất cả thư đang chờ xử lý, ví dụ: khi kết nối mạng được tiếp tục sau khi ngoại tuyến, bằng cách có điểm cuối trả về tất cả các tin nhắn cho một ANDROID_ID nhất định hoặc tương tự. Nếu sau đó, thông báo GCM được phân phối là, khách hàng sẽ nhận được 404 cho URI trong thông báo đó và coi đó là thông báo không có, tức là, đã được xử lý.

Nếu đây là quá mức cần thiết, một cách tiếp cận nhẹ chỉ cần đạt được nhận thức máy chủ của giao thông là phải có một thiết bị đầu cuối mà chỉ đơn giản ACK việc tiếp nhận một tin nhắn với một ID nhất định, chẳng hạn như

POST https://my-server.com/push/notifyReceived 

{ 
    messageId: <messageId> 
} 
+0

Đó là một cách tiếp cận thú vị, nhưng nó không trực tiếp trả lời câu hỏi. GCM có cố gắng phân phối lại không? – Flimm

+1

Bạn nói đúng. Điều này có lẽ phù hợp hơn như một bình luận, nhưng hơi quá lâu và tôi hy vọng nó có thể giúp một người nào đó. – JHH

Các vấn đề liên quan