2014-12-05 16 views
8

Tôi hiện đang cố gắng sử dụng GCM để gửi thông báo cho người dùng và hiện tôi vẫn đang nghiên cứu cách tôi có thể tối đa hóa thông báo đó. Bây giờ tôi chỉ sử dụng dự án mẫu được cung cấp trên tài liệu here và tôi sử dụng mẫu gcm-client để làm việc trên đó.Ứng dụng nhận được thông báo trùng lặp bằng GCM sau khi cài đặt lại

Bây giờ, hãy sử dụng số project from Git Tôi đã cố gắng đẩy tin nhắn bằng ID đăng ký do ứng dụng tạo và có nó gửi thành công tin nhắn.

Bây giờ vấn đề là sau khi tôi gỡ cài đặt ứng dụng. Sau khi cài đặt lại, nó sẽ tạo ID đăng ký mới trong đó tôi lưu trữ trên máy chủ cùng với ID trước đó, ngoại trừ việc tôi không thể gắn thẻ ID đăng ký trước đó để không nhận thêm bất kỳ tin nhắn nào vì việc gỡ cài đặt có thể xảy ra khi người dùng không có internet kết nối. Sau đó tôi gửi một tin nhắn đến hai ID đăng ký là ID trước khi gỡ cài đặt ứng dụng và ID sau khi cài đặt lại ứng dụng. Điều xảy ra là tôi nhận được hai tin nhắn push eventhough tôi hy vọng nó chỉ nhận được một kể từ khi ứng dụng đã thay đổi ID đăng ký.

Tôi hy vọng rằng ứng dụng có thể nhận được thêm hai ứng dụng trùng lặp nếu bao giờ tôi cũng cập nhật ứng dụng vì như đã nói trên tài liệu, ID đăng ký có thể thay đổi khi cập nhật.

Bất kỳ giải pháp nào mà tôi có thể thực hiện để xử lý thư trùng lặp này?

Trả lời

3

Từ các tài liệu chính thức:

How uninstalled client app unregistration works

Một ứng dụng khách hàng có thể được tự động đăng ký sau khi được gỡ cài đặt. Tuy nhiên, quá trình này không xảy ra ngay lập tức. Điều gì xảy ra trong trường hợp này là:

  1. Người dùng cuối gỡ cài đặt ứng dụng khách.
  2. Máy chủ ứng dụng sẽ gửi thư đến máy chủ kết nối GCM.
  3. Máy chủ kết nối GCM gửi tin nhắn đến máy khách GCM trên thiết bị.
  4. Ứng dụng khách GCM trên thiết bị nhận được thông báo và phát hiện thấy ứng dụng khách đã được gỡ cài đặt; chi tiết phát hiện phụ thuộc vào nền tảng mà ứng dụng khách đang chạy.
  5. Ứng dụng khách GCM trên thiết bị thông báo kết nối GCM máy chủ mà ứng dụng khách đã được gỡ cài đặt.
  6. Máy chủ kết nối GCM đánh dấu mã thông báo đăng ký để xóa.
  7. Máy chủ ứng dụng gửi thông báo tới GCM.
  8. GCM trả về thông báo lỗi Không được đăng ký cho máy chủ ứng dụng .
  9. Máy chủ ứng dụng phải xóa mã thông báo đăng ký.

Lưu ý có thể mất một thời gian để mã thông báo đăng ký hoàn toàn được xóa khỏi GCM. Do đó, có thể tin nhắn được gửi trong bước 7 ở trên nhận ID tin nhắn hợp lệ làm phản hồi, mặc dù thông báo sẽ không được gửi đến ứng dụng khách. Cuối cùng, mã thông báo đăng ký sẽ bị xóa và máy chủ sẽ gặp lỗi NotRegistered, mà không cần thêm bất kỳ hành động nào từ máy chủ ứng dụng.

Tuy nhiên, nó dường như có thể xảy ra mà bạn vẫn nhận được thông báo cho các ID đăng ký cũ, như người dùng nêu trong câu hỏi khác:

