2013-05-31 34 views
5

Trong ứng dụng của tôi, khi tôi đăng ký thiết bị, nó được lưu trữ dưới dạng dữ liệu liên tục để kiểm tra xem thiết bị đã được đăng ký chưa.Android-GCM: Cách chăm sóc người dùng đã đăng xuất?

Ở phía máy chủ, tôi lưu trữ chúng trong cơ sở dữ liệu cùng với user_id là id duy nhất cho người dùng.

[user_id] [gcm_registration_id]

Bây giờ tôi không thể giải quyết trường hợp này:

Nếu người dùng đăng xuất:

  1. Các registration_id đó là được lưu trữ trong SharedPreferences phải được xóa vì người dùng khác có thể đăng nhập vào lần tiếp theo khi ứng dụng được khởi chạy.

  2. Ngoài ra, tôi phải xóa hàng tương ứng với registration_id đó khỏi cơ sở dữ liệu của tôi vì thiết bị đó (hiện không có người dùng đã đăng nhập) không được nhận thêm bất kỳ thông báo nào nữa.

Vấn đề là cơ sở dữ liệu của tôi được cập nhật bằng cách sử dụng canonical_ids hoặc nói registration_ids mới nhất tôi nhận được khi gọi

https://android.googleapis.com/gcm/send

Vì vậy, có một cơ hội mà tôi không thể tìm thấy registration_id cũ của người dùng đã đăng xuất để xóa, điều này vẫn cho phép gửi thông báo tới người dùng không đăng nhập.

Ngoài ra tôi không thể xóa một hàng DB của tôi phù hợp với user_id vì một người dùng có thể đăng xuất khỏi chỉ 1 thiết bị và có rất ít thiết bị hơn mà anh/cô ấy vẫn đang đăng nhập.

Làm sao tôi biết cho người dùng và thiết bị cụ thể này, id đăng ký được thay đổi?

Tôi có nên lưu trữ tất cả id đăng ký cũ và canonical_ids tương ứng của chúng trong cơ sở dữ liệu của tôi không?

+1

Hey .. bạn đang đi đúng hướng .. bạn không được xóa hoặc hủy đăng ký thiết bị khi người dùng đăng xuất. reg_id là thiết bị cụ thể không phải là user_specific. Trong logic DB nó phải là một giá trị duy nhất cho tất cả người dùng .. giống như quan hệ one_to_many ... –

+0

Việc bạn nên làm là .. bạn nên theo dõi cờ cho người dùng đăng nhập hiện tại .. và gửi nhận dạng người dùng từ máy chủ vào thư. khi bạn sẽ nhận được tin nhắn từ máy chủ, bạn cần phải kiểm tra nhận dạng đó bằng cờ và hiển thị thông báo. –

+0

'reg_id là thiết bị cụ thể không phải là user_specific' Đúng. Nhưng phía máy chủ tôi sẽ có thông báo cho một người dùng (ví dụ: user_id) sử dụng mà tôi sẽ nhận được một registration_id từ db và gửi thông báo. – user1537779

Trả lời

5

Bạn có hai lựa chọn:

  1. Như đã đề cập trong các ý kiến ​​- giữ ID đăng ký của người sử dụng mà đăng xuất trong DB của bạn, nhưng đánh dấu nó với một lá cờ cho biết nó được một đăng nhập -out người dùng. Máy chủ của bạn sẽ không gửi thông báo đến ID đăng ký được đánh dấu là đã đăng xuất.

  2. Khi người dùng đăng xuất khỏi ứng dụng của bạn trên thiết bị, ứng dụng trên thiết bị đó sẽ hủy đăng ký khỏi GCM và gửi yêu cầu đăng xuất tới máy chủ của bạn bằng id người dùng và ID đăng ký. Máy chủ sẽ xóa kết hợp id người dùng/đăng ký-id đó khỏi DB.Ngay cả khi vì lý do nào đó, máy chủ của bạn chứa ID đăng ký mới hơn cho thiết bị đó (gây ra lỗi xóa), bạn sẽ không thể gửi thông báo tới thiết bị có ID đăng ký đó vì ứng dụng chưa đăng ký thiết bị từ GCM dịch vụ. Tuy nhiên, trường hợp này không có khả năng xảy ra, vì bất cứ khi nào GCM thay đổi ID đăng ký cho một ứng dụng nhất định trên một thiết bị cụ thể, sẽ gửi ID đăng ký đó đến ứng dụng và ứng dụng sẽ gửi đến máy chủ của bạn. Chỉ không làm như vậy có thể gây ra tình huống mà máy chủ của bạn gửi thông báo có ID đăng ký cũ và nhận được ID đăng ký kinh điển mới trong phản hồi.

+0

** Đi theo tùy chọn thứ nhất của bạn: ** Tôi đăng ký thiết bị cho ứng dụng của mình và tôi nhận được reg_id 'x_id' được lưu trữ dưới dạng dữ liệu liên tục trên thiết bị. Bây giờ sau khi reg_id được thay đổi thành 'y_id' (canonical_id), mà chỉ có máy chủ mới biết. Bây giờ nếu người dùng đăng xuất và tôi yêu cầu máy chủ đánh dấu user_id bằng reg_id = x_id khi đăng xuất', sau đó tôi sẽ gửi thông báo tới cùng một thiết bị bằng 'y_id' vì tôi không thể tạo ra' x_id' phải được thay thế bằng canonical_id 'y_id' của nó. Hoặc tôi có nên gửi canonical_id đến ứng dụng android của tôi cùng với thông báo thông báo không? ToUpdatePersistentData? – user1537779

+0

@ user1537779 Nếu Google thay đổi reg_id từ 'x_id' thành' y_id', thông tin đó sẽ được gửi đến ứng dụng của bạn, sẽ thay đổi giá trị được lưu trữ trên thiết bị và gửi nó tới máy chủ của bạn (thay thế 'x_id' bằng' y_id '). Đó là lý do tại sao khi người dùng đăng xuất, bạn có thể yêu cầu máy chủ đánh dấu user_id bằng 'y_id' khi đăng xuất. Nếu ứng dụng Android của bạn không thực hiện điều đó, bạn có thể làm những gì bạn đề xuất (gửi id chuẩn cho ứng dụng của bạn để cập nhật dữ liệu liên tục), nhưng điều đó chỉ nên được thực hiện như một biện pháp không an toàn, vì nó không nên xảy ra nếu bạn xử lý các thay đổi reg-id chính xác. – Eran

+0

'thông tin đó được gửi đến ứng dụng của bạn', bạn có thể vui lòng cho biết cách thức và thời điểm thông tin này được gửi đến ứng dụng. Cho đến nay tôi chỉ nghĩ rằng máy chủ của tôi có thể theo dõi hơn bằng cách nhận canonical_id. – user1537779

-1

private String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID); Dòng này sẽ trả về một android_id duy nhất cho bất kỳ thiết bị nào (thx) Đối với bất kỳ người dùng nào, bạn có thể lưu trữ tin nhắn từ khách hàng hoặc kiểm tra vài phút một lần. Hope

+2

Hãy cẩn thận, sử dụng ANDROID_ID không an toàn 100%. – cremy

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