Ssl Erlang+;Apple推送通知[使用无效令牌发出]
我目前正在尝试为Erlang创建推送通知模块 当代币有效时,一切正常。。。 问题是旧设备令牌(目前无效)被拒绝。 我知道无效的令牌将被APN以6字节的套接字消息拒绝,并使连接无效(我认为这真是愚蠢的,无论如何…) 问题是,我似乎没有得到APN在我的模块中应该给我的6字节套接字消息,就像控制进程没有监听套接字一样 这是我的密码:Ssl Erlang+;Apple推送通知[使用无效令牌发出],ssl,erlang,push-notification,apple-push-notifications,gen-server,Ssl,Erlang,Push Notification,Apple Push Notifications,Gen Server,我目前正在尝试为Erlang创建推送通知模块 当代币有效时,一切正常。。。 问题是旧设备令牌(目前无效)被拒绝。 我知道无效的令牌将被APN以6字节的套接字消息拒绝,并使连接无效(我认为这真是愚蠢的,无论如何…) 问题是,我似乎没有得到APN在我的模块中应该给我的6字节套接字消息,就像控制进程没有监听套接字一样 这是我的密码: -module(pushiphone). -behaviour(gen_server). -export([start/1, init/1, handle_call/3
-module(pushiphone).
-behaviour(gen_server).
-export([start/1, init/1, handle_call/3, handle_cast/2, code_change/3, handle_info/2, terminate/2]).
-import(ssl, [connect/4]).
-record(push, {socket, pid, state, cert, key}).
start(Provisioning) ->
gen_server:start_link(?MODULE, [Provisioning], []).
init([Provisioning]) ->
gen_server:cast(self(), {connect, Provisioning}),
{ok, #push{pid=self()}}.
send(Socket, DT, Payload) ->
PayloadLen = length(Payload),
DTLen = size(DT),
PayloadBin = list_to_binary(Payload),
Packet = <<0:8,
DTLen:16/big,
DT/binary,
PayloadLen:16/big,
PayloadBin/binary>>,
ssl:send(Socket, Packet).
handle_call(_, _, P) ->
{noreply, P}.
handle_cast({connect, Provisioning}, P) ->
case Provisioning of
dev -> Address = "gateway.sandbox.push.apple.com";
prod -> Address = "gateway.push.apple.com"
end,
Port = 2195,
Cert="/apns-" ++ atom_to_list(Provisioning) ++ "-cert.pem",
Key="/apns-" ++ atom_to_list(Provisioning) ++ "-key.pem",
Options = [{certfile, Cert}, {keyfile, Key}, {password, "********"}, {mode, binary}, {active, false}],
Timeout = 1000,
{ok, Socket} = ssl:connect(Address, Port, Options, Timeout),
ssl:controlling_process(Socket, self()), %% Necessary ??
gproc:reg({n,l, pushiphone}),
{noreply, P#push{socket=Socket}};
handle_cast(_, P) ->
{noreply, P}.
handle_info({ssl, Socket, Data}, P) ->
<<Command, Status, SomeID:32/big>> = Data,
io:fwrite("[PUSH][ERROR]: ~p / ~p / ~p~n", [Command, Status, SomeID]),
ssl:close(Socket),
{noreply, P};
handle_info({push, message, DT, Badge, [Message]}, P) ->
Payload = "{\"aps\":{\"alert\":\"" ++ Message ++ "\",\"badge\":" ++ Badge ++ ",\"sound\":\"" ++ "msg.caf" ++ "\"}}",
send(P#push.socket, DT, Payload),
{noreply, P};
handle_info({ssl_closed, _SslSocket}, P) ->
io:fwrite("SSL CLOSED !!!!!!~n"),
{stop, normal, P};
handle_info(AnythingElse, P) ->
io:fwrite("[ERROR][PUSH][ANYTHING ELSE] : ~p~n", [AnythingElse]),
{noreply, P}.
code_change(_, P, _) ->
{ok, P}.
terminate(_, _) ->
ok.
-模块(推送iPhone)。
-行为(gen_服务器)。
-导出([start/1,init/1,handle\u call/3,handle\u cast/2,code\u change/3,handle\u info/2,terminate/2])。
-导入(ssl,[connect/4])。
-记录(推送,{socket,pid,state,cert,key})。
启动(资源调配)->
gen_服务器:启动链接(?模块,[设置],])。
初始化([Provisioning])->
gen_服务器:强制转换(self(),{connect,Provisioning}),
{好的,#推{pid=self()}。
发送(套接字、DT、有效负载)->
有效载荷len=长度(有效载荷),
DTLen=尺寸(DT),
PayloadBin=列表到二进制(有效载荷),
数据包=,
ssl:发送(套接字、数据包)。
处理呼叫(u,u,P)->
{noreply,P}。
handle_cast({connect,Provisioning},P)->
案例供应
dev->Address=“gateway.sandbox.push.apple.com”;
prod->Address=“gateway.push.apple.com”
完,,
端口=2195,
Cert=“/apns-”++atom\u to\u列表(配置)++“-Cert.pem”,
Key=“/apns-”++atom\u to_list(Provisioning)+“-Key.pem”,
选项=[{certfile,Cert},{keyfile,Key},{password,********},{mode,binary},{active,false}],
超时=1000,
{ok,Socket}=ssl:connect(地址、端口、选项、超时),
ssl:控制_进程(套接字,self()),%必要??
gproc:reg({n,l,pushiphone}),
{noreply,P#push{socket=socket};
句柄\u cast(\up)->
{noreply,P}。
handle_info({ssl,Socket,Data},P)->
=数据,
io:fwrite(“[PUSH][ERROR]:~p/~p/~p~n”,[Command,Status,SomeID]),
ssl:关闭(套接字),
{noreply,P};
句柄信息({push,message,DT,Badge,[message]},P)->
有效载荷=“{\'aps\':{\'alert\':\”++消息++“\”,\“徽章”:“++徽章++”,\“声音”:\“++”消息.caf“++”}”,
发送(P#推送插座、DT、有效载荷),
{noreply,P};
句柄信息({ssl\u closed,{SslSocket},P)->
io:fwrite(“SSL已关闭!!!!!!!~n”),
{停止,正常,P};
处理信息(任意内容,P)->
io:fwrite(“[ERROR][PUSH][AnythingElse]:~p~n,[AnythingElse]),
{noreply,P}。
代码更改(u,P,u)->
{好的,P}。
终止(,)->
好啊
因此,当我启动模块,并按下一个有效令牌时,手机会接收到推送,但当我按下一个无效令牌,然后按下一个有效令牌时,有效令牌不会接收任何推送
我知道我应该听取反馈服务,以便从我的数据库中删除设备令牌,但我还需要知道推送网关as是否使我的连接无效,以便重新连接
所以这里有一个真正的问题:为什么我的gen服务器没有收到错误响应包(它应该与句柄信息({ssl,Socket,Data},p))匹配?您的套接字配置为active=false。除非将其设置为active=true(或repeated active=one),否则不会收到任何消息。有关详细信息,请参阅文档
您也不必将控制进程设置为self()。您是对的,现在gen\u服务器调用ssl\u close句柄。。。奇怪的是,我没有收到错误响应数据包,不管怎样,我现在可以知道套接字何时断开,我所要求的一切;-)有效+1的精确答案。@该四边形看起来像是在使用传统的“简单通知格式”,不会返回错误,只是一个关闭的套接字。尝试使用现在的遗留“增强”格式(相当类似于简单格式)或当前的二进制格式。请记住在error-response-id之后重新传输挂起的通知。