Activa las notificaciones push PhoneGap Spain

Foro

Home Forums PhoneGap Push Notifications (dudas varias)

This topic contains 16 replies, has 6 voices, and was last updated by  gerarifes 22 horas, 5 minutos .

Viendo 15 respuestas - de la 1 a 15 (de 17 en total)
  • Push Notifications (dudas varias)

    Intervenciones
  • Murph
    Murph 
    Participant

    Buenas a todos.

    Como decía en el título de mi post, más que preguntás ténicas sobre las notificaciones Push, tengo dudas relacionadas sobre qué camino escoger.
    He terminado el desarrollo de una app (ios, android) y solo me queda implementar las notificaciones Push, por lo que se entiende que nunca las he utilizado. Paso a preguntarles mis dudas a ver quién me puede orientar un poco:

    - Al empezar a investigar sobre el tema, me he percatado que hay diversos plugins para phonegap. Después de leer un poco me parece que éste (https://github.com/phonegap/phonegap-plugin-push/) es de los más completos en cuanto a documentación. También he visto por aquí opiniones positivas. ¿Me lo recomendáis o hay alguno que tenga más potencial?

    - Como ya imaginaba, hay 3 partes importantes en la ejecución de una notificación Push. 1 – La app, 2 – El servicio de envío y 3 – El sistema para enviar la notificación.
    La app, es la propia aplicación con su plugins de notificaciones, el servicios de envío he visto que todo el mundo tira por Google Cloud Messaging (con Firebase creo) o PushWoosh y luego me refiero al sistema de envío de la notificación al panel desde el cual se envían los mensajes. Mi pregunta es, ¿es obligatorio utilizar un servicio de envío externo? ¿No puedo utilizar mi propio servidor para enviar las notifiaciones (montando un web service o similar)? ¿Alguien con experiencia en esto? No me motiva mucho tener que depender de un servicio para enviar los mensajes la verdad.
    Si me recomendáis la opción de utilizar un servicio externo, me recomendáis Google Cloud Messaging? Creo que está limitado, pero está bien.

    Eso es todo, de momento jaja.
    Gracias, saludos.


    edubht 
    Participant

    Yo estoy en la misma situación que tu, he probado con firebase, tu puedes usar el servicio, y montarte tu plataforma de envío de notificaciones, por ejemplo yo he probado en php, usando la api de firebase es bastante sencillo.
    Las pruebas las he hecho con el plugin cordova-plugin-firebase y consigo obtener el token y recibir notificaciones, pero no acaba de funcionar bien, haciendo pruebas en algunos dispositivos daba error y se cerraba la app sin motivo aparente…
    A ver si alguien nos puede recomendar algún otro plugin que funcione mejor.


    gustter 
    Participant

    1. El plugin se usa para obtener el token (registrar que el dispositivo recibirá notificaciones).

    2. Vía ajax (por ejemplo) envías el token a tu servidor y en éste lo guardas en la base de datos.

    3. Programas un proceso en tu servidor que se conecte a Google y Apple para enviar las push. Hay librerías para Node.js, Java, PHP y demás para esto.

    Yo lo tengo hecho con Node y Java y funca bien.

    Saludos.


    Murph
    Murph 
    Participant

    Hola! Voy a probar a ver qué saco y os cuento cómo me ha ido.
    Gracias por vuestro tiempo!


    Murph
    Murph 
    Participant

    Hola Gustter!

    Tengo todo montado pero en el punto 3 tengo problemas.

    Estoy usando un PHP para enviar las notificaciones (he guardado en base de datos el ID de mi dispositivo desde la propia app con el plugin) pero siempre que ejecuto el PHP me dice que no estoy autorizado… Tengo una API key para ello, pero no entiendo bien el motivo… Estoy empezando a pensar que es algo del panel de Google APIS…

    Expongo aquí el PHP que lo he sacado de Github por si alguien ve fallos…

     Code: arbitrary (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.
    26.
    27.
    28.
    29.
    30.
    31.
    32.
    33.
    34.
    35.
    36.
    37.
    38.
    39.
    40.
    41.

    $to=$id_dispositivo; //Los ids los obtengo de la base de datos del servidor
    $title="Push Notification Title";
    $message="Push Notification Message";
    sendPush($to,$title,$message);

    function sendPush($to,$title,$message)
    {
    // API access key from Google API's Console
    // replace API
    define( 'API_ACCESS_KEY', 'AIzaSyDXw3VIkA***************************dsf57357dfs57sdf');
    $registrationIds = array($to);
    $msg = array
    (
    'message' => $message,
    'title' => $title,
    'vibrate' => 1,
    'sound' => 1

    // you can also add images, additionalData
    );
    $fields = array
    (
    'registration_ids' => $registrationIds,
    'data' => $msg
    );
    $headers = array
    (
    'Authorization: key=' . API_ACCESS_KEY,
    'Content-Type: application/json'
    );
    $ch = curl_init();
    curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
    curl_setopt( $ch,CURLOPT_POST, true );
    curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
    $result = curl_exec($ch );
    curl_close( $ch );
    echo $result;
    }

    A ver si alguien ve algo raro…
    Gracias.


    Murph
    Murph 
    Participant

    Buenas a todos.

    Comentarles que ya he solucionado el problema. No tenía nada que ver ni con el script PHP ni con la app, era que simplemente no había limitado por IP del servidor (la ip del servidor desde el cual conecto con la API) la clave de la API de Google. Una vez hecho este cambio, todo perfecto.

    @edubht, si necesitas una ayudita no dudes en pedírmelo.
    Saludos y gracias.


    gustter 
    Participant

    Good news :)


    edubht 
    Participant

    Me alegro Murph!
    Entiendo que has usado el plugin “https://github.com/phonegap/phonegap-plugin-push/”, verdad?
    Si pudieras poner los pasos que has seguido para conseguirlo te lo agradecería.
    Por lo que veo usas la api key de gcm, yo tenia entendido que este servicio se había sustituido por firebase, intenté usar gcm, pero siempre me redirigia a firebase.
    Lo que me gustaria saber es, si el servicio de google lo has registrado en gcm o firebase, y como coger el id del dispositivo para luego poder enviarle las notificaciones.

    Por otra parte, por lo que estube probando, hay dos tipos de notificaciones, las de tipo notifications, y las de tipo data, las de tipo notifications si la app estaba en segundo plano solo salia el icono de la notificación en la barra de notificaciones, pero no vibraba ni sonaba ningún sonido, estando la app en primer plano si que vibraba y sonaba. Con las de tipo data aun estando en segundo plano también vibraban y sonaban.

    ¿Cuando las recibes con tu código php, te vibra y suena aun estando en segundo plano?

    Gracias.

    Saludos,


    edubht 
    Participant

    ya lo tengo, parece que ya me funciona correctamente también… 8-)
    Usando firebase, y enviando como data, funciona como esperaba!


    edubht 
    Participant

    Pero de momento solo lo he podido probar en Android, ¿en ios has podido probarlo?


    G
    G 
    Participant

    @edubht, @Murph, me gustaría saber como les fue con este asunto y si pudieran compartir algo de su experiencia al respecto.

    En mi caso estoy trabajando en una app para Android y para iOS.
    Las notificaciones en Android me funcionan de maravilla. Pero en iOS no logro que las notificaciones lleguen.
    Uso cordova-plugin-push. Cuando levanto la app me guardo a nivel de servidor el ID de registro del dispositivo. En ambos casos (Android e iOS) obtengo el ID correctamente.

    Desde el servidor con PHP, para los casos de Android, estoy enviando de la siguiente forma:

     Code: PHP (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.

    $API_ACCESS_KEY='AIza...........';
    $registrationIds=array($ID_DEL_DISPOSITIVO);
    $fields=array(
        'registration_ids'=>$registrationIds,
        'data'=>array(
            'message'=>'TEXTO DEL MENSAJE',
            'title'=>'TITULO DEL MENSAJE',
            'vibrate'=>1,
            'sound'=>'default'
        )
    );
    $headers=array(
        'Authorization: key='.$API_ACCESS_KEY,
        'Content-Type: application/json'
    );

    $ch = curl_init();
    curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
    curl_setopt( $ch,CURLOPT_POST, true );
    curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
    $result = curl_exec( $ch );
    curl_close( $ch );

    Hasta ahí funciona perfectamente con Android, la notificación llega inmediatamente en absolutamente todos los casos que probé.

    Sin embargo, si hago lo mismo para iOS nada llega.
    Sé que está la opción de hacerlo directamente a través de los APNs de Apple. Ahí me funcionaba muy bien en modo development, sin embargo cuando compilaba la app para iOS en modo distribution y subía al AppStore, no me funcionaba (previamente cambiando las URL de envío de api.development.push.apple.com a api.push.apple.com en el envío desde el servidor). Como me cansé de buscarle solución por ese lado, pensé en que, si para Android el FCM me funcionaba perfecto, también lo haría para iOS.

    Entonces cargué los .p12 de development y de distribution en Firebase. A partir de ese momento los ID de registro de dispositivos cambiaron el formato, y comenzaron a tener la misma estructura que los que me daba cuando registraba un Android, así que supuse que iba por buen camino.

    Para asegurarme que estaba registrando correctamente (cosa que es obvio si ya me devuelve un ID) usé la URL https://iid.googleapis.com/iid/info/ para asegurarme que estaba registrando correctamente.
    Lo hice con JS y ajax de Jquery:

     Code: JS (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.

    $.ajax({
        url: 'https://iid.googleapis.com/iid/info/ID-DEL-DISPOSITIVO-AQUI?details=true',
        method: 'GET',
        headers: {
          'Authorization':'key=AIza...................',
          'Content-Type': 'application/json'
        },
        dataType: 'text',
        success: function(datos){
          alert(datos);
        },
        error:function(jqXHR,textStatus,errorThrown){
          alert(errorThrown);
        }
    });

    Con eso obtuve una respuesta como la siguiente (Ejemplo de iOS, con Android devuelve mismo formato):

     Code: JSON (select
    1.
    2.
    3.
    4.
    5.
    6.

    {
      "applicationVersion":"VERSION-DE-MI-APP",
      "application":"ID-DE-MI-APP",
      "authorizedEntity":"704...........38",
      "platform":"IOS"
    }

    Con esto me aseguré que en ambos sistemas operativos (Android e iOS) registraba correctamente.
    Hecho eso se supone que lo único que falta es disparar la notificación desde mi servidor (en mi caso con PHP).
    Sin embargo, cuando lo hago utilizando cURL (ver código PHP arriba) con el id de registro del dispositivo en iOS no llega nada (sí lo hace cuando lo envío a un Android).

    Para completar mi explicación y también que pueda servir a otros que están buscando información, el código que estoy usando con Phonegap para registrar es el siguiente:

     Code: JS (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.
    26.
    27.
    28.
    29.

    var push = PushNotification.init({
          "android": {
            "senderID": "704...........38",
            "sound": true,
            "vibration": true
          },
          "browser": {
            
          },
          "ios": {
            "senderID":"704...........38",
            "sound": true,
            "vibration": true,
            "badge": true
          },
          "windows": {
            
          }
      });
      push.on('registration', function(data) {
          var idRegistroDispositivo=data.registrationId;
          //Aquí obtengo el código y lo guardo en una base de datos de mi servidor (lo subo con ajax)
      });
      push.on('error', function(e) {
          //Aquí mi código de lo que hago si ocurre un error al registrar el dispositivo
      });
      push.on('notification', function(data) {
          //Aquí mi código de lo que hago con la notificación que llega desde el servidor.
      });

    ¿Alguien que haya avanzado un poco más en esto?


    G
    G 
    Participant

    Aclaración:
    Al momento usaba cordova-plugin-push en su versión 1.8.x y 1.9.x, de esta forma (config.xml):

     Code: XML (select
    1.
    2.
    3.

    <gap:plugin name="phonegap-plugin-push" source="npm" spec="~1.9.0">
            <variable name="SENDER_ID" value="704............38" />
    </gap:plugin>

    Nota: si no lleva el “gap:” PhoneGap Build indica que el plugin no es compatible.

    Actualización:
    Leyendo por ahí, vi que a partir de la versión 2.x.x de cordova-plugin-push no requiere indicar el SENDER_ID por variable, sino que se deben poner en el root del proyecto los archivos google-services.json para Android y GoogleService-Info.plist para iOS. Ambos se descargan de la plataforma del FCM (https://console.firebase.google.com).

    Quedando el config.xml de esta forma:
    1.  <gap:plugin name="phonegap-plugin-push" source="npm" spec="2.0.0"/>
    Al momento la última versión de este plugin está en 2.1.0 que soporta Android Oreo., lo que supongo que es recomendable usar.

    ¿Entonces? ¿Algún avance?:
    Lamentablemente no, ya que al actualizar a la versión 2.0.0 o 2.1.0 del plugin ahora el inconveniente es otro.
    Cuando lo llevo al Phonegap Build para compilar, para iOS compila bien (y al momento de escribir estas líneas no lo he probado en el iPhone, cuando lo haga lo comentaré), pero para Android falla el compilador, arrojando un error.
    Cuando voy a los logs para ver el error me encuentro con las siguientes líneas:

     Code: TEXT (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.

    :processReleaseGoogleServices FAILED

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':processReleaseGoogleServices'.
    > File google-services.json is missing. The Google Services Plugin cannot function without it.
       Searched Location:
      /project/src/release/google-services.json
      /project/google-services.json

    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

    BUILD FAILED

    Tengamos en cuenta que el archivo google-services.json se encuentra en la raíz del proyecto, al mismo nivel que la carpeta www. Solo para descartar, copié y pegué el archivo en otras ubicaciones quedando en todas las siguientes:
    /google-services.json
    /www/google-services.json
    /platforms/google-services.json
    /platforms/android/google-services.json <small>(la carpeta android no existía, la cree para probar, luego la borré porque me generó otros conflictos).</small>
    /platforms/browser/google-services.json
    /platforms/browser/www/google-services.json
    /platforms/browser/platform_www/google-services.json
    Y no recuerdo si llegué a crear alguna que otra carpeta más con el fin de probar. En todos los casos el compilador siempre me arrojó el mismo error: File google-services.json is missing.

    Si alguien tiene más data para orientarme le agradezco. Supongo que luego que haga funcionar el plugin push con la versión actualizada volveré al inconveniente inicial, a saber, que las notificaciones lleguen.


    G
    G 
    Participant

    Actualización:

    Como comentaba anteriormente, Phonegap Buil compiló correctamente para iOS pero no para Android.
    De todas formas instalé el .ipa (la app para iOS) en un iPhone. Luego llegó la hora de las pruebas.

    Obtuve correctamente el ID de registro del dispositivo, ahora en un formato más corto (distinto al de Android), por lo que pensé que ya no estaba registrando con FCM (aunque todo lo referente a FCM no lo conozco mucho, tal vez alguien me pueda aclarar esos temas también).

    De todas formas, antes de probar con los APNs de Apple, intenté probar el envío de una notificación mediante https://fcm.googleapis.com/fcm/send (ver código en un comentario mío más arriba).
    Resultado: error de token.
    Con eso confirmé que la app no estaba registrando en FCM.

    Sin embargo obtuve un ID de registro del dispositivo, por lo tanto asumo que en algún lugar está registrando. Si no es en el FCM será en Apple.

    Acto seguido, pruebo enviar notificación a través del APN de Apple. Hay que tener en cuenta que para hacerlo es necesario tener un archivo .pem que se crea en combinación con las llaves de la plataforma de desarrollo de apple y las creadas manualmente. Más arriba comenté cómo hacer esas llaves (https://iandevlin.com/blog/2012/11/phonegap/building-an-ios-signing-key-for-phonegap-in-windows/).

    El código que utilicé para enviar a través de los APNs de Apple (y que en su momento me llegó a funcionar), es el siguiente:

     Code: PHP (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.

    $pemfile='RUTA-AL-ARCHIVO-PEM/ios_development.pem';
    //también probé con aps.pem
      if (file_exists($pemfile)) {
        $device_token   = "ea4..................2d8";
        $pem_file       = $pemfile;
        $pem_secret     = 'CONTRASEÑA-DE-MI-PEM';
        $apns_topic     = 'ID-DE-MI-APP'; //por ejemplo: com.dominio.subdominio

        $sample_alert = '{"aps":{"alert":"Hi!","sound":"default"}}';
        $url = "https://api.development.push.apple.com/3/device/$device_token";
        //al estar instalado en modo desarrollo la url lleva "develompent"
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $sample_alert);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
        curl_setopt($ch, CURLOPT_PORT, 443);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic"));
        curl_setopt($ch, CURLOPT_SSLCERT, $pem_file);
        curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret);
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        echo $response;
        echo $httpcode;
      }

    El resultado?: nada.
    La variable $response me devuelve false y $httpcode me devuelve 0, y como era de esperarse no llega ninguna notificación al iPhone.


    Murph
    Murph 
    Participant

    Hola amigos.

    A quien me preguntaba por ahí, sí, uso Push Plugin -> https://github.com/phonegap/phonegap-plugin-push/

    G! Exactamente me pasó lo mismo que a ti. Tenia todo perfectamente configurado (App, plugin configurado, etc etc….) y me funcionaba perfecto (en ios y android). Pero en cuanto actualizacion el plugin (no sé si era la versión 2) y me actualicé, me pasó exactamente lo mismo, no hubo forma de compilar porque no supe como hacer que reconociera el archivo google-services.json (que hay que generarlo desde firebase para android e ios por separado).

    Lo cierto es que probé todo lo que pude y no logré hacerlo, así que me volví al commit anterior (con la conf y plugin de la versión que ya tenía y funcionaba) pero dejó de funcionar para iOS :evil: . Como tenía mucha prisa para sacar la app, pasé de todo… casualmente en esta semana tengo que retomarlo así que os diré exactamente cómo lo he hecho en plan tutorial.

    Gracias y espero que mi opinión os confirme como a mi que no es cosa mía solamente.


    cetegu 
    Participant

    Hola a todos, Yo desarrolle Mi app con ionicframework y angular. Utiliza push notifications, y otros plugins como audio, etc. Todo funciona bien.

    Deje de utilizar Jquery y phonegap build porque en Mi pais Rep. Dom. las ofertas de empleo actualmente son para trabajar con Angular e IonicFramework, asi que tuve que conocer esa tecnologia para poder estar en el mercado laboral.

    Cual pregunta no vacilen en contactarme. Abajo les dejo el enlace a la app:

    https://play.google.com/store/apps/details?id=com.vocappbulario.app


Viendo 15 respuestas - de la 1 a 15 (de 17 en total)

You must be logged in to reply to this topic.