Android und Push - Response Verarbeitung

  • 12 Antworten
  • Letztes Antwortdatum
R

RDunst

Neues Mitglied
0
Hallo,

ich habe ein Problem mit dem GCM Pushing.

Wie kann ich den Response verarbeiten?
Damit ich die "falschen" ID's aus der Datenbank löschen kann, ich hab zwar schon gegooglet und einen link gefunden, nur hilft mir der leider nicht weiter :(

hier den Link den ich gefunden habe:

http://stackoverflow.com/questions/...-invalid-registration-id-from-server-with-php

Code:
function PushAndroid($message)
{
    //Android - Push Notification Variables
    $apiKey = 'xxxxxxxxx';

    //Android - Push Notification Service
    
    $registrationIDs = array();
    
    $abfrage = "SELECT id, registrationId, active FROM `push-android` WHERE active = 'true'";
    $ergebnis = mysql_query($abfrage) or die(mysql_error());
    while($row = mysql_fetch_object($ergebnis))
    {
        $id = $row->id;
        $registrationIDs[] = $row->registrationId;
    }
    
    $url = 'https://android.googleapis.com/gcm/send';

        $fields = array(
                        'registration_ids'  => array($registrationIDs),
                        'data'              => array( "message" => $message ),
                        );

        $headers = array( 
                            'Authorization: key='.$apiKey,
                            'Content-Type: application/json'
                        );

        // Open connection
        $ch = curl_init();

        // Set the url, number of POST vars, POST data
        curl_setopt( $ch, CURLOPT_URL, $url );

        curl_setopt( $ch, CURLOPT_POST, true );
        curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

        curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );

        // Execute post
        $result = curl_exec($ch);

        // Close connection
        curl_close($ch);

        //$obj = json_decode($result);
        
        $jsonArray = json_decode($result);
        
        print_r($jsonArray);
        
        $remove_ids = array();

        for($i=0; $i<count($jsonArray->results);$i++){
            if(isset($jsonArray->results[$i]->error)){
                if($jsonArray->results[$i]->error == "NotRegistered"){
                    $remove_ids[$i] = "'".$registration_ids[$i]."'";
                }
            }
        }
        
        print_r($remove_ids);
}

Leider sind keine ID's im array $remove_ids gespeichert, auch wenn ich "falsche ID's" in der Datenbank gespeichert habe!

Vielleicht kann mir ja jemand helfen.

Dankeschön.

Liebe Grüße,
Roland
 
Ja wie sieht das Array denn dann aus? Sicher dass du die Antwort korrekt verarbeitest?

Und eine viel wichtigere Frage: Verstehst du auch nur im Ansatz, was das ganze Zeug macht? Oder kopierst du nur fleißig Code zusammen und hoffst, dass alles irgendwie funktioniert? (wenn ich so an deine erst kürzlich zig eröffneten Threads denke, glaube ich du kopierst nur alles zusammen ...) Beschäftige dich damit, wenn du es wirklich möchtest... Aber erwarte nicht, dass sich jemand für dich hinsitzt und dir alles perfekt vorbereitet.

Der ursprüngliche Beitrag von 21:50 Uhr wurde um 21:52 Uhr ergänzt:

Ja wie sieht das Array denn dann aus? Sicher dass du die Antwort korrekt verarbeitest?

Und eine viel wichtigere Frage: Verstehst du auch nur im Ansatz, was das ganze Zeug macht? Oder kopierst du nur fleißig Code zusammen und hoffst, dass alles irgendwie funktioniert? (wenn ich so an deine erst kürzlich zig eröffneten Threads denke, glaube ich du kopierst nur alles zusammen ...) Beschäftige dich damit, wenn du es wirklich möchtest... Aber erwarte nicht, dass sich jemand für dich hinsitzt und dir alles perfekt vorbereitet.
 
Mein Array sieht so aus:
stdClass Object ( [multicast_id] => 6.0627430077716E+18 [success] => 0 [failure] => 1 [canonical_ids] => 0 [results] => Array ( [0] => stdClass Object ( [error] => InvalidRegistration ) ) )
von
$jsonArray = json_decode($result);
print_r($jsonArray);


Ich weis das ich jetzt ein JSON Request erstellen muss, damit ich die Push-Benachrichtigung an mehrere senden kann.


Nur weis ich leider nicht wie das genau funktioniert. Kleiner tipp? Bitte.


