iphone - ejabberd mod_offline iPhone推送通知

标签 iphone module xmpp push-notification ejabberd

我目前正在开发一个聊天 iPhone 应用程序,到目前为止,对于 ejabberd 服务器的常规配置来说效果很好。我想在用户“离线”时实现推送通知,为此我只需要运行一个 PHP 脚本,该脚本获取 token 设备和文本消息以通过 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">>}]}]}]}

最佳答案

堆栈跟踪显示,mod_offline_push 中没有 send_notice 函数接受三个参数(两个 JID 和数据包本身)。您的函数的签名不匹配,因为它只需要 1 个参数。

该钩子(Hook)需要三参数回调,所以尝试使用

send_notice(_From, _To, Packet).

关于iphone - ejabberd mod_offline iPhone推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601841/

相关文章:

iphone - 如何从 URL 中捕获所需的值

c - 模块化C代码有哪些方法?

xmpp 组件 : only send message if jid is online

javascript - 在xmpp多聊天中,管理员角色仅授予在线用户已创建房间的成员资格?

iphone - SVProgressHud 几秒后消失

iphone - 为什么在 iPhone UIWebView 中滚动时计时器会停止?

eclipse - 生命周期异常

php - symfony 生成模块,显示 fatal error

php - 如何保护密码不被客户端读取?

iphone - 将选项添加到 Settings.bundle 中的 PSMultiValueSpecifier