2013-07-01 5 views
6

Ich muss Push-Benachrichtigungssystem für Android-Anwendungen zu entwickeln, nicht mit Google Cloud-Messaging (Sicherheitsgründe). Hier benachrichtigt der Server alle Geräte, die gerade an einer bestimmten Android-Anwendung angemeldet sind.Wie entwickelt man Push-Benachrichtigungen für Android ohne Verwendung von Google Cloud Messaging?

Ich weiß, die Frage ist ziemlich breit, aber könnte mir jemand die möglichen Lösungen zeigen.

Vielen Dank im Voraus.

+0

Welche Art von Sicherheitsgründen haben Sie, dass Sie zweimal überlegen, wenn ich fragen darf – tyczj

+0

Dies ist ein Teil einer Banking-Anwendung. Und genau aus diesem Grund wurde mir gesagt, dass ich GCM nicht benutzen könnte. – Newbie

+0

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

Antwort

2

Sie können MQTT zum Erstellen eines Push-Benachrichtigungsdienstes verwenden. (Hinweis: Anwendungen wie Facebook verwenden MQTT für Push-Benachrichtigungen).

Also, einen Push-Benachrichtigungsdienst Sie einen MQTT Broker auf dem Server (ich empfehle MQTT Mosquitto und ein bachground-Dienst auf Android-Gerät laufen müssen zu bauen.

-Code für MQTT Dienst (auf dem Server sowohl verwendet werden und auf dem Client sode):

/** 
* 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 
    } 
} 
} 

Um mehr zu erfahren, können Sie überprüfen den MQTT Push-Benachrichtigungsdienst in diesem Projekt umgesetzt. SenSocial, die ich umgesetzt

Wenn Sie nicht tun Haben Sie einen Broker, der auf Ihrem Server läuft, dann können Sie einen öffentlich verfügbaren MQTT Mosquitto-basierten Broker versuchen: MQTT BROKER

+0

Schöne Antwort. Danke für das Teilen. Ich habe mit Offenlegung bearbeitet. – Drew

0

Ich würde empfehlen, GCM nicht zu verwenden. Eine persistente Verbindung vom Telefon zum Push-Server ist teuer (in Bezug auf die Nutzung der Batterie, aber auch das tatsächliche Geld) und GCM macht das für Sie kostenlos. Es ist auch nicht klar, wie Sie einen dauerhaften Socket-Listener im Hintergrund haben wollen. Es ist wahrscheinlich, dass es aufgrund des Erinnerungsdrucks irgendwann durch den Rahmen getötet wird. GCM läuft in einem privilegierten Prozess, der viel schwerer zu töten ist.

Sicherheitsmäßig würde ich empfehlen, die Nutzlast, die Sie haben, zu verschlüsseln, bevor Sie sie an das Gerät senden und dann im Telefon selbst entschlüsseln. Das wäre in Bezug auf Entwicklungskosten und Batterieverbrauch viel billiger.

+0

Wie würden Sie Push-Benachrichtigungen in einem privaten Netzwerk implementieren (wie in einem Kraftwerk ohne Internetverbindung) und gleichzeitig die Vorteile des Stromverbrauchs von GCM beibehalten? – Jeremy