2016-04-14 34 views
0

私は実際にここで立ち往生しました。プッシュ通知をすると、メッセージは約10分遅れていました。私はlogcatをチェックし、packageNameがロックされていない場合にのみ、メッセージは直接届くでしょう。どのように私はこれを制御できますか?GCMプッシュ通知DELAY

本当にありがとうございます。ここで

は私のlogcatある

Logcat

com.xxx.xxx D/MyGcmListenerService: From: 12345678 
com.xxx.xxx D/MyGcmListenerService: Message: New Alert: #02 (ABC123) 
com.xxx.xxx V/ContextImpl: ----- packageName = com.xxx.xxx is NOT LOCKED ----- 

マニフェスト

<!-- [START gcm_permission] --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<!-- [END gcm_permission] --> 

<!-- [START gcm_receiver] --> 
    <receiver 
     android:name="com.google.android.gms.gcm.GcmReceiver" 
     android:exported="true" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.xxx.xxx" /> 
     </intent-filter> 
    </receiver> 
    <!-- [END gcm_receiver] --> 


    <!-- [START instanceId_listener] --> 
    <service 
     android:name=".notification.MyInstanceIDListenerService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.gms.iid.InstanceID"/> 
     </intent-filter> 
    </service> 
    <!-- [END instanceId_listener] --> 



    <!-- [START gcm_listener] --> 
    <service 
     android:name=".notification.MyGcmListenerService" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 
    <!-- [END gcm_listener] --> 



    <service 
     android:name=".notification.RegistrationIntentService" 
     android:exported="false"> 
    </service> 

サーバサイド

pushNotification("xxxxxxx", "#02(hello)"); 

function pushNotification($registatoin_ids, $message) { 

     // prepare variables for push notification 
     $message = array("message" => "$message", "time_to_live" => 10000, "collapse_key" => "sample", "delay_while_idle" => true); 
     $registatoin_ids = array("$registatoin_ids"); 

     // Set POST variables 
     $url = 'https://android.googleapis.com/gcm/send'; 

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

     $GOOGLE_API_KEY = 'XXXXXXXXXX'; 
     $headers = array(
      'Authorization: key=XXXXXXXXXX', 
      'Content-Type: application/json' 
     ); 
     //print_r($headers); 
     // 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); 

     // Disabling SSL Certificate support temporarly 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

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

     // Execute post 
     $result = curl_exec($ch); 
     if ($result === FALSE) { 
      die('Curl failed: ' . curl_error($ch)); 
     } 

     // Close connection 
     curl_close($ch); 

     // echo $result; 
    } 

MyGcmListenerService

public class MyGcmListenerService extends GcmListenerService { 

    private static final String TAG = "MyGcmListenerService"; 
    private static final String MyPREFERENCES = "xxxx"; 
    private static final String JOB_KEY = "xxxx"; 

    private String JobStatus; 

    int countNotification = 0; 


    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     String message = data.getString("message"); 
     Log.d(TAG, "From: " + from); 
     Log.d(TAG, "Message: " + message); 

     sendNotification(message); 
    } 


    private void sendNotification(String message) { 

     SharedPreferences sharedPreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 
     JobStatus = sharedPreferences.getString(JOB_KEY, ""); 


     if (message.contains("#02")) { 

      String submsg = message.substring(message.indexOf("(") + 1, message.indexOf(")")); 

      Intent launch = new Intent(Intent.ACTION_MAIN); 
      launch.setClass(getApplicationContext(), AnnouncementActivity.class); 
      launch.addCategory(Intent.CATEGORY_LAUNCHER); 
      launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      launch.putExtra("message", submsg); 
      startActivity(launch); 

      NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      notificationManager.cancel(0); 
     } 
    } 
} 
+0

gcmListenerServiceクラスのコードとgcmListenerServiceクラスのコードを共有できますか? – itsa04g9

+0

は既にリクエストとして更新されています – Nizzam

答えて

3

試みは、PHPコード

$fields = array(
     'registration_ids' => $registatoin_ids, 
     'data' => $message, 
     'priority' => 'high' 
    ); 

https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message

高い優先順位であなたの配列$フィールド上の「priority' => 'high'を追加します。 GCMは、高い優先度のメッセージ をすぐに配信しようとします。 が可能なときにGCMサービスがスリープ状態のデバイスをスリープ状態にし、アプリケーションサーバーとネットワーク接続を開くことを許可します。 のインスタントメッセージ、チャット、音声通話のアラートを持つアプリ(一般的に )は、ネットワーク接続を開いて、GCMが メッセージを遅滞なくデバイスに配信する必要があります。 メッセージがタイムクリティカルであり、ユーザーが即時に の操作を必要とする場合にのみ優先度を高く設定し、メッセージを高い優先度に設定すると、通常の優先度 メッセージに比べてバッテリが多く消費されます。

+0

なぜプライオリティを設定する必要がありますか? 1日あたりのリクエストの上限はいくらですか? 申し訳ありません – Nizzam

+0

GoogleがC2DMをGCMに置き換えた後、彼らはすべての制限を解除しました。リクエストの日の制限はありません。優先度のデフォルト値は「通常」であり、可能な場合にGCMサービスがスリープ状態のデバイスを復帰させ、アプリケーションサーバーとのネットワーク接続を開く場合、つまり通知を希望する場合は優先度を「高」に設定する必要がありますできるだけ早くあなたのデバイスに来て、ロックされているだけで優先度を '高'に設定してください – itsa04g9

+0

今、私は情報を得てくれます。 Btwあなたの方法は仕事です。 – Nizzam

1

まさにこれらを生産する既知の問題があります。これはあなたの問題を解決しますあなたはdelay_while_idle=0

にそのプロパティのいずれかを変更するには、サーバー側の担当者に確認してくださいすることができます

+0

はdelay_while_idle = 0に関連していますか? – Nizzam

+0

はい、 このフラグが1の場合、デバイスが起動するまで待機し、0がデバイスに直接送信されるまで待機します。 –

+0

私はサーバの人に感謝の相手 – Nizzam

0

サーバー側の問題

です症状は、したがってあなたが見ている動作の原因となる可能性があります。

安価なWi-Fiルーターでは、接続がリセットされるため、GCMはハートビート間隔でのみアップデートを受信します。

TL; DR:別の無線LANルータで試してみて、まだ同じ問題があるかどうかを確認してください。これらの間隔に問題がない状態が数分後にアイドル状態のソケット接続を切断するネットワーク・ルータや携帯キャリア、によって引き起こされる

https://eladnava.com/google-cloud-messaging-extremely-unreliable/

:詳細については

には、以下のリンクを参照してください。通常、安価な家庭用ルータでは、アイドル状態のソケット接続の最大寿命を決定し、リソースを節約するためにそれを終了することが一般的です。これらのルーターは有限数の同時接続しか処理できません。したがって、この対策は過負荷を防ぐためにとられています。これによりGCMソケットが終了します。

+0

私が使用したモデムは低品質ではなく中程度の仕様だと思います。 – Nizzam

+0

いくつかの安価な機器は素晴らしい品質であり、高価な機器は品質が悪いです。使用している機器の内部に実際に何が入っているのかは分かりません。しかし、別のインターネット接続であなたのアプリケーションの迅速な5分間のテストのために...少なくともこれはあなたの問題に関連しているかもしれないかどうかを知っている...またはそれはあなたの近所に散歩のための便利な言い訳ですwifi-coffee shop /あなたの地域の同等物はどれでもよいでしょう:) –

+0

申し訳ありませんが、私はあなたの提案をします。 – Nizzam

関連する問題