2013-07-01 24 views
6

Ho bisogno di sviluppare un sistema di notifica push per le applicazioni Android, non utilizzando Google Cloud Cloud (motivi di sicurezza). Qui il server notificherà tutti i dispositivi che sono attualmente connessi a una particolare applicazione Android.Come sviluppare le notifiche push per Android senza utilizzare google cloud messaging?

So che la domanda è abbastanza ampia, ma chiunque potrebbe indicarmi le possibili soluzioni.

Grazie in anticipo.

+0

che tipo di motivi di sicurezza hai che ti fanno pensare due volte se posso chiedere – tyczj

+0

Questa parte di un'applicazione bancaria. E per la stessa ragione mi è stato detto che non potevo usare GCM. – Newbie

+0

guarda http://stackoverflow.com/questions/15297246/are-there-any-alternative-to-gcm-google-cloud-messaging-for-custom-android-bui –

risposta

2

È possibile utilizzare MQTT per creare un servizio di notifica push. (Nota: applicazioni come Facebook utilizzano MQTT per le notifiche push).

Quindi, per costruire un servizio di notifica push avete bisogno di un mediatore MQTT in esecuzione sul server (mi raccomando MQTT Mosquitto e un servizio di bachground in esecuzione sul dispositivo Android.

codice per il servizio MQTT (può essere utilizzato sia sul server e sul sode client):

/** 
* MQTTManager class provide methods to connect, subscribe, publish, and listen to MQTT broker 
*/ 
public class MQTTManager { 

private final String TAG = "MQTT"; 
private final String BROKER_URL = "http://mqtt-dashboard.com/info/broker:1883"; //change it to your broker URL 
private MqttClient mqttClient; 
private String CLIENT_ID = "123" 
private String topic = "ABC" 
private int keepAliveInterval=60*5; 
private MqttConnectOptions opt; 

/** 
* Constructor 
* @throws MqttException 
*/ 
protected MQTTManager() throws MqttException { 
    opt=new MqttConnectOptions(); 
    opt.setKeepAliveInterval(keepAliveInterval); 
    opt.setConnectionTimeout(10); 
    mqttClient = new MqttClient(BROKER_URL, CLIENT_ID, new MemoryPersistence()); 
    mqttClient.setCallback(new MQTTCallback(BROKER_URL, CLIENT_ID, topic)); 
} 

/** 
* Connects to the MQTT broker service on server side. 
*/ 
public void connect(){ 
    try { 
     mqttClient.connect(opt); 
    } catch (MqttException e) { 
     Log.e(TAG, "Error while connecting to mqtt broker: "+e.toString()); 
    } 
} 

/** 
* Subscribes the device to the topic provided via constructor 
*/ 
public void subscribeDevice(){ 
    try { 
     mqttClient.subscribe(this.topic); 
    } catch (MqttException e) { 
     Log.e(TAG, "Error while subscribing to mqtt broker: "+e.toString()); 
    } 
} 

/** 
* Publishes the message to the MQTT broker service. 
* @param String Message that needs to be published 
*/ 
public void publishToDevice(String message){ 
    try { 
     MqttTopic mtopic=mqttClient.getTopic(this.topic); 
     MqttMessage msg= new MqttMessage(message.getBytes()); 
     mtopic.publish(msg); 
    } catch (MqttException e) { 
     Log.e(TAG, "Error while publishing to mqtt broker: "+e.toString()); 
    } 
} 


/** 
* Inner class for mqtt callback 
*/ 
public class MQTTCallback implements MqttCallback{ 

    final private String TAG = "MQTT"; 
    private String BROKER_URL; 
    private String CLIENT_ID;     
    private String TOPIC; 
    private MqttClient mqttClient; 

    public MQTTCallback(String BROKER_URL, String CLIENT_ID, String TOPIC) { 
     this.BROKER_URL= BROKER_URL; 
     this.CLIENT_ID = CLIENT_ID; 
     this.TOPIC=TOPIC; 
    } 

    public void connectionLost(Throwable arg0) { 
     connect();   
    } 

    public void deliveryComplete(MqttDeliveryToken arg0) { 
     if(arg0==null) 
      System.out.print("Message delivered");   
    } 

    public void messageArrived(MqttTopic arg0, MqttMessage arg1) 
      throws Exception { 
     // MESSAGE ARRIVES HERE!! argo-> device id & arg1 --> message 
    } 
} 
} 

Per ulteriori informazioni, è possibile controllare il servizio di notifica push MQTT implementato in questo progetto:. SenSocial che ho implementato

Se non lo fai avere un broker in esecuzione sul tuo server, quindi puoi provare un broker basato su Mosquitto MQTT disponibile pubblicamente: MQTT BROKER

+0

Bella risposta. Grazie per la condivisione. Ho modificato con la divulgazione. – Drew

0

Mi raccomando di non utilizzare GCM. Mantenere una connessione persistente dal telefono al server push è costoso (in termini di utilizzo della batteria ma anche di denaro effettivo) e GCM lo fa gratuitamente. Inoltre non è chiaro come si preveda di avere un listener di socket persistente in background. È probabile che verrà ucciso dal framework a un certo punto a causa della pressione della memoria. GCM funziona in un processo privilegiato che è molto più difficile da uccidere.

Per motivi di sicurezza, consigliamo di crittografare qualsiasi payload prima di inviarlo al dispositivo, quindi decrittografarlo nel telefono stesso. Sarebbe molto più economico in termini di costi di sviluppo e utilizzo della batteria.

+0

Come implementeresti le notifiche push su una rete privata (come in una centrale elettrica senza connessione Internet esterna), pur mantenendo i vantaggi dell'utilizzo energetico di GCM? – Jeremy

Problemi correlati