2015-08-21 2 views
6

Ich habe dieses Tutorial https://developers.google.com/cloud-messaging/ios/client verfolgt, um GCM auf meiner iOS-Anwendung zu implementieren. Mein App-Server ist ein Google App-Modul, das in Java geschrieben ist, und ich verwende die Bibliothek gcm-server.jar https://github.com/google/gcm. Ich denke, dass meine Zertifikate in Ordnung sind und ich mich registrieren, ein Token erhalten und sogar den Inhalt der Nachrichten empfangen kann, die von meinem App-Server gesendet werden. Ich erhalte jedoch keine Benachrichtigungen, wenn die App im Hintergrund läuft. Ich erhalte sie immer nur, wenn ich auf das App-Symbol klicke, um sie neu zu starten.Google Cloud Messaging: Keine Warnungen erhalten, wenn iOS App im Hintergrund ist

Ich dachte, das war, weil ich nur didReceiveRemoteNotification: und nicht didReceiveRemoteNotification:fetchCompletionHandler: Umsetzung wurde so umgesetzt ich es statt der ersten, aber ich keine Benachrichtigungen erhalten, während im Hintergrund entweder und schlimmer noch, sandten die App abstürzt etwas sagen wie "Unbekannter Selektor DidReceiveRemoteNotification: "Wie etwas war falsch in der UserInfo. Ich habe Hintergrundmodi in xCode wie benötigt dafür erlaubt. Hier ist der Code, den ich verwende:

Kann jemand herausfinden, was ich nicht Benachrichtigungen erhalten, wenn nicht im Vordergrund?

EDIT: der Java-Code auf der Serverseite verwendet, um die GCM-Nachricht senden:

public static MulticastResult sendViaGCM(String tag, String message, List<String> deviceIdsList) throws IOException { 
    Sender sender = new Sender(Constantes.API_KEY); 
    // This message object is a Google Cloud Messaging object 
    Message msg = new Message.Builder().addData("tag",tag).addData("message", message).build(); 
    MulticastResult result = sender.send(msg, deviceIdsList, 5); 
    return result; 
} 

EDIT2: Screenshots der POST Anfrage http://image.noelshack.com/fichiers/2015/34/1440193492-gcm1.png http://image.noelshack.com/fichiers/2015/34/1440193502-gcm2.png

EDIT3: Die Anfrage, die ich jetzt von meinem App-Server aus verschicke:

