2015-06-04 13 views
32

Với những thay đổi cuối cùng đối với Android GCM, bây giờ một InstanceIDListenerService được cung cấp để có thể nghe làm mới mã thông báo bằng cách ghi đè phương thức onTokenRefresh.Khi nào thì InstanceIDListenerService sẽ được gọi và cách kiểm tra nó?

Nhưng khi nào phương pháp này sẽ được gọi? Và có cách nào để kiểm tra nó theo cách thủ công không?

+3

Không có cách nào dễ dàng để kiểm tra nó theo cách thủ công, nhưng từ [trang Instance ID Lifecycle] (https://developers.google.com/instance-id/#instance_id_lifecycle), nó tuyên bố rằng 'Tokens là duy nhất và an toàn, nhưng ứng dụng của bạn hoặc dịch vụ ID cá nhân có thể cần phải làm mới mã thông báo trong trường hợp xảy ra sự cố bảo mật hoặc khi người dùng gỡ cài đặt và cài đặt lại ứng dụng của bạn trong quá trình khôi phục thiết bị'. Vì vậy, bạn có thể muốn thử cài đặt lại ứng dụng của mình trong quá trình khôi phục thiết bị. – ztan

Trả lời

41

Để kiểm tra nó bằng tay từ dòng lệnh chạy:

adb shell am startservice -a com.google.android.gms.iid.InstanceID --es "CMD" "RST" -n your.package.name/your.own.MyInstanceIDListenerService 

nơi:

  • gói của ứng dụng của bạn là your.package.name
  • Tên lớp thực hiện InstanceIDListenerService của bạn là your.own.MyInstanceIDListenerService

Điều này sẽ gửi ý định đến dịch vụ với các tính năng bổ sung mà lớp cơ sở mong đợi.

Để làm việc này, các dịch vụ cần phải được thiết lập để exportedtạm:

<service 
    android:name="your.own.MyInstanceIDListenerService" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.iid.InstanceID"/> 
    </intent-filter> 
</service> 

Lưu ý: này nên chỉ được thực hiện tạm và không bao giờ được xuất khẩu trong sản xuất hoặc khác các ứng dụng khác có thể truy cập dịch vụ của bạn.

+13

Nếu ai đó nhận được 'Lỗi: Yêu cầu quyền không được xuất từ ​​uid' - bạn sẽ cần ** tạm thời ** để thay đổi tệp kê khai của bạn 'android: exported =" true "' cho dịch vụ của bạn (và đừng quên thay đổi lại sau khi kiểm tra xong). – Ognyan

+0

Đối với gradle: your.package.name phải là ID ứng dụng như được đề cập trong tệp build.gradle của mô-đun ứng dụng của bạn, không phải thuộc tính "gói" được đề cập trong tệp kê khai Android. (Nếu chúng khác nhau, chúng có thể là) –

+0

câu trả lời tuyệt vời .. +1. Tôi rất tò mò về nơi bạn tìm thấy điều này, mặc dù. –

2

onTokenRefresh() sẽ được gọi nếu mã thông báo cho ứng dụng của bạn đã được dịch vụ ID trường hợp cập nhật. Lý do chính cho onTokenRefresh() được gọi là cho phép bạn cập nhật máy chủ ứng dụng của mình bằng mã thông báo mới để có thể gửi tin nhắn đến ứng dụng của bạn.

Bạn không cần phải kiểm tra giá trị mã thông báo theo cách thủ công. Mã thông báo được chủ yếu sử dụng bởi máy chủ ứng dụng của bạn để gửi tin nhắn đến ứng dụng của bạn. Vì vậy, khi ứng dụng của bạn chạy đầu tiên, bạn nên gọi InstanceID.getToken() và gửi mã thông báo đến máy chủ của bạn. Sau đó, nếu mã thông báo được cập nhật, bạn gọi lại InstanceID.getToken() và gửi lại giá trị mới cho máy chủ của bạn.

Kiểm tra ở đây để xem example.

+6

"Bạn không cần phải kiểm tra" - chắc chắn bạn nên làm như vậy. – sstn

+1

Cũng không đồng ý với 'không cần phải kiểm tra'. Bạn chắc chắn nên kiểm tra bằng tay kích hoạt onTokenRefresh() vì đây là mã tùy chỉnh của bạn. Nếu không, bạn không thể chắc chắn yêu cầu làm mới máy chủ GCM thực sẽ hoạt động trong tương lai! – Gavin

+1

Vâng, tôi thấy sự cần thiết phải kiểm tra mã mà bạn có trong onTokenRefresh, những gì tôi có nghĩa ở đây là không có cách nào để vô hiệu hóa một mã thông báo hiện có mà sau đó sẽ dẫn đến việc gọi lại onTokenRefresh. Nhưng không có gì ngăn bạn kiểm tra mã trong onTokenRefresh. –

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