gpt4 book ai didi

android - FCM代币发行

转载 作者:搜寻专家 更新时间:2023-11-01 07:41:49 26 4
gpt4 key购买 nike

我在应用程序的版本 1 中实现了 UrbanAirship。现在,我在应用程序的版本 2 中扩展了 FirebaseMessagingService。我没有在 onNewToken() 中收到能够将 token 发送到我的服务器的调用。我的样板代码看起来像

AndroidManifest.xml

  <service
android:name=".services.fcm.PushMessageReceiver"
android:enabled="true"
android:exported="true"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

接收者

        public class PushMessageReceiver extends FirebaseMessagingService {  ...
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
...
}

@Override
public void onNewToken(String s) {
Log.i(Config.LOGTAG, "######**** new token for fcm called");
Context ctx =ApplicationCustom.getContext();
SharedPreferences preferences = ctx.getSharedPreferences(Config.SHARED_PREFERENCES, Context.MODE_PRIVATE);
preferences.edit().putString(Config.SHARED_PREFS_DEVICE_TOKEN, s).apply();
Intent intent = new Intent(this, XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_FCM_TOKEN_REFRESH);
intent.putExtra("token", s);
startService(intent);
pushToServer();
}

public static void getToken() {
Log.i(Config.LOGTAG, "######**** get token for fcm called");

try {
Log.i(Config.LOGTAG, "######**** delete token for fcm called");
FirebaseInstanceId.getInstance().deleteInstanceId();
FirebaseInstanceId.getInstance().getInstanceId();
} catch (IOException e) {
e.printStackTrace();
Log.w(Config.LOGTAG, "######**** delete InstanceId failed", e);
}

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(task
-> {
if (!task.isSuccessful()) {
Log.w(Config.LOGTAG, "getInstanceId failed", task.getException());
return;
}

Log.i(Config.LOGTAG, "######**** getInstanceId successful");

// Get new Instance ID token
String token = task.getResult().getToken();
Context ctx = ApplicationCustom.getContext();
SharedPreferences preferences = ctx.getSharedPreferences(Config.SHARED_PREFERENCES, Context.MODE_PRIVATE);
preferences.edit().putString(Config.SHARED_PREFS_DEVICE_TOKEN, token).apply();
pushToServer();
});
}

public void pushToServer(){
// Logic to push token to a server reading from preferences
}
}

观察:

1) 永远不会为正在更新的应用程序调用 onNewToken。

2) 新安装获得 token

3) 在我添加对 FirebaseInstanceId.getInstance().deleteInstanceId() 的调用之后OnComplete 也不会被调用。

4) 在真实手机(而非模拟器)上调用 getToken(senderId, "FCM") 总是会导致

java.io.IOException: TOO_MANY_REGISTRATIONS
at com.google.firebase.iid.zzr.zza(Unknown Source:66)
at com.google.firebase.iid.zzr.zza(Unknown Source:79)
at com.google.firebase.iid.zzu.then(Unknown Source:4)
at com.google.android.gms.tasks.zzd.run(Unknown Source:5)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)

我该如何解决观察 1。是否因为 token 已经交付给 UrbanAirship 而没有调用 onNewToken?Fyi getToken 在服务 onCreate() 方法中被调用。

implementation 'com.google.firebase:firebase-messaging:17.3.4'

最佳答案

您可以通过以下方式获得 fcm token :-

FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (task.isSuccessful()) {
String firebaseToken = task.getResult().getToken();
} else {
getFirebaseToken();
}
}
});

关于android - FCM代币发行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com