我正在创建一个使用goolg的firebase作为推送通知服务的应用程序。我只是使用推送通知服务器,并且不想使用其他服务(例如数据库,身份验证等)。
在我的应用程序中,注册的用户可以拥有多个设备,因此可以拥有多个firebase令牌。调用onRefreshToken
时会出现此问题。我应该知道用户正在使用哪个设备并在我的数据库中更新该特定设备的令牌。所以我应该知道每个设备的唯一标识符,它不会改变设备的生命周期。
我想知道是否有更好的方法来解决这个问题,如果没有,我对Android唯一ID感到困惑。这两个选项是Settings.Secure.ANDROID_ID
可能有一些问题(因此我不确定是否应该使用它)和TelephonyManger.getDeviceId()
有时会返回null,而对于没有SIM卡插槽的设备(例如平板电脑)。
那么你建议我做什么?
答案 0 :(得分:2)
在课堂上,您正在扩展" FirebaseInstanceIdService"在方法" onTokenRefresh"你可以得到它:
FirebaseInstanceId.getInstance().getId()
答案 1 :(得分:1)
此答案有2个解决方案:
1)(使用ANDROID_ID作为设备标识符)。
2)在发送第一条消息后,使用云功能和FCM确定错误的令牌。
1) 尝试使用Settings.Secure.ANDROID_ID获取设备ID。
String deviceAppUID = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
if (deviceAppUID!=null) {
setFirebaseTokenInServer(deviceAppUID, FirebaseDeviceToken);}
Android更改了8.0(API 26)中的ANDROID_ID,因此它仅适用于特定应用,用户和deviceId的组合。发生这种情况时,您并不会真正获得每个应用程序始终都正确的设备ID,而是在您的特定设备上获得了具有特定签名密钥的特定应用程序的设备ID。您可以卸载该应用程序,然后重新安装该应用程序,并且ANDROID_ID将与以前相同。
这对于用户来说更安全,但是仍然可以让您保留Firebase设备令牌,以防注册令牌由于以下原因而更改:
然后在Firebase中,您可以将它们另存为:
DeviceTokens:
deviceID: firebaseDeviceToken
deviceID: firebaseDeviceToken
2)使用Firebase Cloud Messaging和Firebase Google Cloud Functions确定错误的令牌。
如果您还使用Cloud Functions将FCM发送到每个列出的deviceToken(如果有多个设备,则是必需的),则可以在发送第一个通知后检查响应。如果存在错误,并且错误返回一条消息,指出令牌已损坏,则可以处理该错误,然后将其从服务器中删除。
有关更多详细信息,请参见以下答案: Handling refresh tokens for FCM device groups
答案 2 :(得分:0)
您可以通过使用FirebaseInstanceIdService
Class
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseInsIDService";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Device Token: " + refreshedToken);
}
}
在service
文件中添加AndroidManifest.xml
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
现在,您可以使用设备令牌在用户移动设备上发送通知。
我强烈建议您检索最新更新的注册令牌。
注册令牌可能会在以下情况下发生变化:
当您需要检索当前令牌时,请致电FirebaseInstanceId.getInstance().getToken()
。如果尚未生成令牌,则此方法返回null。