我刚刚迁移到 FCM。我添加了从 FirebaseInstanceIdService 扩展的类,以便在适当的时候接收 refreshedToken。
我的问题是针对用户第一次安装我的应用程序并且由于某种原因无法从 onTokenRefresh 接收注册 ID 的情况。我们应该如何处理这件事?我可以从我的 FirebaseInstanceIdService 类中设置一个广播接收器,它会在收到注册 ID 时通知 Main 活动吗?
我刚刚迁移到 FCM。我添加了从 FirebaseInstanceIdService 扩展的类,以便在适当的时候接收 refreshedToken。
我的问题是针对用户第一次安装我的应用程序并且由于某种原因无法从 onTokenRefresh 接收注册 ID 的情况。我们应该如何处理这件事?我可以从我的 FirebaseInstanceIdService 类中设置一个广播接收器,它会在收到注册 ID 时通知 Main 活动吗?
使用以下代码:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("FCN TOKEN GET", "Refreshed token: " + refreshedToken);
final Intent intent = new Intent("tokenReceiver");
// You can also include some extra data.
final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
intent.putExtra("token",refreshedToken);
broadcastManager.sendBroadcast(intent);
}
在您的主要活动中:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
LocalBroadcastManager.getInstance(this).registerReceiver(tokenReceiver,
new IntentFilter("tokenReceiver"));
}
BroadcastReceiver tokenReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String token = intent.getStringExtra("token");
if(token != null)
{
//send token to your server or what you want to do
}
}
};
}
将 manifest.xml 文件中的 tools:node="replace" 更改为 tools:node="merge"。
据我所知,只有当您尝试在没有 google play 服务的模拟器上运行您的应用程序以及在您的 google play 商店(在您的实际设备上)上使用双电子邮件 ID 时,令牌才会为空,但仅一个电子邮件 ID 已针对使用情况进行验证。这些情况会给你空令牌,我已经在我的新项目中实施了 FCM。因此,对于其他任何情况,令牌都不会为空。
使用此类扩展..
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
public static final String REGISTRATION_SUCCESS = "RegistrationSuccess";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
Toast.makeText(MyFirebaseInstanceIDService.this,refreshedToken,Toast.LENGTH_LONG).show();
}
}
我面临着同样的问题。我浏览了很多 SO 帖子和其他论坛,找到了适合我的解决方案。FCM 文档说使用这种方法来获取令牌。
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
我在网上找到了一个帖子(我很抱歉,我不记得是哪一个了。我前段时间找到了)使用了这种方法:
String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope);
FCM 文档将第一种方法描述为:
返回默认 Firebase 项目的主令牌。
而第二个被描述为:
返回一个令牌,该令牌授权实体代表由实例 ID 标识的应用程序执行操作。这类似于 OAuth2 令牌,只是它适用于应用程序实例而不是用户。例如,要获取可用于通过 FirebaseMessaging 向应用程序发送消息的令牌,请设置为发件人 ID,并设置为“FCM”。
我一直在研究为什么第一个方法调用需要更长的时间才能返回令牌,但我还没有找到答案。希望这可以帮助。
根据您的应用程序逻辑,您可以编写代码以直接在FirebaseInstanceIdService.onTokenRefresh()
方法中处理“新”令牌,或者如果您需要在此事件发生时更改 UI,您可以使用 LocalBroadcast 将此信息发送到您的活动。
请注意,何时onTokenRefresh()
调用您的活动可能会关闭。
一种可能的实现方式可以是两种选择的混合:
onTokenRefresh()
以将令牌发送到您的服务器如果您在模拟器上运行它,请检查您是否在 Tools -> Android -> SDK Manager -> SDK Tools -> Google play services 中启用了 Google play 服务
安装后,重启 Android Studio 和你的模拟器
它对我有用