Присутствие канала в Google App Engine не запускается для повторно использованного токена канала
У меня есть приложение, которое поддерживает двустороннее соединение между "главным" устройством и несколькими "удаленными устройствами" с помощью API канала Google App Engine. Чтобы сохранить потребление данных, "мастер" отправляет свои данные только на удаленные устройства, которые были отмечены в объекте хранилища данных. Это выглядит так:
{ "Ag5zfnBhbmRvcmEtaG9tZXIVCxINU29ja2V0U2Vzc2lvbhjZswEMremote1": "AHRlWrqfFk1Od_9FMObXMnbQRV0NPlAD41aRaYCZ8-dzpAV4aZI-6XjGqhlRBbGL8P4slwTUTw4mI2Mb8VgqWSnMbNyO7ewRHCwVnqCvY9vA-XS4vyESFlNS3nRbdeEjuCXEXMSMxiguixfjPDF5fiseQkXm2SOp2c0YD6onfM7PpN6gGDicH5A", "ag5zfnBhbmRvcmEtaG9tZXIVCxINU29ja2V0U2Vzc2lvbhjZswEMremote0": "AHRlWrr5tXCamZ5fN4z8LUM1Wj_60GFNYS7kOEokAM_QeAAL7nlYo5EDuYeEpz_kepwK-k1kQ543jDeTLmUXws9n_3L-ty1rsYUN3SIILfaf4_4UXDVujj6tWed2nmXvbZ8ScX7dOilJBjc_xdvIu6NRDhqe-Pt1oinRXcsAc_NpDFQEOs_5bH8"}
Это просто ключ, который сопоставляет ключи канала токенам. Затем объект также может определить, какие удаленные устройства находятся в сети, а какие можно использовать повторно и когда они истекают. Они добавляются с помощью входящего обработчика присутствия в канале и удаляются из объекта его обработчиком отключения. Однако, поскольку эти устройства могут отключаться в любое время, нецелесообразно воссоздавать токен канала для каждого пульта дистанционного управления. Таким образом, при подключении к серверу сервер проверяет, не используются ли какие-либо старые токены, срок действия которых не истек, и инструктирует удаленное устройство использовать его, возвращая старый токен канала через поиск ключа в токене в объекте хранилища данных.
В то время как канал получает данные, как он должен, присутствие канала не получает запрос, что это связано. Что еще более интересно, он никогда не получает пинг, когда пульт дистанционного управления также отключен, что, скорее всего, связано с проблемой unbeforeload в Safari для iPhone (удаленная платформа). Однако в dev-сервере все работает отлично. Является ли это ошибкой или возможно, что повторное использование токенов не является надежным.
ПРИМЕЧАНИЕ Хотя я мог бы просто обновить хранилище данных о наличии новых пультов после определения, должен ли пульт использовать старый или новый токен, я бы предпочел использовать присутствие канала в качестве более чистого метода для проверки того, что сокет действительно соединялся с клиент.
РЕДАКТИРОВАТЬ Кроме того, я обнаружил, что если удаленный токен был неактивен в течение 4-8 минут, прежде чем другой удаленный пытается его использовать, это явление не происходит.
EDIT2 Кроме того, я заметил, что при использовании iPhone канал почти всегда запускает свой обработчик ошибки через несколько минут после надежного соединения, независимо от использования нового или старого токена. Однако на ноутбуке этого не происходит.