2012-04-24 6 views
1

나는이 문제에 익숙해지기를 기대했지만, 지난 2 일 동안 내 머리를 꽤 단순 해 보이는 것으로 끝장 냈습니다. 이미 googlevogella에서 자습서를 따라 내 C2DM 응용 프로그램 클라이언트 + 서버를 구현했습니다.C2DM - 메시지가 서버에서 성공적으로 전송되었지만 기기에 표시되지 않음

나는 잠시 내 문제를 설명하려고합니다 :

  1. 내 클라이언트 응용 프로그램 이 성공적으로을 registrationId받습니다.
  2. 내 서버 인증 토큰을 수신합니다.
  3. 서버가 인증 토큰 및 해당 장치의 registrationId을 사용하여 메시지를 보냅니다.
  4. 서버에서 클라이언트로 메시지를 보낼 때 성공한 메시지 응답 코드 (예 : id = 0 : 1335303367614556 % fd55792500000030 응답 코드 : 200, Google의 C2DM 문서가 성공적인 메시지 여야 함)가 표시됩니다.

그래서 나는 대부분의 아마 내 문제는 그들이 C2DM 서버 내 타사 서버에서 전송되기 때문에, 메시지에 대한 내 수신기,하지만 내 응용 프로그램에 거기에서 얻을 수없는 것을 그림.

StackOverflow 관련 문제는 장치의 포트와 관련이 있지만 응용 프로그램을 등록하고 메시지를받는 데 동일한 수신기를 사용하고 있으며 등록 할 때마다 항상 작동합니다.

public class C2DRegistrationReceiver extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    if (action != null){ 
     if (action.equals("com.google.android.c2dm.intent.REGISTRATION")){ 
      // do something  
     } 
     else if (action.equals("com.google.android.c2dm.intent.RECEIVE")){ 
      // do something else 
     } 
    } 
} 
} 

내 매니페스트 파일 : 여기

내 수신기

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="ro.raullepsa.coder" 
android:versionCode="1" 
android:versionName="1.0" > 

<!-- SDK min version --> 
<uses-sdk android:minSdkVersion="8" /> 


<!-- Only this application can receive the messages and registration result --> 
<permission android:name="ro.raullepsa.coder.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="ro.raullepsa.coder.permission.C2D_MESSAGE" /> 

<!-- This app has permission to register and receive messages from Google's c2dm --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<!-- Permission to use internet --> 
<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 

    <!-- Activities --> 
    <activity 
     android:name="ro.raullepsa.coder.activity.MainActivity" 
     android:label="@string/app_name" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name="ro.raullepsa.coder.activity.RegistrationResultActivity" /> 
    <activity android:name="ro.raullepsa.coder.activity.MessageReceivedActivity" /> 
    <receiver 
     android:name="ro.raullepsa.coder.util.c2d.C2DRegistrationReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND"> 

     <!-- Receive messages --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="ro.raullepsa.coder" /> 
     </intent-filter> 

     <!-- Receive the registration id --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
      <category android:name="ro.raullepsa.coder" /> 
     </intent-filter> 
    </receiver> 
</application> 
</manifest> 

내가 오류를 얻을

, 나는 응용 프로그램을 다시 설치해서 또 다시 시도했다, 다시 등록, I 2 개의 별도 리시버로 시도했지만 C2DM에서 실행중인 모든 서비스를 수동으로 강제 중지하고 다시 설치했지만 아직 아무것도하지 않았습니다.

수신자의 첫 번째 줄에서 대기하도록 디버그 모드에서 시도했지만 등록 할 때 도착하지만 결코 서버에서 메시지를 보낸 후에는 수신하지 않습니다.

나는 꼼꼼하고 도움이된다. 필요한 경우 더 많은 코드를 제공 할 수 있지만 기본적으로는 Lars Vogel's tutorial입니다. 내가 뭘 놓치고 있니?

+0

가 다른 장치에서 봤어> 계정 및 동기화> 백그라운드 데이터에 당신의 배경 데이터를 사용 하시겠습니까? –

+0

그건 실제로 내 계획 이었지만, 이것을 지원할 다른 안드로이드 장치가 없었습니다. 내가 관리 할 수 ​​없다면, 나는 친구의 장치를 빌려서 그의 것을 시도 할 것이다. –

+0

문제를 좁히고 하나의 장치로 문제를 배제하는 데 도움이되므로 중요한 단계라고 생각합니다. 또한 다른 네트워크 (와이파이 대신 3G)에서 시도해보십시오. - 일부 네트워크에서는 C2DM 메시지가 도착하지 않는 것으로 나타났습니다. (그래도 등록 할 수는 있지만 문제는 아닙니다.) –

답변

1

글쎄, 흥미로운 일이 일어났습니다. 전날 밤에 코드를 수정하지 않았지만 오늘 아침에 Wifi를 켜서 메시지를 받았습니다.

이제 모든 것이 정상적으로 작동합니다. 메시지를 보내 자마자 자동으로 장치에 들어갑니다. (예, 내 Wifi도 어제 밤에 있음)

Google 서버에서 긍정적 인 응답 코드를 받았지만 기기에 아무 것도 없었기 때문에 어떤 지연이 발생했는지 확실하지 않습니다. 첫 번째 메시지를 보내는 데 약간의 시간이 걸렸을까요? 나는 잘 모르겠다.

다른 Wi-Fi 네트워크에서 시도했지만 작동합니다. 나는 더 이상 이것에 부딪치지 않기를 희망한다. 아직도, 나는 이상한 행동을 찾는다.

+1

C2DM에 대한 나의 경험은 본질적으로 신뢰할 수 없다는 것입니다. 대부분의 경우 잘 작동하지만 사용하는 모든 앱은 도착하지 않는 메시지에 대처하도록 설계되어야합니다. 따라서 느린 배경 설문 조사가 필요할 것 같습니다. –

1

기기로 GCM 알림이 백그라운드 데이터로 전송됩니다.

설정

관련 문제