public static void sendGCMMessage(String tag, String message, List<String> deviceIdsList) { 
    String request = "https://gcm-http.googleapis.com/gcm/send"; 
    try{ 
     URL url = new URL(request); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     //conn.setInstanceFollowRedirects(false); 
     conn.setRequestMethod("POST"); 
     //Les deux headers obligatoires: 
     conn.setRequestProperty("Content-Type", "application/json"); 
     conn.setRequestProperty("Authorization", "key=" + API_KEY); 
     //Construction du JSON: 
     JSONObject fullJSON = new JSONObject(); 
     JSONObject data=new JSONObject(); 
     JSONObject notification=new JSONObject(); 
     data.put("tag", tag); 
     data.put("message", message); 
     notification.put("sound", "default"); 
     notification.put("badge", "1"); 
     notification.put("title", "default"); 
     notification.put("body", message); 
     fullJSON.put("registration_ids", deviceIdsList); 

     fullJSON.put("notification", notification); 
     fullJSON.put("content_available", "true"); 
     fullJSON.put("data", data); 

     //Phase finale: 
     OutputStreamWriter wr= new OutputStreamWriter(conn.getOutputStream()); 
     wr.write(fullJSON.toString()); 
     wr.flush(); 
     wr.close();//pas obligatoire 
     //conn.setUseCaches(false); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 

Antwort

11

Basierend auf dem GCM documentation, können Sie die content_available auf true gesetzt.

(Auf iOS-Geräten verwenden Sie dieses Feld inhalt in der APNS Nutzlast darzustellen. Wenn eine Benachrichtigung oder eine Nachricht gesendet wird, und dies wird auf true gesetzt, eine inaktive Client-Anwendung aufgewacht ist. Auf Android, Datennachrichten wecken die App standardmäßig. auf Chrome, derzeit nicht unterstützt.)

Die content_available ist content-available Apples entsprechen, die Sie in this Apple Push Notification Service documentation finden.

Sie sollten auch Notification playload verwenden, um eine Nachricht an Ihre iOS-Anwendung zu senden, damit sie ein Banner anzeigen kann, wenn sich Ihre App im Hintergrund befindet.

Hier ist ein Beispiel für eine HTTP Anfrage:

https://gcm-http.googleapis.com/gcm/send 
Content-Type:application/json 
Authorization:key=API_KEY 
{ 
    "to" : "REGISTRATION_TOKEN", 
    "notification" : { 
    "sound" : "default", 
    "badge" : "1", 
    "title" : "default", 
    "body" : "Test", 
    }, 
    "content_available" : true, 
} 

The Java library ist nur ein Beispiel, können Sie andere Felder hinzufügen. In der Klasse Message.java können Sie beispielsweise zwei private Variablen hinzufügen, eine davon ist private final Boolean contentAvailable, eine andere ist private final Map<String, String> notification.

Sie können eine HTTP-Anfrage in Ihrem Terminal versuchen, indem Sie curl -i -H "Content-Type:application/json" -H "Authorization:key=API_KEY" -X POST -d '{"to":"REGISTRATION_TOKEN", "notificaiton":{"sound":"default", "badge":"1", "title": "default", "body":"test",},"content_available":true}' https://android.googleapis.com/gcm/send tun, oder versuchen Sie es in Postman.

Edited:

Wenn die Anwendung beendet wurde, und Sie möchten die Push-Benachrichtigungen auf Ihrem Gerät angezeigt werden, können Sie einen high priority in Ihrem HTTP-Anforderung Körper einstellen (aufpassen, dass Ihre Nachrichten einstellen Eine hohe Priorität trägt mehr zum Batterieverbrauch bei als bei normalen Nachrichten mit Priorität).

Beispiel HTTP-Anforderung:

{ 
    "to" : "REGISTRATION_TOKEN", 
    "notification" : { 
    "sound" : "default", 
    "badge" : "1", 
    "title" : "default", 
    "body" : "Test", 
    }, 
    "content_available" : true, 
    "priority" : "normal", 
} 
+0

Gibt es einen anderen Weg, um fortzufahren? Da die von mir verwendete Java-Bibliothek (https://github.com/google/gcm) anscheinend nicht das Feld content_available oder die Benachrichtigungsnutzlast enthält. Ich werde meine Antwort bearbeiten, um ein Code-Snippet der Nachricht, die ich mit dieser Bibliothek sende, zu schreiben. – Gannicus

+0

@Gannicus, siehe meine Antwort bearbeiten. – ztan

+1

Danke für die Idee von Postman. Ich habe versucht, Ihre POST-Anfrage zu verwenden, aber es ist wirklich komisch: Wenn ich die Anfrage sende, bekomme ich einen "error: notRegistered" und die App kann keine Benachrichtigungen mehr empfangen (sogar die, die ich im Vordergrund erhalten habe). Ich muss ein neues GCM-Token generieren, damit es wieder funktioniert und sobald ich die POST-Anfrage benutze, passiert es erneut. Weißt du, warum? – Gannicus

4

ich das gleiche Problem hatte, konnte nicht Thema informiert, wenn app getötet wurde, diese POST jetzt arbeitet, hatte ich Priorität Höhe hinzuzufügen.

{ 
    "to" : "/topics/offers", 
    "notification" : { 
    "sound" : "default", 
    "badge" : "1", 
    "body" : "Text", 
    }, 
    "priority" : "high", 
} 
+0

Danke! Du hast mein Leben gerettet: D –

Verwandte Themen