在新的Firebase中,在Notification下,他们提到开发者可以向特定设备发送通知。为此,它在控制台中请求FCM令牌。它到底是什么?我怎样才能得到那个令牌?
他们在下面的发行说明中弃用了getToken()方法。相反,我们必须使用getInstanceId。
https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId
Task<InstanceIdResult> task = FirebaseInstanceId.getInstance().getInstanceId();
task.addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult authResult) {
// Task completed successfully
// ...
String fcmToken = authResult.getToken();
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
要在同一侦听器中处理成功和失败,请附加OnCompleteListener:
task.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (task.isSuccessful()) {
// Task completed successfully
InstanceIdResult authResult = task.getResult();
String fcmToken = authResult.getToken();
} else {
// Task failed with an exception
Exception exception = task.getException();
}
}
});
此外,FirebaseInstancedService类已被弃用,他们在FireBaseMessagingService中提出了onNewToken方法来替代onTokenRefresh,
您可以参考此处的发行说明,https://firebase.google.com/support/release-notes/android
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Use this code logic to send the info to your server.
//sendRegistrationToServer(s);
}
下面是添加此渐变的简单步骤:
dependencies {
compile "com.google.firebase:firebase-messaging:9.0.0"
}
在清单(如GCM)中不需要额外的权限。不需要接收者像GCM那样显化。使用FCM,com.google.Androidgms。gcm。自动添加GcmReceiver。
迁移侦听器服务
现在仅当您想访问FCM令牌时,才需要扩展
InstanceIDListenerService
的服务。
这是需要的如果你想
管理设备令牌以直接向单个设备发送消息,或向设备组发送消息,或
- 向设备组发送消息,或
- 使用服务器订阅管理API为设备订阅主题。
在清单中添加服务
<service
android:name=".MyInstanceIDListenerService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
更改MyInstanceIDListenerService以扩展FirebaseInstanceIdService,并更新代码以侦听令牌更新,并在生成新令牌时获取令牌。
public class MyInstanceIDListenerService extends FirebaseInstanceIdService {
...
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is also called
* when the InstanceID token is initially generated, so this is where
* you retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app's servers.
sendRegistrationToServer(refreshedToken);
}
}
有关更多信息,请访问
如何将以前的GCM项目导入Firebase
如何强制令牌刷新
如何访问令牌
如何建立firebase
它到底是什么?
FCM令牌,或通常称为注册令牌,类似于谷歌云消息传递。如GCM文件所述:
GCM连接服务器向客户端应用程序颁发的ID,允许其接收消息。请注意,注册令牌必须保密。
我怎么才能拿到那个令牌?
更新:仍然可以通过调用getToken()来检索令牌,但是,根据FCM的最新版本,FirebaseInstancedService。onTokenRefresh()已替换为FirebaseMessagingService。onNewToken()--根据我的经验,它的功能与onTokenRefresh()相同。
旧答案:
根据FCM文件:
在应用程序初始启动时,FCM SDK为客户端应用程序实例生成注册令牌。如果您想针对单个设备或创建设备组,则需要访问此令牌。
您可以通过扩展FirebaseInstancedService来访问令牌的值。确保已将服务添加到清单中,然后在onTokenRefresh的上下文中调用getToken,并记录值,如图所示:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app's servers.
sendRegistrationToServer(refreshedToken);
}
每当生成新令牌时,onTokenRefreshcallback就会触发,因此在其上下文中调用getToken可以确保您正在访问当前可用的注册令牌。FirebaseInstanceID。如果尚未生成令牌,则getToken()返回null。
获得令牌后,您可以将其发送到应用服务器,并使用首选方法进行存储。有关API的完整详细信息,请参阅实例ID API参考。
这是我第一次使用FCM。 我从Firebase/QuickStart-Android下载了一个示例,并安装了FCM QuickStart。但我无法从日志中获得任何令牌,甚至在应用程序中点击日志令牌按钮。 然后我尝试用Firebase控制台发送消息,并设置为目标我的应用程序包名称。我收到短信了。 完成以上操作后,您将在logcat中获得令牌。但最后,我找到了一个方便的方法来获取它,只需使用debug
这是我送的东西。
我使用了以下依赖项。它告诉我“默认的FirebaseApp在这个过程中没有初始化。请确保首先调用FirebaseApp.InitializeApp(Context)。”
我的AndroidManifest文件: 谢谢你的帮助
问题内容: 从www.JavaPractices.com复制的此代码中的令牌是什么意思?当我用更通用的泛型类型替换它时,它无法编译。(错误:T无法解析为类型。)为什么? 编辑:当然,当我们使用类似的通用类型标记时,它必须出现在类声明中。这里也没有,也没有在类的声明,但它仍然可以编译和运行正常。 问题答案: 它无法编译,因为您的类不是通用的(也不是您的任何方法)。在此特定示例中,小丑(?)表示Sch
FCM专家请帮助我,我必须使用FCM为android集成通知,我正在尝试Firebase提供的演示,我尝试了许多逻辑,但它为一些设备提供了第一个令牌:我使用了三个设备,Moto E(第二代)(android版本5.1.1),Samsung GT-S7562(A.V 4.1.2)和Karbon Titanium (A.V 4.2.2),我只收到了Karbon Titanium的令牌,不知道为什么我没