Уведомления в мобильном приложении. PUSH и локальные.

1. pyrkin_vanya 488 19.09.21 20:00 Сейчас в теме
Доброго времени суток, коллеги. Вопрос уже стоит ребром. Перепробовано уже все, что есть в инете. Уведомление ниразу не пришло.
Был изучены следующие статьи
https://infostart.ru/1c/articles/606748/
https://infostart.ru/public/1408766/

Была создана отдельная ветка
https://forum.infostart.ru/forum92/topic266244/#message2719189

Никаких результатов абсолютно нет. Ни одного внятного описания и разьяснения как это работает.
Уже несколько специалистов работает над этим вопросом.

Локальные уведомления однажды каким то чудом пришли. Но пришли на следующий день после отправки. И больше не приходили.

Было принято решение изменить немного логику работу программы и использовать PUSH.

С PUSH тоже не все так легко.

Были изучены следующие материалы
https://its.1c.ru/db/pubintromobile#content:138:hdoc
https://its.1c.ru/db/v8319doc#bookmark:dev:TI000001543

В консоле был создан проект
https://console.firebase.google.com/

На мобильном устройстве получен идентификатор устройства. Но не из консоли, не из приложения так ни разу уведомление и не пришло. На данный момент используется мобильная платформа для отладки. Тестировалось начиная с 8.3.18. Сейчас стоит уже 19.

Все как один пишут только, что там все легко. Нет, не легко. И не понятно.

Готовы купить консультацию специалиста, который знает решение этого вопроса. Который сможет подключиться к компьютеру и показать/рассказать что делаем не правильно.
Вознаграждение за ответ
Показать полностью
Найденные решения
25. pyrkin_vanya 488 21.09.21 12:22 Сейчас в теме
(1)И так. Уведомления заработали. В принципе ровно так как хотел.

Были проверены мобильные платформы версий 8.3.18 и 8.3.19. Уведомления на них НЕ РАБОТАЮТ. Это и ввело в заблуждение, что код ошибочный.

Отдельная благодарность spacecraft. Проконсультировал что и как должно быть.
Как оказалось наши знания были полностью актуальными. spacecraft их подтвердил своим опытом. Спасибо огромное еще раз. Небольшая компенсация Вам за потерянное время.

И так, для таких же как и мы.
Мы использовали мобильную платформу для подключения к опубликованному мобильному приложению. Для отладки. Видимо этот вариант не отрабатывает как надо. Вопрос конечно, а где еще работает не так как надо?!)))

Для начала необходимо организовать обмен между приложением и центральной базой.
Тут достаточно простая статья
Статья на ИТС

В консоле firebase. https://console.firebase.google.com/
Создать проект. Назвать его как угодно.Затем перейти в настройки на закладку Cloud Messaging.
там увидите поля Server key и Sender ID. Эти поля лучше хранить где нибудь в основной базе.
Server key - необходим для отправки
Sender ID - для формирования идентификатора на мобильном устройстве.

Затем в мобильном приложении в ПриНачалеРаботыСистемы следующий код

	#Если МобильноеПриложениеКлиент Тогда
		Попытка
			НомерПриложенияGoogleCloud = ОбменДанными.ПолучитьНомерПриложенияGoogleCloud();
			ИдентификаторПодписчикаУведомлений = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПриложенияGoogleCloud);
			ОбменДанными.ПередатьИдентификаторПодписчикаУведомлений(ИдентификаторПодписчикаУведомлений);
		Исключение
		КонецПопытки
	#КонецЕсли
Показать


НомерПриложенияGoogleCloud - получается из основной базы.

это код отправителя с консоли https://console.firebase.google.com/
Примерно следующего вида: 1025575611831
См выше.

P.S. Как показывают тесты
Что так
ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПриложенияGoogleCloud);

Что так
ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();

Результат получается одинаковый.

В консоле firebase на закладке GENERAL. В поле Your apps. Добавить приложение (в моем случае для андройда).

Указать Android package name при создании. Это важный момент. Это имя необходимо взять в сборщике мобильного приложения в справочнике "Мобильные приложения" для группы. В разделе "Идентификаторы мобильных приложений".

Затем из консоли из вновь созданного приложения выгрузить файл google-services.json.
И добавить его в соответствующее поле в сборщике при создании приложения.

Смысл по сути прост.
Мобильное приложение генерирует идентификатор устройства и передает его в основную базу. Основная база по какому то событию использую этот идентификатор отсылает уведомление с помощью сервиса firebase.

