gcm android android-c2dm

android - gcm - C2DM: ¿Cómo usar el permiso C2D_MESSAGE?



gcm android (1)

Estoy a punto de implementar C2DM para mi aplicación, pero encuentro la documentation un poco confusa con respecto a cómo escribir el manifiesto.

El ejemplo del código de manifiesto contiene esto:

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

Esto se explica de la siguiente manera:

applicationPackage + ".permission.C2D_MESSAGE impide que otras aplicaciones se registren y reciban los mensajes de la aplicación.

¿Pero cómo funciona esto exactamente? Según tengo entendido, esto declara un permiso y luego obtiene ese permiso para mi aplicación. Pero, ¿dónde exactamente se aplica ese permiso?

El código dado para el registro es:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate registrationIntent.putExtra("sender", emailOfSender); startService(registrationIntent);

¿Cómo puede el Servicio que recibe el registrationIntent saber qué permiso verificar? Como entiendo (y me corrigen si me equivoco aquí), al declarar el permiso, podría haber elegido cualquier nombre de permiso dentro de mi espacio de nombres, por ejemplo, com.example.myapp.permission.WHATEVER.

¿O es C2D_MESSAGE alguna constante mágica que tengo que usar?

Además, la documentación dice que tengo que implementar receptores para com.google.android.c2dm.intent.C2D_MESSAGE y com.google.android.c2dm.intent.REGISTRATION Intents. Pero en el ejemplo del código, los filtros del receptor solo contienen .intent.RECEIVE y .intent.REGISTRATION Intents. ¿A dónde se fue C2D_MESSAGE , y tiene algo que hacer con mi la pregunta anterior?

Espero que esto no sea algo obvio, pero simplemente no lo entiendo ... por favor ayuda.


Los receptores que afirman que necesita en la parte superior del resumen parece ser un error en la documentación, ya que no coincide con el ejemplo de manifiesto.

"Receptores para com.google.android.c2dm.intent.C2D_MESSAGE y com.google.android.c2dm.intent.REGISTRATION.")

Obtuve los ejemplos que dan al trabajo usando simplemente las entradas de manifiesto de ejemplo ajustadas para que coincidan con el nombre del paquete de mi aplicación en particular.

Cuando el código C2DM en Android envía la emisión (o, más bien, cuando busca posibles receptores para enviar la transmisión), busca:

Buscar receptores de difusión para Intento: com.google.android.c2dm.intent.REGISTRATION que tienen el permiso: .permission.C2D_MESSAGE

Todos los mensajes C2DM enviados a su aplicación por el código Android C2DM buscarán ese permiso en particular. Es específico para su aplicación, y simplemente necesita estar en esa estructura (el paquete + ".permission.C2D_MESSAGE" de su aplicación).

En cuanto a cómo la solicitud de registro obtiene el nombre del paquete para usar para los permisos, eso se maneja cuando se registra por primera vez con la "aplicación" adicional: desde la documentación:

"aplicación es la identificación de la aplicación, configurada con PendingIntent para permitir que el servicio de registro extraiga la información de la aplicación".

la línea en cuestión:

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate