6

我目前正在开发一个聊天 iPhone 应用程序,到目前为止非常适合 ejabberd 服务器的常规配置。我想在用户“离线”时实现推送通知,为此我只需要运行一个 PHP 脚本,该脚本获取一个令牌设备和通过 SSL 将文本消息传递到 Apple 的服务器(Apple 部分已完成),我的问题开始是我不知道如何对我的 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.

错误

=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","userb@198.165.211.1"}],
                                       [{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","userB@198.165.211.1"}],
                       [{xmlelement,"body",[],[{xmlcdata,<<"Hello">>}]}]}]}
4

4 回答 4

4

stacktrace 说的是,没有 接受三个参数(两个 JID 和数据包本身)的send_notice函数。您的函数的签名不匹配,因为它只需要 1 个参数。mod_offline_push

钩子需要三个参数的回调,所以试试

send_notice(_From, _To, Packet).
于 2010-10-15T20:54:22.700 回答
2

请使用下面的博客,非常有用。他们的代码对我来说很好。

http://symmetricinfinity.com/2013/01/23/ios-push-notifications-from-ejabberd.html

于 2013-05-23T10:04:33.020 回答
1

确保删除源文件中的 INFO_MSG 行。之后重新编译并替换 ejabberd 文件夹中的梁文件。不要忘记重新启动 ejabberd。

于 2014-10-13T05:53:19.023 回答
0

我使用了 mod_interact,它在离线时调用 api。我已经设置了 api 来发送推送通知。

于 2014-07-30T18:01:41.460 回答