Меня это тоже интересует, это другой подход, к сожалению, со своими собственными недостатками.
messages.each do |message|
begin
// Write message to APNS
ssl.write(message.to_apn)
rescue
// Write failed (disconnected), read response
response = ssl.read(6)
// Unpack the binary response and print it out
command, errorCode, identifier = response.unpack('CCN');
puts "Command: #{command} Code: #{errorCode} Identifier: #{identifier}"
// Before reconnecting, the problem (assuming incorrect token) must be solved
break
end
end
Кажется, это работает, и, поскольку у меня постоянное соединение, я могу без проблемЗаново подключитесь в коде rescue
и начните заново.
Однако есть некоторые проблемы.Основная проблема, которую я ищу, - это разъединения, вызванные отправкой неверных токенов устройства (например, из сборок разработчика).Если у меня есть 100 токенов устройств, на которые я отправляю сообщение, и где-то посередине есть неверный токен, мой код позволяет мне узнать, какой это был (при условии, что я предоставил хорошие идентификаторы).Затем я могу удалить неисправный токен и отправить сообщение всем устройствам, которые появились после неисправного (поскольку сообщение не было отправлено им).Но если неправильный токен находится где-то в конце 100, rescue
не произойдет, пока я не отправлю сообщения в следующий раз.
Проблема заключается в том, что код на самом деле не является реальнымвремя.Если бы я отправил, скажем, 10 сообщений на 10 неправильных токенов с этим кодом, все было бы просто замечательно, цикл прошел бы, и о проблемах не сообщалось.Кажется, что write()
не ждет, пока все прояснится, и цикл проходит до того, как соединение будет разорвано.В следующий раз, когда цикл будет запущен, команда write()
завершится неудачно (так как мы фактически были отключены с прошлого раза), и мы получим ошибку.
Если есть альтернативный способ ответить насбой соединения, это может решить проблему.