2017-03-27 1 views
0

Smack 라이브러리 버전 4.2는 FCM에서 보낸 것처럼 메시지 본문을 삭제하는 것으로 보입니다. 그러나Smack 4.2 및 CCS (XMPP에서 FCM/GCM) - Smack에서 잘못 구문 분석 된 응답 - JSON 페이로드가 삭제됩니다.

<message><data:gcm xmlns:data="google:mobile:data">{"message_type":"nack","from":"xxx","message_id":"aaaa1","error":"BAD_REGISTRATION","error_description":""}</data:gcm></message> 

, 헤로인 4.2이 메시지를 구문 분석 할 때, 그것은 메시지 내부의 JSON 본문을 삭제하고 내 패킷 수신기에 다음 날 제공 : 내가 디버거를 설정하면 , 나는 다음과 같은 수신 메시지를 볼 수 있습니다

import org.jivesoftware.smack.*; 
import org.jivesoftware.smack.filter.PacketFilter; 
import org.jivesoftware.smack.packet.DefaultPacketExtension; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.packet.Packet; 
import org.jivesoftware.smack.util.StringUtils; 

import javax.net.ssl.SSLSocketFactory; 

public class CcsClient { 

    private static final String HOST = "fcm-xmpp.googleapis.com"; 
    private static final int PORT = 5235; 
    private final XMPPConnection conn; 

    public CcsClient(String senderId, String serverKey) { 
     SASLAuthentication.supportSASLMechanism("PLAIN", 0); 

     ConnectionConfiguration conf = new ConnectionConfiguration(HOST, PORT); 
     conf.setSASLAuthenticationEnabled(true); 
     conf.setSocketFactory(SSLSocketFactory.getDefault()); 
     conf.setServiceName(HOST); 
     conf.setSendPresence(false); 
     conf.setCompressionEnabled(false); 
     conf.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
     conf.setDebuggerEnabled(true); 

     this.conn = new XMPPConnection(conf); 

     conn.addConnectionListener(new AbstractConnectionListener() { 
      @Override 
      public void connectionClosed() { 
       super.connectionClosed(); 
      } 

      @Override 
      public void connectionClosedOnError(Exception e) { 
       super.connectionClosedOnError(e); 
      } 

      @Override 
      public void reconnectingIn(int seconds) { 
       super.reconnectingIn(seconds); 
      } 

      @Override 
      public void reconnectionFailed(Exception e) { 
       super.reconnectionFailed(e); 
      } 

      @Override 
      public void reconnectionSuccessful() { 
       super.reconnectionSuccessful(); 
      } 
     }); 

     try { 
      conn.connect(); 
      conn.login(senderId + "@gcm.googleapis.com", serverKey); 
      System.out.println("connected!"); 
     } catch (XMPPException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static final class GcmPacketExtension extends DefaultPacketExtension { 

     private final String json; 

     public GcmPacketExtension(String json) { 
      super("gcm", "google:mobile:data"); 
      this.json = json; 
     } 

     public String getJson() { 
      return json; 
     } 

     @Override 
     public String toXML() { 
      return "<gcm xmlns=\"google:mobile:data\">" + StringUtils.escapeForXML(json) + "</gcm>"; 
     } 

     public Message toPacket() { 
      Message message = new Message(); 
      message.addExtension(this); 
      return message; 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 
     final CcsClient c = new CcsClient("xxx", "xxx"); 
     c.conn.addPacketListener(new PacketListener() { 

      @Override 
      public void processPacket(Packet packet) { 
       System.out.println("incoming!" + packet.toString()); 
      } 
     }, new PacketFilter() { 
      @Override 
      public boolean accept(Packet packet) { 
       return true; 
      } 
     }); 


     for (int i = 0; i < 1; i++) { 
      c.conn.sendPacket(new GcmPacketExtension("{\"to\":\"xxx\", \"message_id\":\"aaaa"+i+"\", \"delivery_receipt_requested\":true}").toPacket()); 
     } 
     Thread.sleep(1000000); 
    } 
} 

내가 잘못 뭐하는 거지 :

<message><gcm xmlns="google:mobile:data"></gcm></message> 

여기 내 테스트 클래스입니까?

답변