Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl Erlang+;Apple推送通知[使用无效令牌发出]_Ssl_Erlang_Push Notification_Apple Push Notifications_Gen Server - Fatal编程技术网

Ssl Erlang+;Apple推送通知[使用无效令牌发出]

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

我目前正在尝试为Erlang创建推送通知模块

当代币有效时,一切正常。。。 问题是旧设备令牌(目前无效)被拒绝。 我知道无效的令牌将被APN以6字节的套接字消息拒绝,并使连接无效(我认为这真是愚蠢的,无论如何…)

问题是,我似乎没有得到APN在我的模块中应该给我的6字节套接字消息,就像控制进程没有监听套接字一样

这是我的密码:

-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之后重新传输挂起的通知。