Authentication Smack陷阱和过时的代码几乎不可能连接到FCM CCS

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主管也变得沉默

几天来一直试图通过Smack库连接到Firebase CCS。什么也没发生。今天,我尝试设置一个持续时间为10秒的valueanimator,以便在连接出现问题时尝试重新连接。我已经尽我所能记录了这条路的每一步,但是今天日志都没有显示出来。我在日志中遇到了一些异常,例如:X-OAUTH2“不正确/编码,解析器已到达文档末尾”。据我所知,FCM CCS需要验证我的连接。我还是不知道怎么用Smack做这个。在我问他如何处理这件事后,即使是StackOverflow的一位所谓的Smack主管也变得沉默了

我的问题是,连接只是根据Smack库上addConnectionListener的connectionclosed()重写方法自行关闭:

好的,这是我的设置:希望有人能给我指出正确的方向。这真是令人沮丧。Smack似乎是一个很好的XMPP库,但我看不到对它的支持。甚至包侦听器和扩展的术语也是抽象的。网上的教程已经过时了,所谓的权威甚至没有回复

以下是我的代码:

//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();
                }
            }
        });
    }
}