Уведомление Erlang Apple Push не получает ответ-ошибку перед отключением

В настоящее время я немного тестирую свой модуль push-уведомлений. Когда токен устройства недействителен, он отключается...

Согласно документации Apple для разработчиков push-уведомлений Я должен получить пакет ответа об ошибке непосредственно перед отключением push-сервера Apple...

Дело в том, что я отключаюсь, но я ничего не получаю в сокете непосредственно перед этим, и мне нужно знать, не удалось ли выполнить отправку из-за неправильно сформированной отправки (чтобы я мог исправить ошибку) или из-за недопустимого токена устройства (так что Я могу удалить его из базы данных).

Вот мой код:

-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, state, cert, key}).

start(Provisioning) ->
    gen_server:start_link(?MODULE, [Provisioning], []).

init([Provisioning]) ->
    gen_server:cast(self(), {connect, Provisioning}),
    {ok, #push{}}.

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, true}],
    Timeout = 1000,
    {ok, Socket} = ssl:connect(Address, Port, Options, Timeout),
    {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.

Это прекрасно работает, когда полезная нагрузка и deviceToken верны. если deviceToken недействителен, он только отключается.

Кто-нибудь может определить проблему? потому что после 4-х часов поисков я только что узнал, что я явно не могу!

Вот таблица ответов на ошибки:

Status code     Description
0           No errors encountered
1           Processing error
2           Missing device token
3           Missing topic
4           Missing payload
5           Invalid token size
6           Invalid topic size
7           Invalid payload size
8           Invalid token
255         None (unknown)

person TheSquad    schedule 19.05.2012    source источник
comment
Видите ли вы такое поведение для песочницы и/или производственных шлюзов?   -  person johlo    schedule 20.05.2012
comment
Что делать, если соединение ssl потеряно?   -  person why    schedule 16.07.2013
comment
@почему вы просто переподключаетесь, когда закрыты... Я предлагаю иметь пул подключений к push-серверу, если один из них не работает, всегда есть другой, пока вы переподключаетесь   -  person TheSquad    schedule 16.07.2013


Ответы (1)


Похоже, вы используете простой формат уведомлений, как показано на рисунке 5-1 в документации Apple, на которую вы ссылались (судя по вашей функции send()). Когда используется этот формат, ответ об ошибке не предоставляется, когда запрос искажен - вы просто получаете разъединение.

Чтобы получить ответ об ошибке, вы должны использовать расширенный формат уведомления, показанный на рис. 5-2.

person johlo    schedule 21.05.2012