Ja klar, versteh ich das, ansonst wär ich ja gar nicht so weit gekommen.
Das verlang ich ja auch nicht, er wär mir schon geholfen, wenn mir jemand einen tipp geben würd, das reicht mir ja vollkommen. Vl. Ist das auch ein wenig falsch von mir rübergekommen, tut mir leid.

LG
Roland

Der ursprüngliche Beitrag von 22:44 Uhr wurde um 23:18 Uhr ergänzt:

also der Fehler muss irgendwo hier liegen, oder?

Code:
    $fields = array(
            'collapse_key' => 'test',
            'time_to_live' => '108',
            'delay_while_idle' => 'true',
            'notification_key' => $registrationKeys,
            'registration_ids' => $registrationIDs,
            'data' => $message,
        );

der gesamte Code:

Code:
    $registrationIDs = array();
    $registrationKeys = array();
    
    $abfrage = "SELECT id, registrationId, active FROM `push-android` WHERE active = 'true'";
    $ergebnis = mysql_query($abfrage) or die(mysql_error());
    while($row = mysql_fetch_object($ergebnis))
    {
        $id = $row->id;
        $registrationIDs[] = $row->registrationId;
        $registrationKeys[] = $row->id;
    }
    
    $fields = array(
            'collapse_key' => 'test',
            'time_to_live' => '108',
            'delay_while_idle' => 'true',
            'notification_key' => $registrationKeys,
            'registration_ids' => $registrationIDs,
            'data' => $message,
        );

    $headers = array( 
        'Authorization: key='.$apiKey,
        'Content-Type: application/json'
    );

für einen Tipp wär ich ja schon sehr dankbar, es muss mir keiner die Lösung präsentieren, danke!

LG
Roland
 
Lass dir das Array besser gesagt das Json ausgeben, dass du an den Server sendest und dann vergleiche es mal mit einem "Standard"-Json das an den GoogleServer geschickt gehört. Vll. stimmt in der Syntax etwas nicht (vll. keine Trenner zwischen den anzumeldenden IDs)
 
Guten Morgen,

das hab ich jetzt probiert, aber irgendwie find ich keinen Fehler! :(
Bzgl. Trenner in den ID's, ist es eigentlich genauso wie ich es in google gefunden habe.

Siehst du vielleicht einen Fehler?

{"collapse_key":"no_collapse_key","time_to_live":"108","delay_while_idle":"true","notification_key":["1","2"],"registration_ids":["ab123456ab","abcdef123abcdef"],"data":{"message":"sdfsd"}}

Liebe Grüße,
RDunst
 
Also das ist bereits das Json was du absendest um eine Nachricht zu schicken?

Das Array (in deinem zweiten Beitrag) ist die Antwort auf eine Registrierung oder auf eine Nachricht, weil da steht "InvalidRegistration" drinnen ... Also kram mal das JSON raus, was du zum Registrieren schickst und nicht das was du bereits zum schicken der Nachricht hernimmst.

Deine RegistrationIDs scheinen mir etwas seltsam zu sein, lässt du dir die wirklich beim Client wie hier: Implementing GCM Client | Android Developers angegeben, mitliefern?
 
Ja genau, das JSON schicke ich zum Server!

Code:
{"collapse_key":"no_collapse_key","time_to_live":"108","delay_while_idle":"true","notification_key":["1","2"],"registration_ids":["ab123456ab","abcdef123abcdef"],"data":{"message":"dasdasd"}}

Also kram mal das JSON raus, was du zum Registrieren schickst
Ich glaube das fehlt mir! :/
Ich find nichts passendes mit Google, ich muss auch dazu sagen, das ich ein Registrierungs JSON auch noch nicht gesehen hab :glare:

Deine RegistrationIDs scheinen mir etwas seltsam zu sein
Die sehen absichtlich so aus, weil ich eine Falsche oder nicht vorhandene RegistrationID simulieren möchte, damit ich im Response die ID's abfangen kann und aus der Datenbank löschen kann!

Dankeschön.

Liebe Grüße,
RDunst
 
Wenn ich das hier: Why Invalid RegistraitonID with GCM - workign with phonegap for android? - Stack Overflow richtig deute heißt das so viel wie "Hey das ist gar keine gültige ClientID was du uns da schickst" ...

Also hinterleg als ungültige IDs keine komplett eigenen generierten, sondern welche die die App bereits wieder deinstalliert haben. Oder deinstallier/installier ein paar mal hintereinander und lass dir die IDs ausgeben, laut StackOverflow gibt es bereits dadurch neue IDs (= alte sind ungültig)


//Das mit der Registrierung vergiss bitte wieder, ich hab das mit dem APNS (ApplePushNotificationService) verwechselt, da holt man sich aber die aktuell gültigen IDs vom Server ... Bei GCM fisch ich gerade etwas im trüben ;)
 
Hallo,

also ich hab jetzt einmal die ID vom Simulator gespeichert und einmal die ID vom Android-Phone!

Dann hab ich die App vom Simulator gelöscht, in der DB ist die ID natürlich noch vorhanden und dann hab ich versucht eine Push-Nachricht zu schicken!

Das Ergebnis:

stdClass Object ( [multicast_id] => 5.5797213432155E+18 [success] => 2 [failure] => 0 [canonical_ids] => 0 [results] => Array ( [0] => stdClass Object ( [message_id] => 0:1381233206866490%df6f31cff9fd7ecd ) [1] => stdClass Object ( [message_id] => 0:1381233206862954%df6f31cff9fd7ecd ) ) )

d.h. er hat keiner Fehler gemeldet, obwohl da Simulator die App gar nicht mehr installiert hat.

Woran könnte das liegen?

Ja, kein Problem ;) ich war nur ein bisschen erschrocken :rolleyes2:

Liebe Grüße,
RDunst
 
Wenn es, jetzt mal wieder der Vergleich zum Appledienst, bei GCM ähnlich wie beim APNS ist, dann ist da etwas Verzögerung mit im Spiel ;) D.h. du kriegst vll. einen "Fehler" erst in einer Stunde ;) Installier/deinstallier die App mehrmals auf deinem Smartphone und schau ob sich die ID ändert, generier also direkt mal eine "Hand voll", so dass du mehrere ungültige hast :)
 
Aso, okay! Was? Sooo lange? :scared:
sonst hätte ich mir mit

Code:
usleep(1000000);

geholfen.

Also ich hab jetzt die App am Smartphone 10 mal de- und über Eclispe installiert, die ID bleibt immer die selbe.

Ist es eigentlich dem GCM Server egal, wenn ich ihm falsche (nicht vorhandene) ID's schicke? :rolleyes2:

Liebe Grüße,
Roland
 
Wie gesagt, ich hab die Erfahrung mehr aus dem APNS ... denke aber zumindest teilweise wird sich das unter Android nicht von iOS unterscheiden ;)

Erstmal schickt der GCM-Server von Google an alle Geräte die Nachricht. Erst wenn eines dieser Geräte die Nachricht erhält und zurückmeldet "Hey ich brauch das garnicht mehr", dann weiß auch der GCM-Server Bescheid "Okay, diese ID ist jetzt ungültig". Es könnte (was ich aber nicht glaube) auch so sein, dass das Gerät sich andauernd beim GCM meldet mit seiner aktuellen Liste an "installierten" Apps und dass der GCM dadurch aktuell Bescheid weiß. Denke aber Google hat sich da für den gleichen oder ähnlichen Ansatz wie Apple entschieden, da sich dadurch unnötiger Traffic besser vermeiden lässt.

Da lob ich mir die Debug-Server des APNS, da kann man den Fall in 5 Minuten herbeiführen ;) (die sind anscheinend von den timings etwas "schärfer" gestellt als die Produktivserver)

Testet man bei GCM direkt mit dem Produktivserver oder gibt es da auch Unterschiede bzgl. debug-App und produktiv-App?
 
Ja, die APNS Lösung habe ich eh schon länger implementiert :cool2:

Genau, naja, dann schick ich einfach alle ID's raus und fertig! :rolleyes2:

Genau, bei APNS hast ja als Dev-Server gateway.sandbox.push.apple.com ansonst den gateway.push.apple.com Server.

Bei GCM hast nur einen, da gibts nur den Produktivserver, warum auch immer!
soweit ich das mitgekommen habe :)

Der ursprüngliche Beitrag von 14:41 Uhr wurde um 16:00 Uhr ergänzt:

android - How to parse GCM respond to remove invalid registration id from server with php - Stack Overflow

warum geht das bei allen anderen, und bei mir nicht? :(

Liebe Grüße,
Roland
 

Ähnliche Themen

Mr-Fisch
Antworten
5
Aufrufe
384
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
432
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
483
mkuz24
M
A
Antworten
5
Aufrufe
476
swa00
swa00
S
Antworten
7
Aufrufe
750
Silvasurf
S
Zurück
Oben Unten