Đối với vấn đề này, có một chức năng được gọi là "ID chính tắc":

Canonical IDs

Nếu một lỗi trong ứng dụng client gây nên nhiều đăng ký cho cùng một thiết bị , nó có thể được khó khăn để hòa giải nhà nước và khách hàng ứng dụng có thể kết thúc với những thông điệp trùng lặp.

Việc triển khai ID chính tắc có thể giúp bạn khôi phục dễ dàng hơn từ các tình huống này. ID đăng ký kinh điển là mã thông báo đăng ký của lần đăng ký cuối cùng do ứng dụng khách yêu cầu. Đây là ID mà máy chủ sẽ sử dụng khi gửi tin nhắn đến thiết bị.

Nếu bạn cố gắng gửi thư bằng mã thông báo đăng ký cũ, GCM sẽ xử lý yêu cầu như thường lệ, nhưng sẽ bao gồm ID chuẩn trong trường registration_id của phản hồi. Đảm bảo thay thế mã thông báo đăng ký được lưu trữ trong máy chủ của bạn bằng ID chính tắc này, dưới dạng cuối cùng mã thông báo đăng ký cũ sẽ ngừng hoạt động.

0

Sau khi khôi phục, bạn sẽ nhận được RegId mới và không còn giá trị nữa. Vì vậy, ngay cả khi bạn gửi push cho cả hai RegIds, chỉ cuối cùng sẽ nhận được nó.

Bạn có thể triển khai logic cho các tài khoản trong ứng dụng.

Ví dụ: khi người dùng đăng nhập vào ứng dụng bạn gửi GoogleId + RegId của mình. Sau khi cài đặt lại ứng dụng và relogin bạn chỉ cần cập nhật RegId trên máy chủ. Vì vậy, bạn chỉ có thể có một RegId cho mỗi người dùng.

Có sự cố: chỉ một thiết bị sẽ nhận được thông báo đẩy (nếu bạn đăng nhập vào 2 thiết bị có cùng tài khoản). Vì vậy, bạn có thể gửi đến máy chủ GoogleId + RegId + DeviceId sau khi bắt đầu ứng dụng.

+2

Vấn đề là id reg trước đó vẫn nhận được thông báo như tôi đã đề cập trong câu hỏi của mình. Tôi cũng mong đợi nó không hợp lệ và sẽ không nhận được tin nhắn nữa nhưng nó vẫn nhận được tin nhắn push. – KaHeL

+0

Được rồi, tôi nghĩ tôi đã có điểm. anyways ứng dụng sẽ được mở cho tất cả. Có nghĩa là cài đặt thông báo đẩy được đặt để sử dụng công khai. Nếu tôi sử dụng google id I và khi người dùng thay đổi đăng nhập và tạo ra hai ID của tôi vẫn có thể nhận được cùng một vấn đề. – KaHeL

2

@KaHel Khi ứng dụng khách được gỡ cài đặt, regId sẽ có hiệu lực trong một thời gian, bạn đã đúng. Tuy nhiên, khi ứng dụng khách sẽ được cài đặt lại và máy chủ push của bạn cố gắng gửi tin nhắn trên id reg cũ mà thông báo sẽ được gửi thành công nhưng máy chủ GCM đặt cannonical_id để phản hồi. Và bạn nên sửa các quá trình phản ứng này bằng cannonical_id. Làm thế nào để tôi mô tả at this post và không có lớn documentation about cannonical_id. I E. ngay khi bạn nhận được cannonical_id từ máy chủ GCM, bạn nên thay thế ngay reg_id cũ bằng một giá trị mới. Nó sẽ cho phép bạn không tạo ra nhiều regIds cho một khách hàng, chỉ một đến một.

+0

Cảm ơn bạn đã thông tin. Tôi sẽ cố đọc nhật ký của tôi về điều này. – KaHeL

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