2016-04-02 17 views
0

Uygulamamda GCM kullanıyorum ve GCM jetonları oluşturmak için InstanceId API'yi kullanıyorum. InstanceId API tarafından döndürülen belirtecin geçersiz olduğu bu sorunla karşı karşıyayım.InstanceID API tarafından döndürülen GCM Token NotRegistered hatası veriyor

Jetonu kontrol etmek için Postacı'yı kullanıyorum ve her şimdi ve sonra bazı aygıtlarda, belirtecin kullanılmaya çalışılması, Not Edilmiş bir hatayı atar. Yine de, GCMInstanceIdListener hizmetini zorla çalıştırırsam, yine GCMRegistrationService'u çağırır ve bu kez doğru belirteci alırım.

GCMRegistrationService'da aldığım belirteç çalışıp çalışmadığını kontrol etmenin bir yolu var mı? https://android.googleapis.com/gcm/send numaralı telefona çağrı yapabildiğimizi ve jetonu doğrulayabildiğimizi biliyorum, ancak sunucu anahtarının üstbilgide iletilmesini gerektiriyor ve istemciye saklamak istemiyorum.

public class GCMInstanceIdListener extends InstanceIDListenerService { 

    @Override 
    public void onTokenRefresh() { 
     Intent intent = new Intent(this, GCMRegistrationService.class); 
     startService(intent); 
    } 
} 


public class GCMRegistrationService extends IntentService { 
    private static final String TAG = "GCMRegistrationService"; 

    public GCMRegistrationService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     InstanceID instanceID = InstanceID.getInstance(this); 
     String token = instanceID.getToken(BuildConfig.GCM_SENDER_ID, 
       GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
     Log.d(TAG, "GCM Token : " + token); 
    } 
} 

cevap

0

uygulama yangınları yukarı GCMRegistrationService her zaman çalıştırın ve istemci üzerinde yerel olarak kaydettiğiniz belirteci alınan eşleşmesine olmadığını görmek için kontrol edin:

Bu gibi benim kod böyle görünüyor.

@Override 
protected void onHandleIntent(Intent intent) { 
    String token = InstanceID.getInstance(this).getToken(BuildConfig.GCM_SENDER_ID, 
      GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    String savedToken = prefs.getString("token", ""); 

    if(!token.equals(savedToken)) { 
     prefs.edit().putString("token", token).apply(); 
     sendTokenToBackend(token); // If needed 
    } 
} 

DÜZENLEME: Ayrıca, sen GET_ACCOUNTS iznine sahip olduğundan emin olun. Son zamanlarda, bu izni uygulamamdan kaldırdım ve cihazımda NotRegistered hatası var. Uygulamanız API 23+'yi hedefliyorsa, çalışma zamanında bu izni istemelisiniz.

+0

Bunu yapabilirdik ama kullanım durumumuzda, uygulamayı ilk kez açtıklarında kullanıcıya bir push mesajı göndermemiz gerekiyor. 'GCMRegistrationService' çalıştırıldığında, yalnızca ikinci seferden itibaren yardımcı olur. Temiz bir kurulumda bile, GCMRegistrationService 'ilk kez çağrıldığında geçersiz bir belirteç alıyorum. – akshayt23

+0

Neden Google'ın örnek gcm istemcisini takip etmiyorsunuz? Kayıt işleminin tamamlandığını bildirmek için yerel bir yayın kullanır. Daha sonra mantığın geri kalanı ile devam edebilirsiniz. Geçersiz bir jetona gelince, benim düşünebildiğim sadece 2 şey google-services.json dosyanızın (bozuk dosya, belki) veya GET_ACCOUNTS iznine sahip olmamanızdır (Android 6.0+ izinler sorunu, belki de) – Rohan

+0

Hmm bunu kontrol edeceğim. Bizim manifestimizde 'GET_ACCOUNTS' iznine sahip olmamıza rağmen ve json dosyasını bir kaç kez kopyaladım, fakat bu sorunu çözmüyor. – akshayt23

İlgili konular