2010-08-30 22 views
6

Şu anda bir sohbet uygulaması geliştiriyor ve şu ana kadar ejabberd sunucusu için düzenli yapılandırma için çok iyi. Kullanıcı "çevrimdışı" olduğunda Push bildirimi uygulamak istiyorum ve bunu yapmak için sadece bir Token cihazı ve Apple'ın sunucularına (Apple bölümü bitti) SSL üzerinden iletilecek metin mesajı alan bir PHP betiğini çalıştırmam gerekiyor. Sorun başlıyor, bu eylemi ejabberd sunucuma nasıl uygulayacağımı bilmiyorum. Temel olarak, sadece bir çevrimdışı mesaj üzerinde bir eylem oluşturmanız gerekiyor. Birisi bana doğru yönde işaret edebilir. Yeni bir modül için kod yazmayı başarabildim ama her zaman bu modülün çevrimdışı mesajlar tarafından kod ve hata olarak adlandırılmasıyla aynı hatayı alıyorum.ejabberd mod_offline iphone itilmiş bildirimler

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. 

HATA

StackTrace ne diyor
=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

Bunu çözdünüz mü? Aynı şey üzerinde çalışıyorum. –

cevap

4

, üç parametreleri (iki JIDs olanları ve kabul mod_offline_push hiçbir send_notice işlevi olmasıdır paketin kendisi). İşlevin imzası, yalnızca 1 argüman beklediğinden eşleşmiyor.

kanca üç argüman geri aramalar bekliyor, bu yüzden

send_notice(_From, _To, Packet). 
0

Ive çevrimdışı olarak API çağrıları mod_interact kullanılır. Push bildirimi göndermek için api'yi kurdum.

1

Kaynak dosyalarındaki INFO_MSG çizgilerini kaldırdığınızdan emin olun. Bundan sonra ejabberd klasöründeki ışın dosyalarını yeniden derleyin ve değiştirin. Ejabberd'yi yeniden başlatmayı unutmayın.

+0

Benim için çalıştı –