2010-08-30 3 views
6

В настоящее время я разрабатываю приложение для iPhone чата и настолько хорошо для обычной конфигурации для сервера ejabberd. Я хочу реализовать Push-уведомление, когда пользователь «отключен», и для этого мне просто нужно запустить PHP-скрипт, который получает устройство Token и текстовое сообщение для доставки через SSL на серверы Apple (часть Apple завершена), мой проблема заключается в том, что я не знаю, как реализовать это действие на моем сервере ejabberd? в основном мне просто нужно создать действие в полученном автономном сообщении i это возможно. Может кто-то указать мне в правильном направлении. Мне удалось начать писать код для нового модуля, но я получаю такую ​​же ошибку все время, когда этот модуль вызывается автономными сообщениями, вот код и ошибка.ejabberd mod_offline iphone push push

module.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","[email protected]"}], 
             [{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","[email protected]"}], 
         [{xmlelement,"body",[],[{xmlcdata,<<"Hello">>}]}]}]} 
+1

Вы решили это? Я работаю над тем же. –

ответ

4

что говорит StackTrace, что нет send_notice функции в mod_offline_push, которая принимает три параметров (два JIDs онов и самого пакета). Подпись вашей функции не соответствует, так как она ожидает только 1 аргумент.

Крюк ожидает три-аргумента функции обратного вызова, так что попробуйте с

send_notice(_From, _To, Packet). 
0

Ive используется mod_interact, который в автономном режиме вызывает АНИ. Я установил api для отправки push-уведомления.

1

Убедитесь, что вы удаляете строки INFO_MSG в исходных файлах. После этого перекомпилируйте и замените файлы луча в папке ejabberd. Не забудьте перезапустить ejabberd.

+0

Это сработало для меня –