Ejabberd- 推送通知 APNS 和 GCM mod_offline_push
Ejabberd- Push notifications APNS and GCM with mod_offline_push
我正在尝试使用 ejabberd 获取推送通知,我在这里找到了这个 link:https://github.com/diamondbybold/ejabberd_mod_offline_post 它应该在 URL 发出 POST 请求用于离线消息。我编辑了我的 ejabberd.yml 文件以包含 URL 和令牌,但是,我 运行 在 Ejabberd 16.12 上尝试 运行 它时遇到了一些问题。它
运行s,但我向离线的人发送消息,我在 /var/log/ejabberd/error.log
中看到以下错误
2017-02-07 09:12:19.359 [error] <0.1045.0>@ejabberd_hooks:run1:332
{function_clause,[{fxml,get_tag_attr_s,[<<"type">>,{message,
<<"purple130d74a2">>,chat,<<>>,undefined,{jid,<<"test2">>,<<"localhost">>,
<<"Smack">>,<<"test2">>,<<"localhost">>,<<"Smack">>},[],[{text,<<>>,
<<"abc">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}],[{file,"src/fxml.erl"},
{line,166}]},{mod_offline_post,offline_message,3,
[{file,"src/mod_offline_post.erl"},{line,86}]},{ejabberd_hooks,safe_apply,3,
[{file,"src/ejabberd_hooks.erl"},{line,382}]},{ejabberd_hooks,run1,3,
[{file,"src/ejabberd_hooks.erl"},{line,329}]},{ejabberd_sm,route,3,
[{file,"src/ejabberd_sm.erl"},{line,126}]},{ejabberd_local,route,3,
[{file,"src/ejabberd_local.erl"},{line,110}]},{ejabberd_router,route,3,
[{file,"src/ejabberd_router.erl"},{line,78}]},{ejabberd_c2s,check_privacy_route,5,
[{file,"src/ejabberd_c2s.erl"},{line,1886}]}]}
在mod_offline_post.erl里面,我有这个函数:
offline_message(From, To, Packet) ->
Type = fxml:get_tag_attr_s(<<"type">>, Packet),
Body = fxml:get_path_s(Packet, [{elem, list_to_binary("body")}, cdata]),
Token = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, auth_token, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
PostUrl = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, post_url, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
if
(Type == <<"chat">>) and (Body /= <<"">>) ->
Sep = "&",
Post = [
"type=chat", Sep,
"to=", To#jid.luser, Sep,
"from=", From#jid.luser, Sep,
"body=", binary_to_list(Body), Sep,
"access_token=", Token
],
?INFO_MSG("Sending post request to ~s with body \"~s\"", [PostUrl, Post]),
httpc:request(post, {binary_to_list(PostUrl), [], "application/x-www-form-urlencoded", list_to_binary(Post)},[],[]),
ok;
true ->
ok
end.
似乎人们可以通过在更高版本中将 xml 更改为 fxml 来解决他们的问题,但它看起来对我的情况没有影响。
如果有人对我如何解决这个问题有任何想法,或者对实现推送通知的不同方式有任何建议,请告诉我。谢谢
从 16.12 开始,Packet
现在是一条 #message{}
记录,因此您应该使用 xmpp 库来处理它。
以下是您应该如何重写代码:
...
-include("xmpp.hrl").
...
offline_message(From, To, #message{type = Type, body = Body}) ->
BodyTxt = xmpp:get_text(Body),
...
if (Type == chat) and (BodyTxt /= <<"">>) ->
...
有关详细信息,请参阅 xmpp.erl
和 xmpp_codec.hrl
。
我正在尝试使用 ejabberd 获取推送通知,我在这里找到了这个 link:https://github.com/diamondbybold/ejabberd_mod_offline_post 它应该在 URL 发出 POST 请求用于离线消息。我编辑了我的 ejabberd.yml 文件以包含 URL 和令牌,但是,我 运行 在 Ejabberd 16.12 上尝试 运行 它时遇到了一些问题。它 运行s,但我向离线的人发送消息,我在 /var/log/ejabberd/error.log
中看到以下错误2017-02-07 09:12:19.359 [error] <0.1045.0>@ejabberd_hooks:run1:332
{function_clause,[{fxml,get_tag_attr_s,[<<"type">>,{message,
<<"purple130d74a2">>,chat,<<>>,undefined,{jid,<<"test2">>,<<"localhost">>,
<<"Smack">>,<<"test2">>,<<"localhost">>,<<"Smack">>},[],[{text,<<>>,
<<"abc">>}],undefined,[{xmlel,<<"active">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>}],[]}],#{}}],[{file,"src/fxml.erl"},
{line,166}]},{mod_offline_post,offline_message,3,
[{file,"src/mod_offline_post.erl"},{line,86}]},{ejabberd_hooks,safe_apply,3,
[{file,"src/ejabberd_hooks.erl"},{line,382}]},{ejabberd_hooks,run1,3,
[{file,"src/ejabberd_hooks.erl"},{line,329}]},{ejabberd_sm,route,3,
[{file,"src/ejabberd_sm.erl"},{line,126}]},{ejabberd_local,route,3,
[{file,"src/ejabberd_local.erl"},{line,110}]},{ejabberd_router,route,3,
[{file,"src/ejabberd_router.erl"},{line,78}]},{ejabberd_c2s,check_privacy_route,5,
[{file,"src/ejabberd_c2s.erl"},{line,1886}]}]}
在mod_offline_post.erl里面,我有这个函数:
offline_message(From, To, Packet) ->
Type = fxml:get_tag_attr_s(<<"type">>, Packet),
Body = fxml:get_path_s(Packet, [{elem, list_to_binary("body")}, cdata]),
Token = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, auth_token, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
PostUrl = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, post_url, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
if
(Type == <<"chat">>) and (Body /= <<"">>) ->
Sep = "&",
Post = [
"type=chat", Sep,
"to=", To#jid.luser, Sep,
"from=", From#jid.luser, Sep,
"body=", binary_to_list(Body), Sep,
"access_token=", Token
],
?INFO_MSG("Sending post request to ~s with body \"~s\"", [PostUrl, Post]),
httpc:request(post, {binary_to_list(PostUrl), [], "application/x-www-form-urlencoded", list_to_binary(Post)},[],[]),
ok;
true ->
ok
end.
似乎人们可以通过在更高版本中将 xml 更改为 fxml 来解决他们的问题,但它看起来对我的情况没有影响。
如果有人对我如何解决这个问题有任何想法,或者对实现推送通知的不同方式有任何建议,请告诉我。谢谢
从 16.12 开始,Packet
现在是一条 #message{}
记录,因此您应该使用 xmpp 库来处理它。
以下是您应该如何重写代码:
...
-include("xmpp.hrl").
...
offline_message(From, To, #message{type = Type, body = Body}) ->
BodyTxt = xmpp:get_text(Body),
...
if (Type == chat) and (BodyTxt /= <<"">>) ->
...
有关详细信息,请参阅 xmpp.erl
和 xmpp_codec.hrl
。