С августа 2019 года перестали отправляться push-уведомления из 1С в мобильное приложение 1С (мобильная платформа 1С) на Andoid.
До этого момента всё отлично отправлялось.
Ошибка следующая:
"Ошибка при вызове метода контекста (Отправить): Отправка сообщения 1 через GCM завершилась ошибкой: Error=DeprecatedEndpoint"
Платформа 1С: 8.3.9.2170, 8.3.12.1567, 8.3.15.1534 (самая актуальная из 8.3);
Мобильная платформа 1С: 8.3.13.45, 8.3.15.59 (самая актуальная из мобильных).
Описание механизма (который работал больше года):
1. Сторонние сервисы не используются.
2. Создан проект в firebase.google.com;
2.1 Получен номер проекта (как номер отправителя);
2.2 Получен ключ сервера (для отправки push-уведомлений);
3. В мобильном приложении 1С при каждом входе обновляется IDПодписчика.
Код отправки push-уведомления из основной базы:
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Получатели.Добавить(IDПодписчика);
Уведомление.Заголовок = "Тест";
Уведомление.Текст = "Тест";
ДанныеАвторизации = Новый Соответствие;
// Больше года работало с параметром GCM, сейчас пробовал и с параметром FCM - не работает тоже
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.GCM, КлючСервера); // при GCM - ругается на "Ошибка тела уведомления - DeprecatedEndpoint"
//ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.FCM, КлючСервера); // при FCM - ругается на "Ошибка данных аутентификации - Не переданы данные для авторизации в сервисе отправки уведомлений."
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации);
Показать
Код получения IDПодписчика в мобильном приложении 1С:
В интернете обсуждений такой проблемы, связанной с 1С нет. Никто push-уведомления не использует что ли?
Есть что-то похожее на английских сайтах посвящённое разработке мобильных приложений на Андроид. Но там решения основанные на правках в самом коде приложений.
Код получения IDПодписчика в мобильном приложении 1С:
IDПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПроекта);
внимательное прочтение синтаксис помощника показало что
для FCM не надо указывать номер проекта при получении ИД на мобильном
с номером проекта ИД содержит: <subscriberType>GCM</subscriberType>
а если
ID = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();
без номера проекта ИД будет нужного типа: <subscriberType>FCM</subscriberType>
и можно средствами 1с отправить уведомление
Уведомление = СоздатьУведомление(ТекстУведомления, Данные);
Уведомление.Получатели.Добавить(<десериализованныйИДМобильногоПодписчикаУведомлений>);
ДанныеАвторизации = Новый Соответствие;
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.FCM, <токен созданный при переносе проекта из GCM в FCM>);
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации);
Аналогичная проблема.
Плюнул. Решил запросом напрямую, FCM отвечает что все класс - мессаги разошлись по получателям, но ни один телефон в офисе не квакнул....
Но, думаю, направление куда копать верное:
КлючСервера_ = "МойКлюч";
АдресСервера = "fcm.googleapis.com/fcm/send";
ssl = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl);
ТелоСообщения = Новый Структура;
ТелоСообщения.Вставить("title", "Обновление данных");
ТелоСообщения.Вставить("body", "Заявка");
ПараметрыСообщения = Новый Структура;
ПараметрыСообщения.Вставить("registration_ids", МассивУстройств);
ПараметрыСообщения.Вставить("data", ТелоСообщения);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыСообщения);
СтрокаТелоЗапроса = ЗаписьJSON.Закрыть();
Запрос = Новый HTTPЗапрос();
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "key="+КлючСервера_);
Запрос.УстановитьТелоИзСтроки(СтрокаТелоЗапроса, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
СтруктураОтветаХранилище = Ответ.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураОтветаХранилище);
Попытка
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
Исключение
КонецПопытки;
А как ты проверяешь, что отправились? Просто у меня отправленные push-уведомления из 1С в проекте в гугла не сохраняются.
Т.е. есть только два состояния push: работает - телефон отобразил; не работает - телефон не отобразил или при отправке вывалилась ошибка.
Спасибо за вариант, не знал о такой возможности, попробую так сделать.
Что интересно, на 8.3.15.1534 (самая актуальная из 8.3), ошибка не вываливается (! т.е. метод выполняется без каких либо ошибок), а просто на телефон не приходит.
Но, если указать параметр МассивОшибок, то в нём как раз та же самая ошибка DeprecatedEndpoint указана.
А параметр "registration_ids" это что за данные? Тот же самый Идентификатор устройства или что-то иное?
Ответ: Загугли "Firebase Cloud Messaging HTTP protocol" и получишь все параметры для мессаг.
registration_ids - массив ID девайсов-приемников, если их несколько. Теперь так.
(6) Красавчик! Нет слов)
Забавно, что разница между прошлое версией твоего кода и рабочей, в параметре "text" вместо "body".
Пролистал справочник по API, но параметра "text" не обнаружил. Вот как можно дойти до такого решения? Или я не там смотрел.
А не подскажешь как можно заставить при нажатии на push, чтобы открывалась не только 1С (как сейчас), но и конкретная база.
При типовом методе 1С "ОтправкаДоставляемыхУведомлений.Отправить" - открывалась конкретная база.
Отметил твой путь как решение, т.к. оно отлично работает, хоть и не является решением конкретной проблемы работы методов 1С.
И ещё раз спасибо огромное!
(7) Надо в запросе отправки уведомления FCM в параметр data ещё добавить параметр base и присвоить ему ИдентификаторИнформационнойБазы из Доставляемых уведомлений.
(6) Спасибо вам большое. Сам 3 вечера убил, на изучение вопроса. Осталось проверить, можно ли передавать большой объем данных JSON через свойство "данные" для парсинга со стороны мобилки.
(6) Спасибо за труд! Я словил все ошибки, которые были тут, плюс массу других 😄. Начал регать свое приложение, как в ИТС написано, но этого делать не надо, верно? Просто в параметрах проекта на закладке сервиса Cloud Messaging копируем ключ сервера (старый или новый длинный?) и Идентификатор отправителя, так? С ключем понятно "key="+КлючСервера". Идентификатор отправителя указать в параметре при получении ID подписчика? Именно так сервис понимает, от кого отправлять пуши. У меня похоже трабл с 12 платформой, у кого на ней взлетело? (ошибка 400
JSON_PARSING_ERROR: Unexpected character () at position 0.)
Завтра проверю.
У меня вываливается с ошибкой "MismatchSenderId". Как понимаю не может найти IDПодписчика, хотя получаю его так же
"ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений().ИдентификаторУстройства"
Тоже использую мобильную платформу.
(9) если нужно отправить одному устройству, то справочник рекомендует использовать параметр "to" вместо "registration_ids".
ПараметрыСообщения = Новый Структура;
ПараметрыСообщения.Вставить("to", Подписчик.ИдентификаторУстройства);
А как при нажатии на уведомление запускать конкретную базу, а не просто приложение 1С?
Есть любопытный параметр "click_action", но не ясно как его использовать.
Теперь другой момент, перестал отрабатывать Обработчик уведомления. Теперь просто выходит текст Push'а, а раньше при получении пуша переходил в заданную мной процедуру :
(14) Лучший! Спасибо большое за то что поделился!
Скажи, как додумался до такого? Нигде параметр "base" не указан в справке Google Firebase. Даже в Android Studio платформу прошестил, не нашёл упоминаний.
Делаю как в примере, получаю ответ "200" и ошибку "InvalidRegistration".
На сайте https://firebase.google.com/ есть описание такого поведения:
Check the format of the registration token you pass to the server. Make sure it matches the registration token the client app receives from registering with Firebase Notifications. Do not truncate or add additional characters.
Делаю как в примере, но получаю ответ 200 и ошибку "InvalidRegistration".
На сайте Firebase есть описание такого поведения:
Check the format of the registration token you pass to the server. Make sure it matches the registration token the client app receives from registering with Firebase Notifications. Do not truncate or add additional characters.
(18)
1. Ключ сервера - это "Ключ сервера" из консоли Google fire base. Верно;
2. Массив устройств - это массив строк - ИдентификаторПодписчикаДоставляемыхУведомлений.ИдентификаторУстройства (deviceID).
УРА! ЗАРАБОТАЛО!!!!!
(23)просто замени ее на
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если НЕ Ответ.КодСостояния = 200 Тогда
Сообщить("Ошибка отправки PUSH. КодСостояние: "+Ответ.КодСостояния + Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Спасибо за статью, сделал - работает. Единственное есть пару неудобных моментов, во первых не отображается счетчик уведомлений возле иконки мобильной платформы и второе - если уведомление смахнуть, а потом открыть мобильную конфигурацию - то не происходит обработка Доставляемых Уведомлений, что не очень удобно, если пользователь уведомление смахнет, то при открытии конфигурации на телефоне, не случиться задуманное..)
Может для отображения счетчика уведомлений, надо передавать какие то доп параметры?
Получается, что через объект ДоставляемоеУведомление сейчас отправить не возможно? 1С вообще в курсе, что происходит, кто нибудь им писал? Это наверное нужно оформить в виде ошибки.
Кто нибудь сталкивался с таким:
Когда приходит push уведомление, при этом запущено приложение и пользователь с ним работает, уведомление открывается прямо в приложении, наподобие того, как выводится сообщение пользователю, оно содержит следующий текст: «Уведомление для неизвестного приложения. <текст уведомления>».
Параметр "base" заполнен(хотя я вообще не понимаю откуда он взялся, его нет в описание, также как, например "text"), мб ещё какие то параметры нужно заполнить?
Получилось у меня отправить типовыми средствами push уведомление на Андроид.
Что для этого нужно
1. При получении идентификатора подписчика на Андроиде не нужно передавать параметр "НомерПриложения", т.е. вот так
Таким образом будет получен идентификатор с типом "FCM", а не "GCM"
2. Приложение должно быть собрано и установлено на телефон в виде apk. (у меня оно еще загружено в гугл плей, но не уверен что это обязательно)
3. в консоле firebase для проекта нужно добавить приложение и в качестве названия пакета указать полный идентификатор приложения для Android, который указан при сборке приложения
После этого метод отправки отработал без ошибок, пуш уведомления пришли на телефон.
Для не собранного приложения (т.е. запуск идет через мобильную платформу) типовыми средствами отправить не получилось, т.к. в Идентификаторе подписчика название пакета = "com.e1c.mobile". Пробовал добавить приложение с таким названием в проект firebase, но при отправке пуша выводит ошибку
"Отправка сообщения 1 через FCM завершилась ошибкой: ключ отправителя не подходит для получателя
(34) скорее всего не получилось с платформы 1с потому что ты собирал приложение с файлом google-services.json в нем данные твоего приложения на файербейс - нужно ждать когда 1с догадается свою платформу собрать с этим файлом
Для не собранного приложения (т.е. запуск идет через мобильную платформу) .
Тут же написано что приложение не собрано. Запуск идет из конфигуратора "Запустить отладку мобильного приложения"
+ когда я собрал приложение с google-services.json, то оно перестало устанавливаться, писало вроде что апк поврежден. А без google-services.json устанавливается и пуши работают
Мобильная платформа 8.3.15.62. Сборщик 2.0.10.63
Это всё здорово, но кто сталкивался с этой проблемой в мобильном документообороте?
Там пуши не идут, даже через 1эсовский центр уведомлений.
"GCM has been deactivated and removed from Google's APIs. ... " хоть и стоит сервис 1С, а в сервисе FCM.
47.
Evgeniy7620041976
118.09.24 16:23 Сейчас в теме
Делаю отправку push по новым правилам. Но мобильное приложение не реагирует на уведомление.
Сейчас новая структура и там нет Base, где указывается номер приложения.
Есть только такая структура
Оповещение = Новый Структура;
Оповещение.Вставить("title", "");
Оповещение.Вставить("body", "");
Оповещение.Вставить("image", "");
Может кто знает что передать чтоб срабатывал обработчик оповещений в мобильном приложении, когда оно выгружено из памяти? когда приложение открыто, то все нормально работает
48.
user608038_andrei-5
18.09.24 22:26 Сейчас в теме
(47) подскажи, у тебя обработчик уведомлений запускается после получения push уведомления? какую версию сборщика и какую версию мобильного приложения используешь?
Столкнулся с проблемой, что Android устройство push уведомления получает, а обработчик не запускается. При этом, если отправить из приложения локальное уведомление, то обработчик работает.
Раньше все работало через "ОтправкаДоставляемыхУведомлений.Отправить()", но потом Google внесла изменения в версию PUSH и пришлось перейти на API того же FCM. Но после перехода на API обработчик и полетел. Дождались новую версию приложения, где допилили процедуру отправки "ОтправкаДоставляемыхУведомлений.Отправить()" под новую версию, но мобильное приложение все также отказывается обрабатывать PUSH уведомления. Куда копать, уже не знаю.
49.
Evgeniy7620041976
119.09.24 12:12 Сейчас в теме
(48) Получается приложения не запущено. Пришло уведомление, я нажимаю на уведомление, открывается приложение 1С и при запуске запускается обработчик уведомлений, но это уведомление он не видит. Раньше до изменений все отрабатывало. Версия сборщика 8.3.25.27, версия мобильной платформы 8.3.25.52. Вот и у меня такая же проблема, если открыто приложение, то обработчик срабатывает
51.
user608038_andrei-5
20.09.24 10:34 Сейчас в теме
(49) Такая же проблема. Надеюсь в скором времени выйдет новый релиз мобильной платформы. А пока искользую версию 8.3.25.56, где хотя бы половина функционала работает.
50.
user608038_andrei-5
19.09.24 13:28 Сейчас в теме
На текущий момент решил свою проблему установив мобильную платформу версии 8.3.25.56 и переделал метод отправки, который описан в изменениях к технологической платформе 8.3.25. Может быть кому-то будет полезно.
53.
user608038_andrei-5
20.09.24 12:16 Сейчас в теме
(52) увы, но нет. Только при открытом приложении. Пока этого достаточно. Но хотелось бы чтобы работало как раньше.
JDK как я понимаю тут не при чем. Ни 17, ни рекомендованная 19 версия не помогает.
54.
Evgeniy7620041976
120.09.24 12:20 Сейчас в теме
(53) Да. Раньше еще можно было передавать параметры и потом в уведомлении их было видно в Данные, сейчас нет этого. Видимо действительно нужно ждать новую платформу