2013-07-01 7 views
6

Potrzebuję opracować system powiadomień push dla aplikacji na Androida, nie używając Google Cloud Messaging (powody bezpieczeństwa). Tutaj serwer powiadomi wszystkie urządzenia, które są aktualnie zalogowane do konkretnej aplikacji Android.Jak tworzyć powiadomienia push dla Androida bez korzystania z Google Cloud Cloud Messaging?

Wiem, że pytanie jest dość szerokie, ale czy ktoś mógłby wskazać mi możliwe rozwiązania.

Z góry dziękuję.

+0

jakie masz powody bezpieczeństwa, które sprawiają, że zastanawiasz się dwa razy, czy mogę zapytać – tyczj

+0

To część aplikacji bankowej. I z tego samego powodu powiedziano mi, że nie mogę używać GCM. – Newbie

+0

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

Odpowiedz

2

Możesz użyć MQTT do zbudowania usługi powiadomienia push. (Uwaga: aplikacje takie jak Facebook używają MQTT do powiadomień push).

Tak, aby zbudować usługę powiadomień Push trzeba broker MQTT uruchomiony na serwerze (polecam MQTT Mosquitto i usługa bachground działa na urządzeniu z Androidem.

Kod usługi MQTT (może być stosowany zarówno na serwerze i na Sode klienta):

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

Aby dowiedzieć się więcej, można sprawdzić usługę powiadomień Push MQTT realizowane w tym projekcie. SenSocial że realizowanego

Jeśli nie Jeśli na serwerze działa broker, możesz wypróbować dostępny publicznie broker oparty na MQTT Mosquitto: MQTT BROKER

+0

Dobra odpowiedź. Dziękuję za udostępnienie. Edytowałem z ujawnieniem. – Drew

0

Polecam, aby nie używać GCM. Utrzymywanie stałego połączenia z telefonu do serwera push jest kosztowne (pod względem zużycia baterii, ale także rzeczywistych pieniędzy), a GCM robi to za darmo. Nie jest również jasne, w jaki sposób planujesz mieć stały nasłuch odbiornika w tle. Jest prawdopodobne, że zostanie zabity przez ramy w pewnym momencie z powodu presji pamięci. GCM działa w uprzywilejowanym procesie, który jest trudniejszy do zabicia.

Bezpieczeństwo Zalecam szyfrowanie wszelkich ładunków przed wysłaniem do urządzenia, a następnie odszyfrowanie w samym telefonie. Byłoby to o wiele tańsze pod względem kosztów rozwoju i zużycia baterii.

+0

W jaki sposób wdrożysz powiadomienia push w sieci prywatnej (jak w elektrowni bez zewnętrznego połączenia z Internetem), zachowując jednocześnie korzyści związane z korzystaniem z GCM? – Jeremy