2012-05-01 2 views
0

Мне сложно получать сообщения через c2dm. На самом деле иногда я получаю сообщения с нашего сервера, но это буквально только половина данных. (Я ожидаю 4-значное число и получил только первые 2 цифры .. oO "). Однако в последнее время наш широковещательный приемник оставался абсолютно бесшумным. Поэтому я начал экспериментировать и нажимать свои собственные сообщения c2dm на сервер google, чтобы увидеть, как вещь делают.c2dm сообщения никогда не были получены

в нижней части сообщения, вы можете найти пример класса, как отправлять и принимать C2DM сообщения. все это в значительной степени самостоятельным, так что вы можете подключить его к какой-либо деятельности и отстрел C2dmStaticTest.autopilot(yourSenderId, "foo bar", yourServerSideAuthCode, this, this.getPackageName());

Позвольте мне наметить, что происходит:

  • Настройка статических переменных используемый в BroadcastReceiver
  • Регистрация вещательного приемника и настройка действий и категорий, как это было бы в androidManifest.xml в противном случае.
  • Отправка задачи регистрации на сервер c2dm.

Примечание: Местный встроенный приемник будет генерировать сообщение журнала для каждого полученного намерения! Каждый раз, когда в классе выдается сообщение журнала, тег будет «c2dmTest».

При получении ответа c2dm с регистрационным_идом также будет зарегистрировано и , после чего будет нажата c2dm-сообщение.
Я моделирую здесь наш сервер как можно ближе, чтобы получить больше контроля. В качестве повторного теста я также выдаю сообщение fakeC2DM, которое имитирует фактическое намерение и тестирует широковещательный приемник для функциональности в действии RECEIVE.

Хотя я могу получить токен регистрации с сервера c2dm, я не получаю никаких сообщений, которые я нажал на сервер. Как упоминалось во введении, я наблюдаю такое же поведение, когда наш веб-сервер отправляет сообщения.

Я старался изо всех сил, и я уверен, что я внедрил широковещательный приемник соответственно, и поскольку код ответа сервера для отправки сообщений всегда 200/OK, я также считаю, что сообщение доставляется на сервер успешно.

Однако результат не является ожидаемым, но у меня действительно нет никаких идей, что еще я могу сделать. Поиск таких проходов, как «доставка сообщений не гарантируется», тоже не ободряет. Я не имею в виду сейчас ничего поставляется на все: C

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.util.Log; 

public class C2dmStaticTest { 


    private static String  RECEIVE   = "com.google.android.c2dm.intent.RECEIVE"; 
    private static String  REGISTER  = "com.google.android.c2dm.intent.REGISTER"; 
    private static String  REGISTRATION = "com.google.android.c2dm.intent.REGISTRATION"; 

    private static Context  ctx; 
    private static String  packageName; 
    private static String  message; 
    private static String  auth_code; 

    private static IntentFilter mIntFilt  = new IntentFilter(); 

    //@formatter:off 
    private static BroadcastReceiver mBroadRec = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      final String broadcastAction = intent.getAction(); 
      C2dmStaticTest.log("localReceiver onReceive for action: "+ broadcastAction); 

      if (C2dmStaticTest.REGISTRATION.equals(broadcastAction)) { 
       //execution continues here upon arrival of registration_id 
       String registration_id = intent.getStringExtra("registration_id"); 
       C2dmStaticTest.log("registered for c2dm.\n key is: "+registration_id); 


       C2dmStaticTest.log("==> start real self test"); 
       selfTestC2DM(registration_id, message, auth_code); 
       C2dmStaticTest.log("<== real self test done"); 


       C2dmStaticTest.log("==> start fake test"); 
       selfTestFake(); 
       C2dmStaticTest.log("<== fake test done"); 

       C2dmStaticTest.log("<~~ bye"); 

      } else if (C2dmStaticTest.RECEIVE.equals(broadcastAction)) { 
       C2dmStaticTest.log("Received message: " + intent.getStringExtra("message")); 
      } 
     } 
    }; 
    //@formatter:on 

    public static void autopilot(String sender_id, String message, String auth_code, Context ctx, String packageName) { 
     // setup static variables 
     C2dmStaticTest.ctx = ctx; 
     C2dmStaticTest.packageName = packageName; 
     C2dmStaticTest.message = message; 
     C2dmStaticTest.auth_code = auth_code; 

     C2dmStaticTest.log("==> register broadcastReceiver"); 
     mIntFilt.addAction("com.google.android.c2dm.intent.RECEIVE"); 
     mIntFilt.addAction("com.google.android.c2dm.intent.REGISTRATION"); 
     mIntFilt.addCategory(packageName); 
     ctx.registerReceiver(mBroadRec, mIntFilt); 

     C2dmStaticTest.log("==> register for c2dm"); 
     C2dmStaticTest.registerForC2dm(ctx, sender_id); 
     // will continue in localBroadCastReceiver on Receive for REGISTRATION 
    } 

    private static void registerForC2dm(Context ctx, String sender_id) { 
     Intent registrationIntent = new Intent(C2dmStaticTest.REGISTER); 
     registrationIntent.putExtra("app", PendingIntent.getBroadcast(ctx, 0, new Intent(), 0)); // boilerplate 
     registrationIntent.putExtra("sender", sender_id); 
     ctx.startService(registrationIntent); 
    } 

    private static void selfTestFake() { 
     Intent intent = new Intent(); 
     intent.setAction(C2dmStaticTest.RECEIVE); 
     intent.putExtra("message", "Bender: \"kiss my shiny metal ass!\""); 
     intent.addCategory(C2dmStaticTest.packageName); 
     C2dmStaticTest.ctx.sendBroadcast(intent); 
    } 

    public static void selfTestC2DM(String registration_id, String message, String auth_code) { 

     // create HttpClient 
     HttpClient mHttpClient = new DefaultHttpClient(); 

     // create HttpPost 
     final HttpPost post = new HttpPost("https://android.apis.google.com/c2dm/send"); 
     post.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
     post.addHeader("Authorization", "GoogleLogin auth=" + auth_code); 

     // set payload data ... 
     final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("registration_id", registration_id)); 
     nameValuePairs.add(new BasicNameValuePair("collapse_key", "foo")); 
     nameValuePairs.add(new BasicNameValuePair("data.message", message)); 

     // ... and push it in the post 
     try { 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     } catch (final Exception e) { 
      e.printStackTrace(); // never had a problem here 
     } 

     // start it! 
     try { 
      HttpResponse resp = mHttpClient.execute(post); 
      if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
       // now the message should be send, not? 
       C2dmStaticTest.log("Message send.\nServer response: " + resp.getStatusLine().getStatusCode()); 
      } else { 
       C2dmStaticTest.log("Unexpected Server response.\nServer response: " + resp.getStatusLine().getStatusCode()); 
      } 
     } catch (final Exception e) { 
      C2dmStaticTest.log("Unexpected Exception in execute()"); 
      e.printStackTrace(); 

     } 
    } 

    public static void log(String message) { 
     Log.d("c2dmTest", message); 
    } 
} 

ответ

0

OK, представляя это к нашему серверу людей я узнал, что status code: 200 только указывает на то, что сообщение было успешно, и не то, что могло бы быть семантическая ошибка с данными ,

В этом сценарии я также получил JSONObject, указав ошибку, что ключи несовместимы.
Это то, что я называю проблемой связи на всех уровнях ...

Смежные вопросы