2010-08-30 21 views
6

Actualmente estoy desarrollando una aplicación para chat de iPhone y hasta ahora estoy muy bien para la configuración regular del servidor ejabberd. Quiero implementar la notificación Push cuando el usuario está "fuera de línea" y para hacerlo solo necesito ejecutar un script PHP que obtenga un dispositivo Token y el mensaje de texto para entregarlo a través de SSL a los servidores de Apple (la parte de Apple está lista), mi El problema comienza es que no tengo idea de cómo implementar esta acción en mi servidor ejabberd. Básicamente, solo necesito crear una acción en un mensaje fuera de línea recibido, esto es posible. Alguien me puede apuntar en la dirección correcta. Me las arreglé para comenzar a escribir un código para un nuevo módulo, pero recibo el mismo error todo el tiempo cuando los mensajes fuera de línea llaman a este módulo, aquí está el código y el error.ejabberd mod_offline iphone notificaciones push

module.erl

-module(mod_offline_push). 
-behaviour(gen_mod). 
-include("ejabberd.hrl"). 

-export([start/2, stop/1, send_notice/1]). 

start(VHost,_Opts) -> 
?INFO_MSG("Starting mod_offline_push Host: ~p", [VHost]), 
inets:start(), 
    ssl:start(), 
ejabberd_hooks:add(offline_message_hook, VHost, ?MODULE,send_notice, 50), 
ok. 


stop(VHost) -> 
    ?INFO_MSG("mod_offline_push stopping Host: ~p", [VHost]), 
    ejabberd_hooks:delete(offline_message_hook, VHost, ?MODULE, send_notice, 50), 
    ok. 

send_notice(Packet) -> 
?INFO_MSG("after http:",[]), 
Type = xml:get_tag_attr_s("type", Packet), 
FromS = xml:get_tag_attr_s("from", Packet), 
ToS = xml:get_tag_attr_s("to", Packet), 
Body = xml:get_path_s(Packet, [{elem, "body"}, cdata]), 
if 
(Type == "chat") and (Body /= "") -> 
Sep = "&", 
Post = [ 
"application=",ToS, Sep, 
"event=", FromS,Type, Sep, 
"description=", Body, Sep, 
"priority=-1" ], 
httpc:request(post, {"http://pushNotification/push", [], "application/x-www-form-urlencoded", list_to_binary(Post)},[],[]), 
    ok; 
true -> 
    ok 
    end. 

ERROR

=ERROR REPORT==== 2010-08-26 16:53:19 === 
E(<0.370.0>:ejabberd_hooks:190) : {undef, 
            [{mod_offline_push,send_notice, 
            [{jid,"userA","198.165.211.1", 
             "2121731711282852044419503", 
             "userA","198.165.211.206", 
             "2121731711282852044419503"}, 
             {jid,"userB","198.165.211.1", 
             [],"userB","198.165.211.1",[]}, 
             {xmlelement,"message", 
             [{"type","chat"}, 
             {"to","[email protected]"}], 
             [{xmlelement,"body",[], 
             [{xmlcdata,<<"Hello">>}]}]}]}, 
            {ejabberd_hooks,run1,3}, 
            {ejabberd_sm,route,3}, 
            {ejabberd_local,route,3}, 
            {ejabberd_router,route,3}, 
            {ejabberd_c2s,session_established,2}, 
            {p1_fsm,handle_msg,10}, 
            {proc_lib,init_p,5}]} 
running hook: {offline_message_hook, 
        [{jid,"userA","198.165.211.1", 
         "2121731711282852044419503","userA", 
         "userA","2121731711282852044419503"}, 
        {jid,"userB","198.165.211.1",[],"userB", 
         "198.165.211.1",[]}, 
        {xmlelement,"message", 
         [{"type","chat"},{"to","[email protected]"}], 
         [{xmlelement,"body",[],[{xmlcdata,<<"Hello">>}]}]}]} 
+1

¿Has resuelto esto? Estoy trabajando en lo mismo. –

Respuesta

4

lo que dice el StackTrace, es que no hay ninguna función en el send_noticemod_offline_push que acepte tres parámetros (los dos JID y la paquete en sí). La firma de su función no coincide, ya que solo espera 1 argumento.

El gancho está a la espera devoluciones de llamada de tres argumentos, a fin de tratar con

send_notice(_From, _To, Packet). 
0

he utilizado mod_interact que cuando está desconectado llama a una API. Configuré la API para enviar una notificación de inserción.

1

Asegúrese de eliminar las líneas INFO_MSG en los archivos de origen. Después de eso recompile y reemplace los archivos de haz en la carpeta ejabberd. No olvide reiniciar ejabberd.

+0

Me funcionó –

Cuestiones relacionadas