Enviar Notificaciones Push para Android desde Mixpanel

Acabo de implementar las notificaciones push desde Mixpanel para Android, pero revisando la documentación oficial en el sitio web me di cuenta que esta desactualizado, aunque solo es un paso el que tenemos que cambiar me parece interesante hacer este pequeño tutorial.

Instalación del SDK

  1. Primero tenemos que agregar las dependencias
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.mixpanel.android:mixpanel-android:4.6.4'
compile 'com.google.android.gms:play-services-analytics:8.4.0'
compile 'com.google.android.gms:play-services-gcm:8.4.0'

}

2. Agregar los permisos en el manifest

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />

3. Añadir mixpanel a la actividad principal

private static final String projectToken = YOUR_PROJECT_TOKEN; // e.g: "1ef7e30d2a58d27f4b90c42e31d6d7ad"
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


MixpanelAPI mixpanel = MixpanelAPI.getInstance(this, projectToken);
}
@Override
protected void onDestroy() {
mMixpanel.flush();
super.onDestroy();
}

4. Debes reemplazar YOUR_PROJECT_TOKEN con el token de tu proyecto:

Ajustes del proyecto en Mixpanel

Con esto ya tenemos listo todo para poder enviar eventos a nuestra consola, ahora procederemos a recibir push notifications desde Mixpanel.

Lo primero que tenemos que hacer es identificar a los usuarios con un ID único MixpanelAPI.People.identify:

public class MainActivity extends Activity {
MixpanelAPI mMixpanel;

public void onCreate(Bundle saved) {
mMixpanel = MixpanelAPI.getInstance(this, "TOKEN DE MIXPANEL");
mMixpanel.getPeople().identify("ID UNICO PARA ESTE USUARIO"); // Como email
mMixpanel.getPeople().initPushHandling("TUS 12 DIGITOS DE GOOGLE SENDER API");
...
}

public void onDestroy() {
mMixpanel.flush();
super.onDestroy();
}
}

Para poder obtener el Google Sender API será necesario ir a la página de la consola de Google’s API

Una vez que creemos o utilicemos un proyecto existente, hay que proceder a crear una nueva clave de servidor:

Dar click en crear credenciales y seleccionar clave de cuenta de servicio:

Escoger la opción “Clave de API”
Escoger la opción de “Clave de Servidor”

Ahora tenemos que ingresar el nombre del API del servidor y dejar la dirección ip en blanco, esto último es importante ya que Mixpanel necesita poder manejar la ip:

Ingresa el nombre y deja la ip en blanco

Con esto tenemos la clave del servidor:

Ahora procedemos a abrir el proyecto de mixpanel y en los ajustes del proyecto, tenemos que ingresar la clave en donde dice “Android GCM API Key” dentro de la pestaña de notificaciones:

Ahora procederemos a actualizar nuestro Manifest y crearemos una clase para poder manejar la respuesta de una mejor manera.

Tenemos que establecer los permisos para poder registrar, recibir y reaccionar a las notificaciones desde “ Google Cloud Messaging” , también para instalar y escuchar las notificaciones “push” desde los servidores de Google.

<permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" />

Recuerda remplazar “YOUR_PACKAGE_NAME” por el paquete raíz de tu proyecto y que los permisos estén dentro el tag de <application>.

También tenemos que tener estos permisos dentro de nuestro manifest para que funcione correctamente:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Ahora debemos crear una clase que extienda de WakefulBroadcastReceiver para que podamos manejar la información que este dentro del “push”, la ruta que suelo usar es YOUR_PACKAGE_NAME.service.gcm y la clase que va dentro de este paquete quedaría así:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

private static final String TAG = "GcmBroadcastReceiver";

@Override
public void onReceive(Context context, final Intent intent) {
if (intent != null && intent.getExtras() != null && intent.getExtras().containsKey(mp_message) {
DebugUtils.logDebug(TAG, intent.getExtras());
new Thread(new Runnable() {
public void run() {
try { NotificationUtils.displayNotification(intent.getExtras().getString("mp_message")); // ToDo manejar las notificaciones push desde mixpanel
} catch (Exception e) {
DebugUtils.logError("GcmBroadcastReceiver", e);
}
}
}).start();
}

}

Ahora tenemos que informar al S.O que permita al nuestro servicio manejar todas las notificaciones que nos lleguen a la aplicación

<receiver
android:name="YOUR_PACKAGE_NAME.service.gcm.GcmBroadcastReceiver"
android:permission="com.google.android.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="YOUR_PACKAGE_NAME" />
</intent-filter>
</receiver>

En caso de que quieras que tu aplicación maneje las notificaciones nativamente utiliza la clase de mixpanel:

<receiver android:name="com.mixpanel.android.mpmetrics.GCMReceiver"
android:permission="com.google.android.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="YOUR_PACKAGE_NAME" />
</intent-filter>
</receiver>

Por último recuerda que tienes que identificar al usuario desde el inicio de tu aplicación, personalmente lo tengo desde mi clase que extiende Application:

protected void onCreate(Bundle savedInstanceState) {
mMixpanel = MixpanelAPI.getInstance(this, YOUR_MIXPANEL_PROJECT_ID_TOKEN);
MixpanelAPI.People people = mMixpanel.getPeople();
people.identify(THE_DISTINCT_ID_FOR_THE_USER); // Como el correo
people.initPushHandling(YOUR_12_DIGIT_GOOGLE_SENDER_ID);
}

Ahora es importante que para poder mandar notificaciones “Push” deberás tener personas registradas en la consola:

Una vez que tengas usuarios registrados, puedes enviar notificaciones individuales o desde dos opciones abajo “Notifications”

+New Notifications -> Push Notification

Aquí puedes ingresar un texto plano o en “Custom Data” puedes ingresar un Json, también puedes escoger el preview (Solo es para visualización previa). Una vez ingresado lo que enviaremos procederemos a darle click en el botón de “Continue” e ingresar un nombre para esta notificación:

Ingresa el texto -> Continue -> Nombra la notificación

La siguiente página es donde viene el poder de Mixpanel, aquí puedes filtrar las personas que recibirán el “Push”, en mi caso quiero que solo le lleguen a los usuarios que tengan menos de 5 meses de antigüedad y que vivan en México:

Selecciona filtros -> Continue

Por último definiremos el tiempo en que se entregarán las notificaciones “Push”, así como si deseamos que se empiecen a enviar o si queremos que se envíen después:

Escoge el tiempo de entrega -> Guarda

Si decidiste que Mixpanel maneje las notificaciones por ti, deberá aparecer algo así:

Y si decidiste manejar la notificación por ti, espero que hagas algo increíble. Puedes consultar la Guía de Google para lograrlo.