Код отправки из основной базы.

	АдресСервера = "fcm.googleapis.com";
	АдресРесурса = "/fcm/send";
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL();
	Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl);
	
	ТелоСообщения = Новый Структура;
	ТелоСообщения.Вставить("title", ПараметрыУведомления.Заголовок);
	ТелоСообщения.Вставить("name", ПараметрыУведомления.Заголовок);
	ТелоСообщения.Вставить("sound", "default");
	ТелоСообщения.Вставить("text", ПараметрыУведомления.Текст);
	
	ПараметрыСообщения = Новый Структура;
	ПараметрыСообщения.Вставить("registration_ids", МассивУстройств);  // получаем на мобилках, как и при GCM ( IDПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений());
	ПараметрыСообщения.Вставить("data", ТелоСообщения);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ПараметрыСообщения);
	
	СтрокаТелоЗапроса = ЗаписьJSON.Закрыть();
	
	Запрос = Новый HTTPЗапрос(АдресРесурса);
	Запрос.Заголовки.Вставить("Content-Type", "application/json");
	Запрос.Заголовки.Вставить("Authorization", "key="+КлючСервера);
	Запрос.УстановитьТелоИзСтроки(СтрокаТелоЗапроса, КодировкаТекста.UTF8);
	
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
Показать


МассивУстройств - это массив с идентификаторами устройств.

Оповещения приходят мгновенно. И очень приятно наконец-то их получить спустя несколько дней работы, а может и недель.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 19.09.21 20:11 Сейчас в теме +3 $m
(1) может дело в самом телефоне? На чем тестируете? Google аккаунт активирован? Телефон поддерживает google сервисы?
3. pyrkin_vanya 488 19.09.21 20:13 Сейчас в теме
(2)Редми ноут 9 про. Гугл аккаунт активирован. Телефон, в принципе, поддерживает все, что есть на данный момент. Уведомления от других приложений приходят стабильно)))
6. spacecraft 19.09.21 20:20 Сейчас в теме
(3) в настройках телефона для 1С приложения включены push?
7. pyrkin_vanya 488 19.09.21 20:22 Сейчас в теме
(6)да. И при разработке мобильного приложения включены все уведомления. И в настройках стандартных тоже все включено.
8. spacecraft 19.09.21 20:30 Сейчас в теме
(7) на другом телефоне пробовали?
Вот тут еще посмотрите
https://forum.infostart.ru/forum92/topic223641/
Там про номер проекта в сообщениях, возможно это ваш случай.
9. pyrkin_vanya 488 19.09.21 20:38 Сейчас в теме
(8)Пробовал. Код ответа приходит 200. Ошибок нет. Но и оповещений нет.
10. spacecraft 19.09.21 20:42 Сейчас в теме
(9) проверьте еще раз полученный id устройства и как его получали.
Там важно получить именно так:
IDПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений()
И передавать массив этих id.
Код показали бы.
11. pyrkin_vanya 488 19.09.21 20:44 Сейчас в теме
(10)При начале работы системы в мобильном приложении
#Если МобильноеПриложениеКлиент Тогда
		ИдентификаторПодписчикаУведомлений = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();
		ОбменДанными.ПередатьИдентификаторПодписчикаУведомлений(ИдентификаторПодписчикаУведомлений);
	#КонецЕсли


Затем полностью весь идентификатор передается в основное приложение
Процедура ПередатьИдентификаторПодписчикаУведомлений(ИдентификаторПодписчикаУведомлений) Экспорт
	
	СтруктураПараметров = ОбменДаннымиПовтИсп.ИнициализироватьПараметрыДляОбмена();
	
	Если НЕ СтруктураПараметров.WSПрокси = Неопределено Тогда
		Операция = СтруктураПараметров.WSПрокси.ТочкаПодключения.Интерфейс.Операции.Получить("ПередатьИдентификаторПодписчикаУведомлений");
		КодУзла = СтруктураПараметров.WSПрокси.ФабрикаXDTO.Создать(Операция.Параметры.Получить("КодУзла").Тип, Константы.КодПланаОбменаТекущегоКлиента.Получить());
			
		Сериализатор = Новый СериализаторXDTO(СтруктураПараметров.WSПрокси.ФабрикаXDTO);
		ИдентификаторXDTO = Сериализатор.ЗаписатьXDTO(ИдентификаторПодписчикаУведомлений);
		
		Ответ = СтруктураПараметров.WSПрокси.ПередатьИдентификаторПодписчикаУведомлений(КодУзла, ИдентификаторXDTO);
	КонецЕсли;
	
КонецПроцедуры
Показать


Отладкой смотрим основное приложение. Туда все прекрасно приходит.
12. spacecraft 19.09.21 20:47 Сейчас в теме
(11)
ИдентификаторПодписчикаУведомлений = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПриложенияGoogleCloud);

