2017-02-07 15 views
0

Я пытаюсь получить push-уведомления, работающие с ejabberd, и я нашел эту ссылку здесь: https://github.com/diamondbybold/ejabberd_mod_offline_post, где он должен сделать запрос POST по URL-адресу для автономных сообщений. Я редактировал файл ejabberd.yml, чтобы включить URL-адрес и токен, однако я сталкиваюсь с некоторыми проблемами при попытке запустить его на Ejabberd 16.12. Это работает, но я отправить сообщение кому-то в автономном режиме, я вижу следующее сообщение об ошибке в /var/log/ejabberd/error.logEjabberd- Push-уведомления APNS и GCM с mod_offline_push

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 в более поздней версии, но это не выглядело так, как будто это имело значение в моем случае.

Если у кого-то есть идея, как я могу решить это или любые предложения по другому способу получения push-уведомлений, пожалуйста, дайте мне знать. Спасибо

ответ

1

С 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 /= <<"">>) -> 
    ... 

Consult xmpp.erl и xmpp_codec.hrl для деталей.