Как подключить и отправить push-уведомление с помощью FCM на ejabberd?

#firebase-cloud-messaging #erlang #ejabberd

#firebase-облако-обмен сообщениями #эрланг #ejabberd #firebase-cloud-messaging #erlang

Вопрос:

Я пытаюсь отправить push-уведомление клиенту Android с помощью FCM. Я перешел по ссылке ниже:https://github.com/vkatsuba/epns но получаю следующую ошибку: ошибка исключения: неопределенная функция epns: push / 2 Вот мой код: «

 -behaviour(gen_mod).
-export([start/2, stop/1, mod_options/1, mod_doc/0, depends/2, create_message/1, post_offline_message/3]).
-include("/home/faiqkhan/ejabberd-20.07/lib/fast_xml-1.1.43/include/fxml.hrl").
-include("/home/faiqkhan/ejabberd-20.07/lib/ejabberd-20.07/include/logger.hrl").
-include("/home/faiqkhan/ejabberd-20.07/lib/ejabberd-20.07/include/translate.hrl").
start(_Host, _Opt) -> 
    ?INFO_MSG("mod_http_offline loading", []),
    ejabberd_hooks:add(offline_message_hook, _Host, ?MODULE, create_message, 0).
stop (_Host) -> 
    ?INFO_MSG("stopping mod_http_offline", []),
    ejabberd_hooks:delete(offline_message_hook, _Host, ?MODULE, create_message, 0).
create_message({_Action, Packet} = Acc) ->
    % ?INFO_MSG("Packet details: ~p", [Packet]),
    EncodedData = xmpp:encode(Packet),
    % ?INFO_MSG("Encoded Packet: ~p", [EncodedData]),
    {value, To} = fxml:get_tag_attr(<<"to">>, EncodedData),
    {value, From} = fxml:get_tag_attr(<<"from">>, EncodedData),
    Body = fxml:get_path_s(EncodedData, [{elem, <<"body">>}, cdata]),
    To_id = lists:nth(1,string:lexemes(To,"@")),
    From_id = lists:nth(1,string:lexemes(From,"@")),
    ?INFO_MSG("To id: ~p",[To_id]),
    ?INFO_MSG("From id: ~p",[From_id]),
    ?INFO_MSG("PacketsBody ~p",[Body]),
    post_offline_message(From_id, To_id, Body),
    Acc.
post_offline_message(From, To, Body) ->
    ?INFO_MSG("Posting From ~p To ~p Body ~p~n",[From, To, Body]),
    ?INFO_MSG("post request sent (not really yet)", []),
    FCMData = #{
      key => "fcm-key",
      url => "https://fcm.googleapis.com/fcm/send",
      playload => #{
        to => <<"rid">>,
        priority => <<"high">>,
           data => #{
             <<"title">> => <<"Some Title">>,
             <<"some_custom_field">> => true
            }
        }
    }, epns:push(fcm, FCMData).
  

Ответ №1:

ошибка исключения: неопределенная функция epns: push/2

Это означает, что Erlang не смог найти файл epns.beam с определенной функцией push/2 .

Из того, что я вижу, этот модуль определяет и экспортирует эту функцию правильно, https://github.com/vkatsuba/epns/blob/master/src/epns.erl

Так что, вероятно, проблема в том, что вы забыли какой-то шаг:

  1. скомпилируйте эту библиотеку epns с той же версией Erlang, что и вы запускаете ejabberd
  2. скопируйте файлы *.beam в путь, по которому erlang сможет их найти (например, скопируйте эти файлы со всеми другими файлами ejabberd *.beam)

Ответ №2:

Если вы попытаетесь добавить библиотеку epns в качестве зависимости в свой проект, вам также потребуется обновить rebar.config файл. Итак, вот шаг для проектов rebar3:

Шаг #1 - Отредактируйте файл rebar.config в вашем проекте:

 {deps, [
  {epns, "1.1.0"}
]}