Authentication Smack陷阱和过时的代码几乎不可能连接到FCM CCS
几天来一直试图通过Smack库连接到Firebase CCS。什么也没发生。今天,我尝试设置一个持续时间为10秒的valueanimator,以便在连接出现问题时尝试重新连接。我已经尽我所能记录了这条路的每一步,但是今天日志都没有显示出来。我在日志中遇到了一些异常,例如:X-OAUTH2“不正确/编码,解析器已到达文档末尾”。据我所知,FCM CCS需要验证我的连接。我还是不知道怎么用Smack做这个。在我问他如何处理这件事后,即使是StackOverflow的一位所谓的Smack主管也变得沉默了 我的问题是,连接只是根据Smack库上addConnectionListener的connectionclosed()重写方法自行关闭: 好的,这是我的设置:希望有人能给我指出正确的方向。这真是令人沮丧。Smack似乎是一个很好的XMPP库,但我看不到对它的支持。甚至包侦听器和扩展的术语也是抽象的。网上的教程已经过时了,所谓的权威甚至没有回复 以下是我的代码:Authentication Smack陷阱和过时的代码几乎不可能连接到FCM CCS,authentication,oauth,xmpp,smack,firebase-cloud-messaging,Authentication,Oauth,Xmpp,Smack,Firebase Cloud Messaging,几天来一直试图通过Smack库连接到Firebase CCS。什么也没发生。今天,我尝试设置一个持续时间为10秒的valueanimator,以便在连接出现问题时尝试重新连接。我已经尽我所能记录了这条路的每一步,但是今天日志都没有显示出来。我在日志中遇到了一些异常,例如:X-OAUTH2“不正确/编码,解析器已到达文档末尾”。据我所知,FCM CCS需要验证我的连接。我还是不知道怎么用Smack做这个。在我问他如何处理这件事后,即使是StackOverflow的一位所谓的Smack主管也变得沉默
//to set up connection i do this: this thread is called inside onStart()
new Thread(new Runnable(){
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
private Handler umm;
@Override
public void run() {
configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.ifpossible);
configBuilder.setServiceName("fcm-xmpp.googleapis.com");
configBuilder.setHost("fcm-xmpp.googleapis.com");//configBuilder.setHost("192.168.1.74");//fcm-xmpp.googleapis.com
configBuilder.setPort(5236);
configBuilder.setCompressionEnabled(false);
configBuilder.setSendPresence(false);
configBuilder.setUsernameAndPassword(senderID@gcm.googleapis.com,serverKey);
//configBuilder.setDebuggerEnabled(true); <-------wish I knew how to use this
configBuilder.setSocketFactory(SSLSocketFactory.getDefault());
SASLPlainMechanism p = new SASLPlainMechanism();
SASLAuthentication.registerSASLMechanism(p); //ACCORDING TO GOOGLE FCM WE NEED TO HAVE A PLAIN
//MECHANISM
XMPPTCPConnection.setUseStreamManagementDefault(true);
XMPPTCPConnection.setUseStreamManagementResumptionDefault(true);
FCMconnection = new XMPPTCPConnection(configBuilder.build());
//FCMconnection.setDebuggerEnabled(true); <-----------WISH I KNEW HOW TO USE THIS
//THIS MANAGER NEVER WORKED
/*
manager = ReconnectionManager.getInstanceFor(FCMconnection);
manager.setFixedDelay(15);
ReconnectionManager.setDefaultReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.FIXED_DELAY);
manager.enableAutomaticReconnection();
try {
FCMconnection.connect();
FCMconnection.login();
Log.d("Thisi","fadf"+myRegId);
Log.d("here","attempting");
} catch (Exception e) {
Log.d("myerror","JJ: "+e);
e.printStackTrace();
}
*/
umm = yes;
try {
FCMconnection.connect();
Log.v("pony", "white horse"+FCMconnection.getStreamId()+" last: "+FCMconnection.getLastStanzaReceived());
Log.d("user","WW: "+FCMconnection.getUser()+" EE "+FCMconnection.isConnected()+" SS "+
FCMconnection.isSecureConnection());
DeliveryReceiptManager dm = DeliveryReceiptManager // WHO KNOWS WHAT THIS DOES.
//NEVER LOGGED ANYTHING FOR ME
.getInstanceFor(FCMconnection);
dm.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
dm.addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(final String fromid,
final String toid, final String msgid,
final Stanza packet) {
Log.d("credentials","from: "+fromid + " to: "+toid+" msg: "+msgid+" stanza: " +
packet.toString());
}
});
android.os.Message y4 = android.os.Message.obtain();
y4.what = LOGINTOFCM;
y4.obj = d.toXML();
umm.sendMessage(y4);
} catch (SmackException e) {
e.printStackTrace();
Log.d("pony", "::Dragony: " + e);
} catch (IOException e) {
e.printStackTrace();
Log.d("pony", "Eagle:: " + e);
} catch (XMPPException e) {
e.printStackTrace();
Log.d("pony", "Earthy: " + e);
}
}
}).start();
现在,在addConnectionListener接口中的connectionClosed方法中,我使用Smack库为FCMconnection对象设置了该接口
我向onCreate()处理程序发送一条消息,尝试启动此动画师,如果连接断开,该动画师将尝试重新连接。调用onCreate()处理程序成功,因此我的动画师启动了,但它的行为与我希望的不同。
此外,我尝试记录FirebaseRegistrationId服务类提供的注册令牌的值,他们在FCM文档中讨论了该服务类。
即使我像文档中所说的那样清楚地记录了文档,这个服务类似乎还没有启动。在这个类中,我尝试使用FirebaseInstanceId.getInstance().getToken()更改onCreate()上的静态字符串的值;在onCreate()中,我给这个静态字符串一个chuwbaka的初始值,该值在应用程序的整个操作过程中保持不变。这让我相信,Firebase API中的这个如此重要的类甚至没有被调用,尽管它在我的清单文件中有明确的文档记录
如果有人有任何想法或建议,请帮助我。我尝试过不同的策略,但这个过时的Smack示例无法解决问题,所有数据包、节、数据包扩展、ExtensionProvider、元素和DefaultElementExtensions的抽象术语只会让工作变得更糟
再次感谢您的尝试。XMPP代码不是您的Android应用程序的一部分,它应该在您的应用程序服务器中。以使用smack为例,看看FriendlyPing,它有两台服务器,一台使用Go,另一台使用Java(和smack)。XMPP代码不是Android应用程序的一部分,它应该在应用程序服务器中。以使用smack为例,看看FriendlyPing,它有两台服务器,一台使用Go,另一台使用Java(和smack)。
private class reconnect implements Runnable{
private reconnect(){
}
@Override
public void run() {
reconnect_animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
if(!FCMconnection.isConnected()) {
try {
FCMconnection.connect();
FCMconnection.login();
} catch (XMPPException e) {
e.printStackTrace();
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.d("are", "LL " + FCMconnection.isConnected() + " WW " + FCMconnection.isAuthenticated() + " ID: " + myRegId);
}
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
if(!FCMconnection.isConnected())reconnect_animator.start();
else{
Log.d("conni","WEE: "+FCMconnection.isConnected());
reconnect_animator.start();
}
}
});
}
}