Вот я об этом и говорил. Не нужно передавать номер!
Вот так должно быть:
ИдентификаторПодписчикаУведомлений = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();
13. pyrkin_vanya 488 19.09.21 20:47 Сейчас в теме
(12)прошу прощения. Старый код. Номер не передаем туда. Подправил так как сейчас сделано. Но прошу заметить, что идентификатор устройства одинаковый, что с передачей номера отправителя, так и без. Узнать как-то можно, может он реально не корректный?
16. spacecraft 19.09.21 20:58 Сейчас в теме
(13) там дело не в самом номере, а в его внутренностях.
Из СП:

ПолучитьИдентификаторПодписчикаУведомлений(<НомерПриложенияGoogleCloud>)

На Android, если задан, возвращается идентификатор GCM (Google Cloud Messaging), иначе - FCM (Firebase Cloud Messaging).

Нужен как раз FCM. Т.е. без номера.
17. pyrkin_vanya 488 19.09.21 21:01 Сейчас в теме
(16)вот прям сейчас при запуске мобильного приложения сработала отладка на центральной базе и вот что туда передается.
Прикрепленные файлы:
19. pyrkin_vanya 488 19.09.21 21:08 Сейчас в теме
(16)сейчас еще раз попытался отправить из базы уведомление.
Пришла ошибка в описание
MismatchSenderId
14. spacecraft 19.09.21 20:54 Сейчас в теме
(11) не указано в приведенном коде подключение. ПодключитьОбработчикУведомлений вообще есть?
15. pyrkin_vanya 488 19.09.21 20:58 Сейчас в теме
(14)есть
			// Подключение обработчика локальных и push-уведомлений
			ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаУведомлений", УведомленияКлиент);
			
			#Если МобильноеПриложениеКлиент Тогда
				ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(ОписаниеОповещения);
			#КонецЕсли
			


Это каким-то образом влияет на уведомление? Мне его не надо обрабатывать пока, мне енго хотя бы просто увидеть.

Люди пишут, что можно отправить уведомление из консоли https://console.firebase.google.com/
Как?
18. spacecraft 19.09.21 21:07 Сейчас в теме
(15) в смысле увидеть? Оно персональное для приложения. Это не web-push
20. pyrkin_vanya 488 19.09.21 21:10 Сейчас в теме
(18) Так, вот с этого момента поподробнее?

Вспомните у себя на телефоне любое приложение. Типа вайлбериза. Периодически приходят всякие уведомления. О доставке например товара. Так вот мне нужно тоже самое.
21. spacecraft 19.09.21 21:11 Сейчас в теме
(20) а такой момент, что push-сообщения теряются(не показываются), если приложение не запущено, ни о чем не говорит?
22. pyrkin_vanya 488 19.09.21 21:14 Сейчас в теме
(21)нет, не говорит. Я вам не говорил, что приложение не запущено. Я проверял и с запущенным и с закрытым. Мне кажется, что как только уже не проверял.
23. pyrkin_vanya 488 19.09.21 21:16 Сейчас в теме
(21) Если вы осведомлены по этим пушам хорошо, можете оказать консультацию? Завтра например?
24. pyrkin_vanya 488 19.09.21 21:23 Сейчас в теме
(21)Возможно с вашими знаниями вам потребуется несколько минут найти ошибку.
4. slavikss 19.09.21 20:14 Сейчас в теме
(2)
(2) Вот да, после прочтения поста, возникает ощущение что дело в чем-то простом и неожиданном, на что не подумаешь.
Представьте что вы тайный враг вышей разработки, чтобы вы втихаря сделали чтобы пуш не работал?
5. pyrkin_vanya 488 19.09.21 20:18 Сейчас в теме
(4)Прошу прощения, если это какой-то юмор, то я не совсем его понял. Уже очень устали от пустой болтавни. Прошу не обижаться, к вам не относится. Хочется уже конкретного решения.
25. pyrkin_vanya 488 21.09.21 12:22 Сейчас в теме
(1)И так. Уведомления заработали. В принципе ровно так как хотел.

Были проверены мобильные платформы версий 8.3.18 и 8.3.19. Уведомления на них НЕ РАБОТАЮТ. Это и ввело в заблуждение, что код ошибочный.

Отдельная благодарность spacecraft. Проконсультировал что и как должно быть.
Как оказалось наши знания были полностью актуальными. spacecraft их подтвердил своим опытом. Спасибо огромное еще раз. Небольшая компенсация Вам за потерянное время.

