gpt4 book ai didi

ssl - Erlang + Apple 推送通知 [ token 无效问题]

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:06 29 4
gpt4 key购买 nike

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

当 token 有效时,一切正常...问题是旧设备 token (现在无效)被拒绝。我知道无效的 token 将被带有 6 字节套接字消息的 apns 拒绝,并使连接无效(我认为这真的很愚蠢,无论如何......)

问题是我似乎没有收到 APNS 应该给我的模块的 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.

因此,当我启动模块并推送到一个有效 token 时,手机会收到推送,但是当我推送到一个无效 token ,然后再推送到一个有效 token 时,有效 token 将不会收到任何推...

我知道我应该听取反馈服务以便从我的数据库中删除设备 token ,但我还需要知道推送网关是否使我的连接无效以便重新连接。

所以这是真正的问题:为什么我的 gen-server 没有收到错误响应数据包(应该匹配 handle_info({ssl, Socket, Data}, P) )?

最佳答案

您的套接字配置为 active=false。除非您将其设置为 active=true(或重复 active=once),否则您不会收到任何消息。请参阅 inet:setopts/2 的文档.

您也不应该将 controlling_process 设置为 self()。

关于ssl - Erlang + Apple 推送通知 [ token 无效问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806462/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com