2010-08-30 7 views
6

Je suis actuellement en train de développer une application de chat iPhone et jusqu'ici tout va bien pour la configuration régulière du serveur ejabberd. Je veux implémenter la notification Push quand l'utilisateur est "hors ligne" et pour cela je dois juste lancer un script PHP qui reçoit un périphérique Token et le message texte à délivrer via SSL aux serveurs d'Apple (la partie Apple est terminée), mon le problème commence est que je n'ai aucune idée comment mettre en œuvre cette action sur mon serveur ejabberd? Fondamentalement, j'ai juste besoin de créer une action sur un message hors ligne reçu ce possible. Quelqu'un peut me diriger dans la bonne direction. J'ai réussi à écrire du code pour un nouveau module mais je reçois la même erreur tout le temps quand ce module est appelé par les messages hors ligne voici le code et l'erreur.ejabberd mod_offline iphone notifications 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. 

erreur

=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

Avez-vous trouvé la solution? Je travaille sur la même chose. –

Répondre

4

ce que dit le stacktrace, est qu'il n'y a pas de fonction send_notice dans le mod_offline_push qui accepte trois paramètres (les deux Ones JID et le paquet lui-même). La signature de votre fonction ne correspond pas, car elle n'attend qu'un seul argument.

Le crochet attend callbacks trois arguments, alors essayez avec

send_notice(_From, _To, Packet). 
0

Ive utilisé mod_interact qui appelle un mode hors connexion api. J'ai configuré l'API pour envoyer une notification push.

1

Assurez-vous de supprimer les lignes INFO_MSG dans les fichiers sources. Après cela, recompilez et remplacez les fichiers de poutres dans le dossier ejabberd. N'oubliez pas de redémarrer ejabberd.

+0

Ça a marché pour moi –

Questions connexes