И так, для таких же как и мы.
Мы использовали мобильную платформу для подключения к опубликованному мобильному приложению. Для отладки. Видимо этот вариант не отрабатывает как надо. Вопрос конечно, а где еще работает не так как надо?!)))

Для начала необходимо организовать обмен между приложением и центральной базой.
Тут достаточно простая статья
Статья на ИТС

В консоле firebase. https://console.firebase.google.com/
Создать проект. Назвать его как угодно.Затем перейти в настройки на закладку Cloud Messaging.
там увидите поля Server key и Sender ID. Эти поля лучше хранить где нибудь в основной базе.
Server key - необходим для отправки
Sender ID - для формирования идентификатора на мобильном устройстве.

Затем в мобильном приложении в ПриНачалеРаботыСистемы следующий код

	#Если МобильноеПриложениеКлиент Тогда
		Попытка
			НомерПриложенияGoogleCloud = ОбменДанными.ПолучитьНомерПриложенияGoogleCloud();
			ИдентификаторПодписчикаУведомлений = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПриложенияGoogleCloud);
			ОбменДанными.ПередатьИдентификаторПодписчикаУведомлений(ИдентификаторПодписчикаУведомлений);
		Исключение
		КонецПопытки
	#КонецЕсли
Показать


НомерПриложенияGoogleCloud - получается из основной базы.

это код отправителя с консоли https://console.firebase.google.com/
Примерно следующего вида: 1025575611831
См выше.

P.S. Как показывают тесты
Что так
ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПриложенияGoogleCloud);

Что так
ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();

Результат получается одинаковый.

В консоле firebase на закладке GENERAL. В поле Your apps. Добавить приложение (в моем случае для андройда).

Указать Android package name при создании. Это важный момент. Это имя необходимо взять в сборщике мобильного приложения в справочнике "Мобильные приложения" для группы. В разделе "Идентификаторы мобильных приложений".

Затем из консоли из вновь созданного приложения выгрузить файл google-services.json.
И добавить его в соответствующее поле в сборщике при создании приложения.

Смысл по сути прост.
Мобильное приложение генерирует идентификатор устройства и передает его в основную базу. Основная база по какому то событию использую этот идентификатор отсылает уведомление с помощью сервиса firebase.

Код отправки из основной базы.

	АдресСервера = "fcm.googleapis.com";
	АдресРесурса = "/fcm/send";
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL();
	Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl);
	
	ТелоСообщения = Новый Структура;
	ТелоСообщения.Вставить("title", ПараметрыУведомления.Заголовок);
	ТелоСообщения.Вставить("name", ПараметрыУведомления.Заголовок);
	ТелоСообщения.Вставить("sound", "default");
	ТелоСообщения.Вставить("text", ПараметрыУведомления.Текст);
	
	ПараметрыСообщения = Новый Структура;
	ПараметрыСообщения.Вставить("registration_ids", МассивУстройств);  // получаем на мобилках, как и при GCM ( IDПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений());
	ПараметрыСообщения.Вставить("data", ТелоСообщения);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ПараметрыСообщения);
	
	СтрокаТелоЗапроса = ЗаписьJSON.Закрыть();
	
	Запрос = Новый HTTPЗапрос(АдресРесурса);
	Запрос.Заголовки.Вставить("Content-Type", "application/json");
	Запрос.Заголовки.Вставить("Authorization", "key="+КлючСервера);
	Запрос.УстановитьТелоИзСтроки(СтрокаТелоЗапроса, КодировкаТекста.UTF8);
	
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
Показать


МассивУстройств - это массив с идентификаторами устройств.

Оповещения приходят мгновенно. И очень приятно наконец-то их получить спустя несколько дней работы, а может и недель.
Прикрепленные файлы:
26. spacecraft 21.09.21 12:38 Сейчас в теме
(25)
Были проверены мобильные платформы версий 8.3.18 и 8.3.19. Уведомления на них НЕ РАБОТАЮТ.

на 8.3.19.82 все нормально отрабатывает.
27. pyrkin_vanya 488 21.09.21 14:14 Сейчас в теме
(26)прикольно. Как тогда понять почему у меня не отрабатывали эти пуши?
28. pyrkin_vanya 488 21.09.21 14:32 Сейчас в теме
(26)Только что проверил специально еще раз. На мобильную платформу оповещения не приходят.
29. spacecraft 21.09.21 15:26 Сейчас в теме
(28) я подумал, что именно на таких версиях мобильной платформы не работает )
Просто сборка apk это тоже использование мобильной платформы.
30. pyrkin_vanya 488 21.09.21 15:31 Сейчас в теме
(29)нет, именно при использовании приложения мобильной платформы от 1с.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот