Всем привет. Недавно у моих проектов перестали приходить пуш уведомления на устройства iOS. После процесса «гуглирования» выяснилось, что пуш уведомления для «яблок» теперь должны быть отправлены по протоколу http/2.
HEADERS - END_STREAM + END_HEADERS :method = POST :scheme = https :path = /3/device/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0 host = api.development.push.apple.com authorization = bearer eyAia2lkIjogIjhZTDNHM1JSWDciIH0.eyAiaXNzIjogIkM4Nk5WOUpYM0QiLCAiaWF0I jogIjE0NTkxNDM1ODA2NTAiIH0.MEYCIQDzqyahmH1rz1s-LFNkylXEa2lZ_aOCX4daxxTZkVEGzwIhALvkClnx5m5eAT6 Lxw7LZtEQcH6JENhJTMArwLf3sXwi apns-id = eabeae54-14a8-11e5-b60b-1697f925ec7b apns-expiration = 0 apns-priority = 10 apns-topic = <MyAppTopic> DATA + END_STREAM { "aps" : { "alert" : "Hello" } } Listing 8-3 shows a sample request constructed for a certificate that contains multiple topics.
Вот пример запроса по протоколу http/2
Но проблема заключалась в другом. В основном я использую ASP.NET Framework на базе сервера IIS. Сервер у меня на базе Windows 2012R2. Проблема в том, что данная версия не знает что такое HTTP/2 вообще. Я потратил несколько дней на тщетные попытки что-то сделать. Переустанавливать сервер нет возможности. Так как на нем запущены множество проектов и останавливать их работу нельзя. В данном случае не уходили только пуш сообщения на «яблоки». С устройствами ANDROID проблем таких не возникает.
Решение проблемы
Совсем не так давно я интересовался новой технологией ASP.NET Core. Проекты ASP.NET Core можно публиковать на сервере с Linux. Linux дружит с HTTP/2.
Было принято решение написать облачный сервис на ASP.NET Core и отправлять туда пост запросом пуш сообщение и токен устройства для получения.
Я взял библиотеку для работы с ASP.NET Core. Немного модифицировал и скомпилировал проект
public class dotAPNSService : IDisposable { public event EventHandler OnTokenExpiredHandler; private ApnsJwtOptions options = null; public dotAPNSService(string bundle) { options = new ApnsJwtOptions() { BundleId = bundle, // здесь нужно указать название проекта com.org.test CertContent = "Здесь необходимо указать сертификат полученный в кабинете разработчика",//https://developer.apple.com/account/resources/authkeys/list KeyId = "здесь ид ключа",//https://developer.apple.com/account/resources/authkeys/list TeamId = "здесь ид команды"//https://developer.apple.com/account/resources/authkeys/list }; } public void SendNotifications(String[] deviceTokens, String title, String body) { if (deviceTokens == null || deviceTokens.Length <= 0) { return; } if (String.IsNullOrEmpty(title)) { return; } if (String.IsNullOrEmpty(body)) { return; } // once you've gathered all the information needed and created an options instance, it's time to call var apns = ApnsClient.CreateUsingJwt(new HttpClient( ), options); // start the process foreach (String deviceToken in deviceTokens) { var push = new ApplePush(ApplePushType.Alert) .AddAlert(title, body) .AddToken(deviceToken); Send(apns, push, deviceToken); } } }
ВНИМАНИЕ!!! Сохраните ключ в надежном месте. Насколько мне известно второй раз вы его не скачаете. Его можно скачать только один раз.
Запуск
Для запуска NET.Core на линукс я использовал Docker. Я использовал VPS сервер от компании REG.RU. В личном кабинете покупаем VPS.
Обратите внимание! У рег.ру только облачные серверы поддерживают нужную виртуализацию для докера. Также только облачные поддерживают смену ядра линукса. Это официальный ответ их службы поддержки.

Заходим и выбираем сервер с установленным докером

создаем пользователя на докере
публикуем приложение через Visual Studio

Вводим логин пароль от докера и приложение публикуется.
Далее просто подключается к нашему серверу через SSH. ключи доступа придут к Вам на эл почту.
Вводим команду на запуск вашего проекта из докера
docker run -d -p 80:80/tcp учетнаязапись/названиепроекта
после этой команды ваш проект будет доступен по адресу http://ипадрессервера/
Далее во всех проекта я просто отправляю пост запрос по этому адресу с массивом токенов получателей заголовком и сообщением. Все уходит и приходит просто супер быстро.
P.S. Вы можете привязать доменное имя в настройках рег.ру.
Итог
В данный момент все пуш сообщения уходят нормально. Проблем с такой связкой не обнаружено. Даже кажется что пуши уходят намного быстрее чем это работало раньше. Надеюсь моя статья поможет тем, кто столкнулся с аналогичной проблемой.
ссылка на оригинал статьи https://habr.com/ru/post/557710/
Добавить комментарий