Что это? Еще одна публикация Windows Azure Mobile Services (WAMS) ?!
В следующей версии моего приложения я веду запись канала пользователя для отправки уведомлений. Пример встроенного списка задач делает это или что-то очень похожее. Моя таблица в WAMS выглядит так:
Не показаны пара полей, но особый интерес представляет идентификатор устройства. Я понял, что у одного пользователя может быть несколько устройств, поэтому канал привязывается к идентификатору устройства. Я до сих пор не нашел идеального способа сделать это — сейчас я использую случайный GUID при первом запуске.
В моем сценарии WAMS, если отправленная точка находится «в пределах досягаемости» другого пользователя, мы отправим уведомление вниз, чтобы обновить плитку. Я вхожу в эту часть в своем блоге: лучшие практики по отправке живых плиток . Но что делать, если срок действия канала истек? Это часто встречается в тестировании, потому что приложение удалялось / переустанавливалось много раз.
Я наткнулся на эту страницу, заголовки запросов и ответов службы push-уведомлений в MSDN. На этой странице много интересной информации. В то время как у меня должно быть более надежное решение для обработки всех этих условий, особенно меня интересует ответ Channel Expired, выделенный ниже:
Код ответа HTTP | Описание | Рекомендованное действие |
---|---|---|
200 ОК | Уведомление было принято WNS. | Не требуется |
ошибка 400, неверный запрос | Один или несколько заголовков были указаны неправильно или конфликтуют с другим заголовком. | Запишите детали вашего запроса. Проверьте ваш запрос и сравните с этой документацией. |
401 Несанкционированный | Облачный сервис не предоставил действительный билет аутентификации. Билет OAuth может быть недействительным. | Запросите действительный токен доступа, аутентифицируя облачную службу с помощью запроса токена доступа. |
403 Запрещено | Облачной службе не разрешено отправлять уведомления на этот URI, даже если они аутентифицированы. | Маркер доступа, указанный в запросе, не соответствует учетным данным приложения, которое запросило URI канала. Убедитесь, что имя вашего пакета в манифесте вашего приложения совпадает с учетными данными облачной службы, предоставленными вашему приложению на информационной панели. |
404 Не Найдено | URI канала недействителен или не распознается WNS. | Запишите детали вашего запроса. Не отправлять дальнейшие уведомления на этот канал; уведомления на этот адрес не пройдут. |
405 метод не разрешен | Неверный метод (GET, DELETE, CREATE); допускается только POST. | Запишите детали вашего запроса. Переключитесь на использование HTTP POST. |
406 Недопустимо | Облачный сервис превысил свой предел газа. | Запишите детали вашего запроса. Уменьшите скорость, с которой вы отправляете уведомления. |
410 ушел | Канал истек. | Запишите детали вашего запроса. Не отправлять дальнейшие уведомления на этот канал. Ваше приложение запрашивает новый URI канала . |
413 Запросить объект слишком большой | Полезная нагрузка уведомления превышает ограничение размера 5000 байт. | Запишите детали вашего запроса. Проверьте полезную нагрузку, чтобы убедиться, что она соответствует ограничениям по размеру. |
500 — внутренняя ошибка сервера | Внутренний сбой вызвал сбой доставки уведомлений. | Запишите детали вашего запроса. Сообщите об этой проблеме через форумы разработчиков . |
503 Служба Недоступна | Сервер в данный момент недоступен. | Запишите детали вашего запроса. Сообщите об этой проблеме через форумы разработчиков . |
Очевидно, что получение нового URI канала является идеальным, но приложение должно делать это на клиенте (и будет) в следующий раз, когда пользователь запустит приложение. А пока я хочу удалить этот канал, потому что он бесполезен. В моем сценарии, который отправляет уведомления, мы изучим результат обратного вызова и либо удалим канал, если срок его действия истек, либо, в случае успеха, отправим обновление значка, потому что это тоже необходимо. (Задача на будущее: попробуйте объединить Live Tile и значки в одном обновлении.)
push.wns.send(channelUri, payload, 'wns/tile', { client_id: 'ms-app://<my app id>', client_secret: 'my client secret', headers: { 'X-WNS-Tag' : 'SomeTag' } }, function (error, result) { if (error) { //if the channel has expired, delete from channel table if (error.statusCode == 410){ removeExpiredChannel(channelUri) } } else { //notification sent updateBadge(channelUri); } } );
Удаление просроченных каналов может быть сделано с помощью чего-то вроде:
function removeExpiredChannel(channelUri) { var sql = "delete from myapp.Channel where ChannelUri = ?"; var params = [channelUri]; mssql.query(sql, params, { success: function(results) { console.log('Removed Expired Channel: ' + channelUri) } }); }
В моем списке задач стоит добавить более надежную поддержку различных кодов ответов — например, в дополнение к ответу 410, 404 также хотел бы удалить запись канала в таблице.