ejabberd mod_脱机iphone推送通知

ejabberd mod_脱机iphone推送通知,iphone,module,xmpp,push-notification,ejabberd,Iphone,Module,Xmpp,Push Notification,Ejabberd,我目前正在开发一款iPhone聊天应用程序,目前为止,它非常适合ejabberd服务器的常规配置。我想在用户“离线”时实现推送通知,要做到这一点,我只需要运行一个PHP脚本,通过SSL将令牌设备和文本消息传递到苹果的服务器(苹果部分完成),我的问题是我不知道如何在我的ejabberd服务器上实现此操作?基本上,我只需要在收到的脱机消息上创建一个操作就可以了。有人能给我指一下正确的方向吗。我已经开始为一个新模块编写一些代码,但是当这个模块被离线消息调用时,我总是遇到相同的错误。下面是代码和错误 模

我目前正在开发一款iPhone聊天应用程序,目前为止,它非常适合ejabberd服务器的常规配置。我想在用户“离线”时实现推送通知,要做到这一点,我只需要运行一个PHP脚本,通过SSL将令牌设备和文本消息传递到苹果的服务器(苹果部分完成),我的问题是我不知道如何在我的ejabberd服务器上实现此操作?基本上,我只需要在收到的脱机消息上创建一个操作就可以了。有人能给我指一下正确的方向吗。我已经开始为一个新模块编写一些代码,但是当这个模块被离线消息调用时,我总是遇到相同的错误。下面是代码和错误

模块.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.
错误

错误报告2010-08-26 16:53:19=== E(:ejabberd_hooks:190):{undef, [{mod_offline_push,发送通知, [{jid,“userA”,“198.165.211.1”, "2121731711282852044419503", “userA”,“198.165.211.206”, "2121731711282852044419503"}, {jid,“userB”,“198.165.211.1”, [],“用户B”,“198.165.211.1”,“[], {xmlelement,“消息”, [{“类型”,“聊天”}, {“到”userb@198.165.211.1"}], [{xmlement,“body”,[], [{xmlcata,}]}]}, {ejabberd_hooks,run1,3}, {ejabberd_sm,路线,3}, {ejabberd_当地,路线,3}, {ejabberd_路由器,路由,3}, {ejabberd_c2s,已建立会话,2}, {p1_fsm,handle_msg,10}, {proc_lib,init_p,5}]} 运行钩子:{offline_message_钩子, [{jid,“userA”,“198.165.211.1”, “212171711282852044419503”,“用户A”, “userA”、“212171711282852044419503”}, {jid,“userB”,“198.165.211.1”,“[],“userB”, "198.165.211.1",[]}, {xmlelement,“消息”, [{“type”,“chat”},{“to”,“userB@198.165.211.1"}], [{xmlelement,“body”,[],[{xmlcdata,}]}]}
stacktrace说的是,
mod\u offline\u push
中没有接受三个参数(两个JIDs参数和数据包本身)的
send\u notice
功能。函数的签名不匹配,因为它只需要1个参数

钩子需要三个参数回调,请尝试

send_notice(_From, _To, Packet).

请使用下面的博客,内容丰富。他们的代码对我来说很好


我使用mod_interact,离线时调用api。我已设置api以发送推送通知。

确保删除源文件中的信息行。然后重新编译并替换ejabberd文件夹中的beam文件。别忘了重新启动ejabberd。

您解决了这个问题吗?我也在做同样的事情。
send_notice(_From, _To, Packet).