2010-08-30 12 views
6

Ich entwickle derzeit eine Chat-iPhone-App und so weit so gut für die regelmäßige Konfiguration für den Ejabberd-Server. Ich möchte eine Push-Benachrichtigung implementieren, wenn der Benutzer "offline" ist, und dazu muss ich nur ein PHP-Skript ausführen, das ein Token-Gerät und die Textnachricht über SSL an Apple-Server liefert (der Apple-Teil ist fertig), mein Problem beginnt damit, dass ich keine Ahnung habe, wie ich diese Aktion auf meinen Ejabberd-Server umsetze? Im Grunde muss ich nur eine Aktion auf eine empfangene Offline-Nachricht erstellen, wenn dies möglich ist. Kann mir jemand in die richtige Richtung zeigen? Ich habe es geschafft, Code für ein neues Modul zu schreiben, aber ich bekomme den gleichen Fehler die ganze Zeit, wenn dieses Modul von den Offline-Nachrichten aufgerufen wird, hier ist der Code und der Fehler.ejabberd mod_offline iphone Pushed Benachrichtigungen

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

Haben Sie das gelöst? Ich arbeite an der gleichen Sache. –

Antwort

4

was die stacktrace sagt, ist, dass es keine send_notice Funktion im mod_offline_push die drei Parameter (die beiden JIDs Einsen und die akzeptiert Paket selbst). Die Signatur Ihrer Funktion stimmt nicht überein, da nur 1 Argument erwartet wird.

Der Haken mit drei Argumenten Rückrufe erwartet, so versuchen Sie mit

send_notice(_From, _To, Packet). 
0

Ive verwendet mod_interact die, wenn sie offline api aufruft. Ich habe die API eingerichtet, um eine Push-Benachrichtigung zu senden.

1

Stellen Sie sicher, dass Sie die Zeilen INFO_MSG in den Quelldateien entfernen. Nach dem Neukompilieren und Ersetzen der Strahldateien im Ordner ejabberd.Vergessen Sie nicht, ejabberd neu zu starten.

+0

Es hat für mich funktioniert –