使用Smack Library连接到FCM时编码异常不正确

时间:2016-07-01 08:09:53

标签: android smack firebase-cloud-messaging sasl

我正在尝试使用smack库连接到FCM:

这是我尝试过的。它可以工作,但是当连接尝试登录时我收到异常。

new Thread(new Runnable(){
XMPPTCPConnectionConfiguration.Builder configBuilder =     XMPPTCPConnectionConfiguration.builder();
private Handler umm;
@Override
public void run() {
                        configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.disabled );
configBuilder.setServiceName("fcm-xmpp.googleapis.com");
configBuilder.setHost("fcm-xmpp.googleapis.com");//MAYBE PROBLEM HERE??
configBuilder.setPort(5236);
configBuilder.setCompressionEnabled(false);
configBuilder.setSendPresence(true);
                         configBuilder.setSocketFactory(SSLSocketFactory.getDefault());
InterfaceClass.FCMconnection = new XMPPTCPConnection(configBuilder.build());
umm = yes;

try {
InterfaceClass.FCMconnection.connect();
Log.v("pony", "white horse");
//InterfaceClass.FCMloggin.start();
android.os.Message y4 = android.os.Message.obtain();
y4.what = LOGINTOFCM;
umm.sendMessage(y4);
//the rest of the thread is just exception handling in catch clauses

一旦我的处理程序收到消息,我尝试使用该连接登录 像这样:

try {                        FCMconnection.login("senderId@gcm.googleapis.com","SERVER_KEY");
Log.d("black","r2d2");
} catch (XMPPException e) {//exception thrown here
e.printStackTrace();
Log.d("black","maity "+e);

我得到以下例外情况:     " smack.sasl.SASLErrorException:使用X-OAUTH2的SASLError:错误编码"

现在从文档中明确说明要实现SASL plain机制, 但我不知道怎么做?这是文档所说的内容:

"连接有两个重要要求:

您必须启动传输层安全性(TLS)连接。请注意,CCS目前不支持STARTTLS扩展。 CCS需要使用 @ gcm.googleapis.com(FCM发件人ID)和服务器密钥作为密码的SASL PLAIN身份验证机制,其中发件人ID和服务器密钥是您在配置客户端应用时收集的值。有关获取这些凭据的信息,请参阅所用平台的客户端文档。"

有没有人知道可能导致此异常的原因是什么?我应该如何使用smack库连接到FCM?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

根据通过XMPP协议需要连接到FCM的文档:

1)传输层中的TLS连接,实现此目的,使用TLS协议扩展创建SSLContext

2)普通的SASL协议,确保" smack-sasl-javax-4.1.8.jar"已集成到您的构建设置中。这花了我很多时间来弄明白

3)主机,服务名称和端口号是正确的(请参阅下面的代码片段)

以下代码段对我来说非常适合:

SSLContext sslContext = null;
try {
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, null, null);
} catch (Exception e) {
    //Failed to get default ssl context with TLS enabled... something can't proceed further
}
XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
config.setConnectTimeout(CONNECTION_TIMEOUT);
config.setSendPresence(true);
config.setCustomSSLContext(sslContext);
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setServiceName("gcm.googleapis.com");
config.setHost("fcm-xmpp.googleapis.com");
config.setPort(5236);//not production server
config.setDebuggerEnabled(true);
config.setCompressionEnabled(true);
config.setSocketFactory(sslContext.getSocketFactory());
(mConnection = new XMPPTCPConnection(config.build())).addConnectionListener(ConnectionSession.this);
mConnection.setPacketReplyTimeout(REPLY_TIMEOUT);
mConnection.connect();
mConnection.login(userID, password); //use your app server credential here

从openfire安装程序实施并测试了Smack版本4.8.1。

希望这能帮助别人!!