我在使用 GCM 时遇到了问题,于是我迁移到了 FCM,但我仍然遇到了与令牌相关的问题。
我发布了更新后的应用程序,并检查到有 300 名新用户,其中 200 名获得了令牌,而另外 100 名没有获得任何令牌,这是一个非常关键的问题。
如何解决空令牌问题?
我在使用 GCM 时遇到了问题,于是我迁移到了 FCM,但我仍然遇到了与令牌相关的问题。
我发布了更新后的应用程序,并检查到有 300 名新用户,其中 200 名获得了令牌,而另外 100 名没有获得任何令牌,这是一个非常关键的问题。
如何解决空令牌问题?
您可以在每次新安装时从MyInstanceIDListenerService类的onTokenRefresh()方法中获取您的FCM令牌。
或者,您也可以使用此代码行获取FCM令牌:
FirebaseInstanceId.getInstance().getToken();
class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
@Override
public void onTokenRefresh() {
//Getting registration token
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//Displaying token in logcat
Log.e(TAG, "Refreshed token: " + refreshedToken);
}
private void sendRegistrationToServer(String token) {
//You can implement this method to store the token on your server
//Not required for current project
}
}
**Sometimes tokens are not generated then write this code**
public class ContCreateTokenService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent serviceIntent = new Intent(this, MyFirebaseMessagingService.class);
startService(serviceIntent);
return START_REDELIVER_INTENT;
}
}
public class FetchNewRefreshToken extends IntentService {
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public static final String TAG = FetchNewRefreshToken.class.getSimpleName();
public FetchNewRefreshToken() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
// Resets Instance ID and revokes all tokens.
FirebaseInstanceId.getInstance().deleteInstanceId();
// Now manually call onTokenRefresh()
Log.e(TAG, "Getting new token");
FirebaseInstanceId.getInstance().getToken();
} catch (Exception e) {
e.printStackTrace();
}
}
}
同时在清单文件中添加
<service android:name=".ContCreateTokenService" />
<service android:name=".FetchNewRefreshToken " />
startService(new Intent(this, FetchNewRefreshToken.class));
startService(new Intent(this, ContCreateTokenService.class));