Message GCM Android envoyé avec succès mais non reçu
Je suis en train d'utiliser le GCM service pour envoyer des notifications push pour mes appareils.
J'ai suivi les Android Ruche tutoriel (qui est maintenant obsolète comme de nombreuses autres questions et réponses à ce sujet) pour les fonctions côté serveur, qui à l'air de fonctionner comme prévu depuis que je peux obtenir ce genre de résultats :
{"multicast_id":9131068334342174816,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1377441098827443%1d84a26ff9fd7ecd"}]}
Mais selon quelques réponsesen recevant cette réponse signifie simplement que le message a été accepté par la GCM, serveurs pour l'envoi, mais pas qu'il a été envoyé. Donc, comme prévu, mon BroadcastReceiver
ne pas recevoir quoi que ce soit.
Voici mon BroadcastReceiver
code :
public class GcmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("gcm_debug", "PushReceiver onReceive called");
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
String msgType = gcm.getMessageType(intent);
if(!extras.isEmpty()){
if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(msgType)){
Log.i("gcm_debug", "Message send error");
}else if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(msgType)){
Log.i("gcm_debug", "Message deleted");
}else if(GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(msgType)){
Log.i("gcm_debug", "Message received : " + extras.toString());
}
}
setResultCode(Activity.RESULT_OK);
}
}
Et mon AndroidManifest
:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="<MYAPP>.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="<MYAPP>.permission.C2D_MESSAGE" />
<!-- Require OpenGL ES2 for GMap -->
<uses-feature android:glEsVersion="0x00020000"
android:required="true" />
<!-- Because this app is using the GCM library to send messages, the min SDK cannot be lower
than 8 -->
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/LovRTheme" >
<receiver
android:name=".GcmBroadcastReceiver"
android:permission="com.google.android.gcm.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> -->
<category android:name="<MYAPP>" />
</intent-filter>
</receiver>
<service android:name=".GcmIntentService" />
Et le code côté serveur :
$url = "https://android.googleapis.com/gcm/send";
$fields = array(
'registration_ids' => array($dstRegId),
'delay_while_idle' => true,
'data' => array("message" => $message));
$headers = array(
'Authorization: key=' . $google_api_key,
'Content-Type: application/json');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if($result === FALSE){
die("Curl failed");
}
curl_close($ch);
echo $result;
Je suis de codage à partir de la maison, donc je suppose que GCM n'aurait pas de problèmes à obtenir dans et hors du réseau depuis GCM utilise une sorte de reverse-shell de connexion. De toute façon, je ne recevront pas de la sortie du journal, je suis attendu.
EDIT:
Après avoir quitté mon application en cours d'exécution pour un certain temps, LogCat m'a envoyé les résultats suivants :
08-26 00:00:48.984 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection.
08-26 00:01:49.000 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection.
08-26 00:02:01.672 433-448/? W/BroadcastQueue: Permission Denial: broadcasting Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=<myApp> (has extras) } from com.google.android.gsf (pid=17966, uid=10003) requires com.google.android.gcm.c2dm.permission.SEND due to receiver com.navissal.lovr/com.navissal.lovr.GcmBroadcastReceiver
08-26 00:17:09.063 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection.
08-26 00:18:09.086 17966-17966/? D/GCM: Ignoring attempt to send heartbeat on dead connection.
08-26 00:24:15.250 3936-3951/? V/meshclient: uri: [/beacon?e=wTkyFfdWFtlzOme7rNizVCtnUu9t3SbJgKCe72og-OhyhGIYab1QikytBeU2Nc02QwdDtqI4sX7HHU6GpDQL8zZdKXFXmCics6ZG-Jmr84yvMX1x9EqdyyW1UI6PEhoOb9MV4R_msQ_MEWFnwUzQrV-vGTycKtSNKMMIRE-zM1caIe__7hdu_UStbhz0dhl7cAFmHYF74IQI6EYFCEORxgV2Wts4Ls-hRWEKfEzuBhViND7TeCVpqUOhdVwGMnDO_Qwlo0rpuSNFegdfJCYY4L8fZJogPsXdQW2cFSZ2S0kujCH9uIrljFUTSGcM5GCFuJRq8vWiTP07MqpMq7h2fGGpXQvjImFcVP81erkVzvlYu3bNpjyQe6MhxSFEZrG37Kdp2Fd3liXFZzSjKlLILeYsDK9rRYqO8fEy3PH07et1HjqYWrH-v7wnjcQm6TtyZu914oR-dPBAwX9D3WvbdQlPlqxnuwJ1huUTwaiKotPLgrAzo3Mc5vI93VTs3row]
source d'informationauteur Jivay
Vous devez vous connecter pour publier un commentaire.
Voici l'erreur:
Il devrait être: