2016-06-06 9 views
0

Ich folgte Google Cloud Messaging (GCM) with local device groups on Android gives HTTP Error code 401, um lokale Gerätegruppen auf Android zu verwalten, und erhielt erfolgreich einen Benachrichtigungsschlüssel, aber wenn ich eine Nachricht an den Benachrichtigungsschlüssel sende, bekomme ich die Nachricht nie zurück. Hat jemand diese Arbeit jemals bekommen?So senden Sie eine Nachricht an den Benachrichtigungsschlüssel mit GCM ohne App-Server

Mein Sendecode ist wie:

public void sendMessage(View view) { 
    AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      try { 
       GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getApplicationContext()); 
       String to = notificationKey; // the notification key 
       AtomicInteger msgId = new AtomicInteger(); 
       String id = Integer.toString(msgId.incrementAndGet()); 
       Bundle data = new Bundle(); 
       data.putString("hello", "world"); 

       gcm.send(to, id, data); 
       Log.e(TAG, "sendMessage done."); 
      } catch (Exception ex) { 
       Log.e(TAG, ex.toString()); 
      } 
      return null; 
     } 
    }; 
    task.execute(); 
} 
+0

@ greywolf82, haben Sie erfolgreich eine Nachricht an lokale Gerätegruppe gesendet? –

Antwort

0

Es scheint, es ist ein Missverständnis über das GCM-Konzept. Der App-Server ist ein integral part of GCM messaging.

Die Server-Seite von Google Cloud Messaging (GCM) besteht aus zwei Komponenten :

  • GCM Verbindungsserver von Google bereitgestellt. Diese Server nehmen die Nachrichten von einem App-Server an und senden sie an eine Client-App, die auf einem Gerät ausgeführt wird. Google stellt Verbindungsserver für HTTP und XMPP bereit.
  • Ein Anwendung Server, den Sie in Ihrer Umgebung implementieren müssen. Diese Anwendung Server sendet Daten an eine Client-App über die ausgewählte GCM-Verbindung Server mit dem entsprechenden XMPP oder HTTP-Protokoll.

die Android GCM Playground Versuchen Sie, ein besseres Verständnis dafür zu bekommen.

Hier ist ein Ausschnitt:

public void sendMessage() { 
     String senderId = getString(R.string.gcm_defaultSenderId); 
     if (!("".equals(senderId))) { 
      String text = upstreamMessageField.getText().toString(); 
      if (text == "") { 
       showToast("Please enter a message to send"); 
       return; 
      } 

      // Create the bundle for sending the message. 
      Bundle message = new Bundle(); 
      message.putString(RegistrationConstants.ACTION, RegistrationConstants.UPSTREAM_MESSAGE); 
      message.putString(RegistrationConstants.EXTRA_KEY_MESSAGE, text); 

      try { 
       gcm.send(GcmPlaygroundUtil.getServerUrl(senderId), 
         String.valueOf(System.currentTimeMillis()), message); 
       showToast("Message sent successfully"); 
      } catch (IOException e) { 
       Log.e(TAG, "Message failed", e); 
       showToast("Upstream FAILED"); 
      } 
     } 
    } 
+1

Ich versuche, den Anwendungsserver zu umgehen und die Einbettung des API-Schlüssels in den App-Quellcode zu vermeiden. Ich bin mir sicher, dass es möglich ist, Nachrichten ohne einen App-Server zu senden/zu empfangen, aber der API-Schlüssel muss im Quellcode sein. Deshalb verwende ich lokale Gerätegruppen. Vielen Dank. –

0

Das Feld der Sendemethode stellt die Sender-ID Ihres Projekts. Sie können diese Methode nicht verwenden, um Nachrichten an Instanz-ID-Token (andere Geräte) zu senden. Die Nachrichtenübertragung zwischen Geräten wird derzeit von GCM nicht unterstützt.

Es ist richtig, dass Sie den API-Schlüssel nicht in Ihre Client-App einschließen. Daher benötigen Sie derzeit einen App-Server, um diese Nachrichtentypen zu senden.

Verwandte Themen