Коллеги, добрый день.
Я в мобилках полный ноль, поэтому прошу объяснить максимально подробно.
Есть sip-звонилка, в моем случае это linhone, но вопрос касается любой другой звонилки, да и вообще любого приложения
Правильно ли я понимаю, что в андроиде программы, которые активно не используются,
переводятся системой в некий спящий режим, в котором их функции сильно ограничены?
Если да, то доступен ли им в этом режиме интернет?
Правильно ли понимаю, что если некое приложение (например, звонилка) должно не работать постоянно,
а ждать сигнала извне (например, входящего звонка), то оно перед уходом в спящий режим
должно подписаться на некие "пуш-уведомления"?
И при получении такого уведомления операционка разбудит нужное приложение?
Или у приложения в спящем режиме есть доступ в интернет, и оно из своего спящего режима может опрашивать
сервер на предмет появления там новых данных?
В контексте звонилки получается, что звонилка должна опрашивать сервер постоянно.
Не слишком ли сильно это просадит батарею?
Если постоянный опрос сервера — это энергозатратно, то как тогда работает получение пуш-уведомлений?
Ведь сама операционка должна кого-то где-то опрашивать, чтобы узнать, пришло ли что-то новое.
И делать это постоянно.
Здравствуйте, DTF, Вы писали:
DTF>Коллеги, добрый день. DTF>Я в мобилках полный ноль, поэтому прошу объяснить максимально подробно.
DTF>Есть sip-звонилка, в моем случае это linhone, но вопрос касается любой другой звонилки, да и вообще любого приложения
DTF>Правильно ли я понимаю, что в андроиде программы, которые активно не используются, DTF>переводятся системой в некий спящий режим, в котором их функции сильно ограничены?
В общем случае они завершаются. Т.е. ты переключился на другую программу, предыдущую программу андроид убивает. Ты нажал на кнопку выключения телефона, активную программу андроид убивает. Это не обязательно должно происходить, логика там не такая примитивная, но в общем случае рассчитывать на то, что неактивная программа не завершится — нельзя.
DTF>Если да, то доступен ли им в этом режиме интернет?
Нет, конечно, программа же не работает.
DTF>Правильно ли понимаю, что если некое приложение (например, звонилка) должно не работать постоянно, DTF> а ждать сигнала извне (например, входящего звонка), то оно перед уходом в спящий режим DTF> должно подписаться на некие "пуш-уведомления"?
DTF>И при получении такого уведомления операционка разбудит нужное приложение?
В общем случае не разбудит, а запустит, даст немного времени что-нибудь поделать и завершит.
DTF>Если постоянный опрос сервера — это энергозатратно, то как тогда работает получение пуш-уведомлений? DTF>Ведь сама операционка должна кого-то где-то опрашивать, чтобы узнать, пришло ли что-то новое. DTF>И делать это постоянно.
ОС держит одно TCP соединение до сервера гугл и принимает пуш-уведомления от него. Приложение, которое хочет доставлять пуш-уведомление, должно это делать через сервер гугла. Далее ОС получит уведомление, запустит нужное приложение и даст ему его обработать. Или просто покажет это уведомление пользователю, а когда пользователь на него нажмёт — в этот момент запустит нужное приложение.
Здравствуйте, vsb, Вы писали:
vsb>ОС держит одно TCP соединение до сервера гугл и принимает пуш-уведомления от него. Приложение, которое хочет доставлять пуш-уведомление, должно это делать через сервер гугла. Далее ОС получит уведомление, запустит нужное приложение и даст ему его обработать. Или просто покажет это уведомление пользователю, а когда пользователь на него нажмёт — в этот момент запустит нужное приложение.
То есть если я хочу рассылать такие пуш-уведомления, я должен как-то договариваться с гуглом?
Или можно как-то самому замутить сервис посылки уведомлений, и заставить андроид/иос смотреть и на него тоже?
Если я хочу посылать уведомление только "своим" экземплярам приложения, как я узнаю,
кто из них свой?
Приложуха должна сгенерировать и отдать мне какой-то идентификатор который я потом отдам гулу?
Здравствуйте, DTF, Вы писали:
vsb>>ОС держит одно TCP соединение до сервера гугл и принимает пуш-уведомления от него. Приложение, которое хочет доставлять пуш-уведомление, должно это делать через сервер гугла. Далее ОС получит уведомление, запустит нужное приложение и даст ему его обработать. Или просто покажет это уведомление пользователю, а когда пользователь на него нажмёт — в этот момент запустит нужное приложение.
DTF>То есть если я хочу рассылать такие пуш-уведомления, я должен как-то договариваться с гуглом? DTF>Или можно как-то самому замутить сервис посылки уведомлений, и заставить андроид/иос смотреть и на него тоже?
В iOS такого способа 100% нет. Android это более открытая система, поэтому всякими трюками там можно попытаться оставить запущенным в фоне свой сервис и работать через него, хотя в каждой новой версии эти трюки зажимают и тд. Но в любом случае это не надёжно и не предсказуемо в долгосрочной перспективе. Как раз по той причине, что плохо написанные приложения жрут батарею, а претензии потом пользователи выставляют к гуглу. Поддерживаемый способ — именно такой, работать через гугл сервисы.
DTF>Если я хочу посылать уведомление только "своим" экземплярам приложения, как я узнаю, DTF>кто из них свой? DTF>Приложуха должна сгенерировать и отдать мне какой-то идентификатор который я потом отдам гулу?
Здравствуйте, DTF, Вы писали:
DTF>То есть если я хочу рассылать такие пуш-уведомления, я должен как-то договариваться с гуглом?
Именно так.
Этот "договор" бесплатен, расписан во всех мануалах и stackoverflow.
DTF>Или можно как-то самому замутить сервис посылки уведомлений, и заставить андроид/иос смотреть и на него тоже?
Не нужно.
DTF>Если я хочу посылать уведомление только "своим" экземплярам приложения, как я узнаю, DTF>кто из них свой? DTF>Приложуха должна сгенерировать и отдать мне какой-то идентификатор который я потом отдам гулу?
Именно так. Или Эпплу.
Т.е., твоё приложение говорит твоему серверу "айди такой-то, операционка такая-то, подписка на уведомления" или "отписка от уведомлений", и ты у себя это запоминаешь, а когда надо что-то послать, шлёшь определенного вида REST-запрос к серверам гугла или эппла (или хуавея, или рустора, или все другие варианты распространения приложения, потому что андроид без гуглосервисов уже довольно часто встречается).
Насколько я понял после гугления, sender id приложухи, зашитый в ней, должен соответствовать sender-id моего аккаунта.
Но как этого добиться, если приложение не моё?
Здравствуйте, DTF, Вы писали:
DTF>Насколько я понял после гугления, sender id приложухи, зашитый в ней, должен соответствовать sender-id моего аккаунта. DTF>Но как этого добиться, если приложение не моё?
Никак, конечно, не надо для не своих приложений слать пуши
D>Никак, конечно, не надо для не своих приложений слать пуши
ТС упомянул, что приложение это Linphone. Судя по страничке это FOSS проект, причем в составе проекта также разрабатывается и сервер: https://www.linphone.org/technical-corner/flexisip
Понятно, что ТС не автор приложения, но если он развертывает как клиент, так и сервер, то и push он должен настраивать.
Полагаю, что нужно копать документацию по используему SIP серверу.
Например в фичах flexisip:
Flexisip offers an easy-to-install SIP server solution, bringing all the features required to deploy your own SIP service tuned for
mobile or desktop applications, "out of the box". Especially the interconnection with Apple's and google's push notification systems.
Interconnected with push notifications systems for reliably notifying mobile apps of incoming calls or messages (including
support of RFC8599 for the transmission of the push notification information through REGISTER requests, where we
leverage to adapt to iOS 13 new push notification constraints)
Здравствуйте, Dair, Вы писали:
D>Никак, конечно, не надо для не своих приложений слать пуши
Но как в таком случае организовать сервер телефонии, который пернаправляет звонки зарегистрированным на нем абонентам?
Ему же надо абонентов выводить из спящего режима как-то.
Здравствуйте, DTF, Вы писали:
D>>Никак, конечно, не надо для не своих приложений слать пуши
DTF>Но как в таком случае организовать сервер телефонии, который пернаправляет звонки зарегистрированным на нем абонентам? DTF>Ему же надо абонентов выводить из спящего режима как-то.
так, стоп.
ты сказал что приложение регистрируется у тебя на сервере.
как может не твоё приложение слать свой пуш-токен к тебе на сервер, и зачем?
Мне казалось, что если уж приложение шлёт токен тебе, то и управлять им тоже ты уже умеешь, даже если в основе опенсорс.
Но это документация для библиотеки liblinphone, т.е. для разработчиков её использующих в своих приложениях.
А не для пользователя linphone.
В общем случае есть минимум 4 стороны, про друг друга ничего не знающие:
1) пользователь SIP клиента
2) разработчик SIP клиента
3) администратор SIP сервера
4) разработчик SIP сервера
Кто и в каком порядке должен договариваться с google-сервисами?
Здравствуйте, Dair, Вы писали:
D>так, стоп.
D>ты сказал что приложение регистрируется у тебя на сервере.
D>как может не твоё приложение слать свой пуш-токен к тебе на сервер, и зачем?
SIP-приложения обычно регистрируются на сервере телефонии, чтобы этот сервер знал что абонент подключен и мог перенаправить звонок к этому абоненту.
При регистрации можно передать и пуш-токен.
Более того, есть rfc8599, который рекомендует делать именно так.
А про зачем — хз, я изначально думал, что как раз чтобы получать уведомления, а теперь даже не знаю.
Может, это вообще не пуш-токен, а что-то другое?
Заголовок выглядит вот так (это не linphone, а portsip):
D>Мне казалось, что если уж приложение шлёт токен тебе, то и управлять им тоже ты уже умеешь, даже если в основе опенсорс.
нет, не умею
Ну и по-прежнему актуален вопрос:
как организовать сервер телефонии, чтобы пользователи могли использовать стороние приложения?
Неужели никак, и каждый подобный сервис должен иметь свое приложение?
Здравствуйте, DTF, Вы писали:
DTF>как организовать сервер телефонии, чтобы пользователи могли использовать стороние приложения?
хмхм
приходят в голову хаки типа слать месседж через мессенджер (телеграм, вотсап, неважно), где писать "вам звонит Вася, вот ссылка: ", по ссылке открывать приложение со звонком.
DTF>Неужели никак, и каждый подобный сервис должен иметь свое приложение?
Вроде так, да.
Ну или third-party приложение должно иметь свой сервер-прокладку, которому надо слать пуши, а уж он-то будет слать пуши в гугл.
Потому что что для Apple, что Google считается что разработчик владеет и клиентским приложением, и сервером к нему.
D>Проблему я понял, и в общем случае она решения не имеет, увы, гримасы опенсорса.
А причем здесь opensource? В случае закрытых исходников ничего не поменялось бы.
Я бы сказал, что наоборот в случае opensource появляются варианты решения задачи, хотя и весьма не user-friendly.
Вот например инструкция для nfty.sh (a simple HTTP-based pub-sub notification service) https://docs.ntfy.sh/config/#firebase-fcm
Среди прочего требуется Firebase account и собрать кастомный APK
D>приходят в голову хаки типа слать месседж через мессенджер (телеграм, вотсап, неважно), где писать D>"вам звонит Вася, вот ссылка: ", по ссылке открывать приложение со звонком.
Telegram has stated in its FAQ section that:
We currently have two types of notifications on Android: Google's Messaging cloud (GCM) and our own custom notification service that is independent of Google.
Note that Google Notifications (GCM) may not work on some Android devices. Telegram notification service is reliable, but requires more battery resources.
This consumption is not high and should not be, so please report any heavy battery consumption immediately.