2010-08-30 128 views
6

我目前正在開發一個聊天iPhone應用程序,並且對於ejabberd服務器的常規配置非常有用。我想在用戶「離線」時執行推送通知,並執行此操作我只需運行一個PHP腳本,該腳本獲取令牌設備,並通過SSL將文本消息傳遞給Apple服務器(Apple部分完成),我的問題開始是我不知道如何執行這個動作到我的ejabberd服務器?基本上我只需要在收到的離線消息上創建一個動作,我可能。有人能指引我走向正確的方向嗎?我已經開始爲一個新模塊編寫一些代碼,但是當離線消息調用此模塊時,我始終得到相同的錯誤,這裏是代碼和錯誤。ejabberd mod_offline iphone推送通知

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

你解決了這個問題嗎?我正在做同樣的事情。 – 2013-03-05 06:56:12

回答

4

什麼堆棧跟蹤說,是有在mod_offline_push沒有send_notice函數接受參數(這兩個JID的兒女,包本身)。你的函數的簽名不匹配,因爲它只有1個參數。

掛鉤期待三個參數的回調,所以儘量用

send_notice(_From, _To, Packet). 
0

伊夫使用mod_interact其下線時調用的API。我已經設置了api來發送推送通知。

1

確保您刪除源文件中的INFO_MSG行。然後重新編譯並替換ejabberd文件夾中的光束文件。不要忘記重新啓動ejabberd。

+0

它爲我工作 – 2015-12-20 15:51:55