我正在尝试使用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?
感谢您的任何建议。
答案 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。
希望这能帮助别人!!