Перейти к содержанию
Fire Monkey от А до Я
  • 0

Вызов приложения из нофитикейшена


Kitty

Вопрос

Судя по всему на C++ Builder решения нет. Расскажите как это решить на Дельфи? Берем компонет TBecon  в его событии входа в зону вызываем  push нотификаешен. Как это организовать как фоновую службу?

Пользователь идет мимо магазина и получает push на спящий телефон... Жмет  на push и запускает наше приложение... Главное это push из фона...

Изменено пользователем Kitty
Ссылка на комментарий
  • Ответы 73
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

Рекомендуемые сообщения

  • 0
Цитата

в магаз только покупатели с телефонами на Android?

У меня нет телефона Apple. Для начала добиться бы от Андроид нужного поведения, потом уже можно ios заняться. :)

Ссылка на комментарий
  • 0
12 минуты назад, Kitty сказал:

У меня нет телефона Apple. Для начала добиться бы от Андроид нужного поведения, потом уже можно ios заняться. :)

попробую  сегодня сделать вроде на ios можно  имитировать работу маячка а на андроид посмотреть как все будет  если что выйдет отпишу

Ссылка на комментарий
  • 0

видяха большая помню была на Embarcadero Youtube про маячки и все такое

т.к. тема мимо меня, то не смотрел подробно.

но общий смысл видимо складывается такой.

маяк будит систему(?) и программу в ней(?). программа стучит на сервер, отправляя свой токен и ID маяка, сервер зная где какой маяк, отправляет PUSH

Ссылка на комментарий
  • 0
Цитата

маяк будит систему(?) и программу в ней(?)

В том то и дело, что этот паразит не будит приложение. :)

Все выглядит так:

1. Кидаю на форму компонент TBeacon. Определяю его события в инспекторе объектов. Например "Привет мир" при входе в зону.

2. Запускаю. Если я в зоне реального маячка, то вижу сразу "Привет мир", если я не в зоне и вхожу в зону, то тоже вижу "Привет мир".

3. Если приложение на переднем плане, то оно продолжает работать и через сутки, короче все работает и при потухшем экране на телефоне если приложение на переднем плане.

4. Если свернуть приложение, то как и писали выше, оно перестает реагировать спустя определенное время.

У компонента TBeacon есть свойство BeaconDeathTime=20, но что это такое не ясно (в справке ничего нет)...

Изменено пользователем Kitty
Ссылка на комментарий
  • 0

А как мне поможет сервис? Приложение с компонентом TBeacon при запуске напоминает включить блютуз. Поэтому предполагаю, что в сервисе вообще нельзя использовать TBeacon.  Идеальный вариант такой - пользователь входит в зону, сервис это видит и запускает основное приложение. Для "видиния" зоны используется компонент TBeacon. Но если его засунуть в сервис и блютуз не включён, то служба, я думаю, работать не будет...

Ссылка на комментарий
  • 0
5 минут назад, Kitty сказал:

А как мне поможет сервис? Приложение с компонентом TBeacon при запуске напоминает включить блютуз. Поэтому предполагаю, что в сервисе вообще нельзя использовать TBeacon.  Идеальный вариант такой - пользователь входит в зону, сервис это видит и запускает основное приложение. Для "видиния" зоны используется компонент TBeacon. Но если его засунуть в сервис и блютуз не включён, то служба, я думаю, работать не будет...

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

Изменено пользователем master webs
Ссылка на комментарий
  • 0

Попробуйте поэкспериментировать с  "Project options -- Version info -- persistent=true", как уже сказал уважаемый krapotkin. Сделайте приложение пустышку которое будет раз в N секунд отсылать запрос на сервер. Чем черт не шутит, может этот вариант подойдет. Я вам безвоздмездно предоставляю api на одном из своих хостингов, на одном из не используемом домене:

http://kayfolom.ru/?cmd=[write|read]&api_key=[api_key]&message=[message]

cmd - write пишем, read читаем

api_key - произвольная строка до 40 символов, идентифицирующая проект, к примеру "kasjlqw4q4t784" или "My_test_persistent_project", лучше использовать латинские буквы без спецсимволов и пробелов.

message - произвольная строка, на любом языке, в кодировке utf8. Максимальная длина 255 символов.

Пример использования:

В своем приложении вы делаете так

procedure LogToServer(AMessage, AAPIKey : String);
Var Query : String;
    HTTPClient: THTTPClient;
begin
  Query:='http://kayfolom.ru/?cmd=write&api_key='+AAPIKey+'&message='+AMessage;
  HTTPClient:=THTTPClient.Create;
  HTTPClient.Get(Query);
  FreeAndNil(HTTPClient);
end;

LogToServer('Я еще живой, не дождетесь!', '7imq4rcq7rcqm7q3');

Потом в браузере открываете ссылку http://kayfolom.ru/?cmd=read&api_key=7imq4rcq7rcqm7q3 и видите примерно следующее:

2016-06-23 11:19:40	195.22.104.78	Я еще живой, не дождетесь!
2016-06-23 11:19:26	195.22.104.78	Я еще живой, не дождетесь!
2016-06-23 11:19:25	195.22.104.78	Я еще живой, не дождетесь!
2016-06-23 11:19:20	195.22.104.78	Я еще живой, не дождетесь!
{ "status" : "ok" }

Сможете мониторить время и с какого IP прислано сообщение. Результатами эксперимента поделитесь. У меня вот XE8, сервисы там отсутствуют, а задумки есть интересные.

P.S. Если кому нужно, пользуйтесь этой штукой на здоровье. Только не злоупотребляйте. Несколько запросов с секунду это нормально, а тысячи запросов в секунду вынудят меня прикрыть лавочку :-) Если нужно, прикручу команду очистки истории.

Ссылка на комментарий
  • 0

да тут ясно, что все так. Если вся твоя клиентура на яблоках, нет смысла писать на вишню. я про цикл разработки. а он точно проще. 

присмотритесь по хронологии форума. все делают на андроид, а потом включают кроссплатформенную магию))

кстати айфон 4 больше не вариант,  делфи не может собрать программу менее чем для IOS 8.0

Ссылка на комментарий
  • 0
14 минуты назад, Евгений Корепов сказал:

P.S. Если кому нужно, пользуйтесь этой штукой на здоровье

Лучше лог разбейте по частям и в джейсон все это дело. Типа такого:

{
	"status": "ok",
	"logs": [{
		"date": "2016-06-23",
		"time": "11:19:40",
		"IP": "195.22.104.78",
		"Message": "Я еще живой, не дождетесь!"
	},
	{
		"date": "2016-06-23",
		"time": "11:19:40",
		"IP": "195.22.104.78",
		"Message": "Я еще живой, не дождетесь!"
	}]
}

Что бы можно было результат сразу в JSON парсер загонять

Изменено пользователем Сысоев Максим
Ссылка на комментарий
  • 0

По порядку:


1. Сервис поможет работать с датчиками, не запуская приложение, если это нужно делать скрыто без участия пользователя. Даже, если приложение выгружено из памяти, сервис обработает нужные сообщения с датчиков и сети (если нужно PUSH с сервера получить). Ну это все выше обсудили вроде.

2. Другой вариант, прописать в Manifest BroadCastReceiver, слушать события типа (TJBluetoothDevice.JavaClass.ACTION_FOUND or TJBluetoothAdapter.JavaClass.ACTION_SCAN_MODE_CHANGED, могу ошибаться с BLE не работал). Приложение само будет запускаться (не открываться основная активити, а запускаться в памяти), когда система будет отлавливать эти события и передавать приложению. Вот только не уверен, что система их будет ловить, если датчик BLE ни какое приложение не будоражит, и он уснет. Я бы делал первый пункт и второй вместе.

3. Программно включать и выключать BlueTooth не есть хороший тон с точки зрения безопасности, если Гугл это еще не закрыли, то наверное закроют через время. Но в целом, это этическая сторона, а как это делается технически, можно посмотреть здесь.

4. Если у вас есть модуль «Embarcadero\Studio\18.0\source\rtl\net\System.Bluetooth», то в нем есть все, что нужно для работы с BLE. Осталось разобраться, как обрабатывать сообщения на ваших устройствах iOS или Android, как сделать так, чтобы датчики не спали и читали входящие и т.п.

5. В Tools→Getit PM есть компоненты Beacon Fence (BeaconZonesFencing, BeaconMapFencing). Кто-нибудь их смотрел? Судя по описанию, они решают задачу собственно технологии Beacon Fence. Очень интересно узнать, что в итоге получится у Kitty или кого-то еще из этого коллективного обсуждения.

 

Ссылка на комментарий
  • 1
52 минуты назад, Сысоев Максим сказал:

Лучше лог разбейте по частям и в джейсон все это дело. Типа такого:


{
	"status": "ok",
	"logs": [{
		"date": "2016-06-23",
		"time": "11:19:40",
		"IP": "195.22.104.78",
		"Message": "Я еще живой, не дождетесь!"
	},
	{
		"date": "2016-06-23",
		"time": "11:19:40",
		"IP": "195.22.104.78",
		"Message": "Я еще живой, не дождетесь!"
	}]
}

Что бы можно было результат сразу в JSON парсер загонять

Хорошая идея! Добавил не обязательный параметр output_format, если он равен json, то выводится в json:

http://kayfolom.ru/?cmd=read&api_key=7imq4rcq7rcqm7q3&output_format=json

{
    "status": "ok",
    "logs": [
        {
            "datetime": "2016-06-23 11:19:40",
            "datetime_unix": "1466669980",
            "ip": "195.22.104.78",
            "message": "Я еще живой, не дождетесь!"
        },
        {
            "datetime": "2016-06-23 11:19:26",
            "datetime_unix": "1466669966",
            "ip": "195.22.104.78",
            "message": "Я еще живой, не дождетесь!"
        },
        {
            "datetime": "2016-06-23 11:19:25",
            "datetime_unix": "1466669965",
            "ip": "195.22.104.78",
            "message": "Я еще живой, не дождетесь!"
        },
        {
            "datetime": "2016-06-23 11:19:20",
            "datetime_unix": "1466669960",
            "ip": "195.22.104.78",
            "message": "Я еще живой, не дождетесь!"
        }
    ]
}

 

Ссылка на комментарий
  • 0
14 минуты назад, Евгений Корепов сказал:

не обязательный параметр output_format, если он равен json, то выводится в json:

более правильно читать HTTP заголовок Accept и если там application/json ...

хотя, нет. ответа же нет...

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

Не удержался и написал сам приложение для теста Persistent.

Приложение пишет раз в минуту, после этот пишет 5 раз с интервалом в 1 секунду.

Приложение запустил, нажал кнопку Home дабы свернуть его. Cледить за процессом можно здесь http://kayfolom.ru/?cmd=read&api_key=Persistent_test01, или в json формате здесь http://kayfolom.ru/?cmd=read&api_key=Persistent_test01&output_format=json

Делаем ставки господа и дамы! ;-)

P.S. Эксперимент не удался. После нескольких тестов выяснилось что запросы перестают приходить даже если приложение на переднем фоне и телефон блокируется по таймауту. Нажатие Хоме, тоже останавливает приложение. Даже если выбрать приложение из списка запущенных, таймеры не просыпаются до тех пор, пока не ткнеш на какой либо элемент управления (кнопку к примеру).Оставляю приложение в фоне, в надежде понять логику режима Persistent.

Ссылка на комментарий
  • 0
6 минут назад, krapotkin сказал:

а если добавить для андроида

uses Android.JNI.PowerManager;

...

AcquireWakeLock()

«A wake lock is a mechanism to indicate that your application needs to have the device stay on»

Понимаю, такое использовать в играх, видео плеерах. А для по сути сервисов запрещать телефону спать не хорошо, нет?

UPD:

Хотя, вот после прочтения статьи Keeping the Device Awake понятнее становится.

Изменено пользователем Pax Beach
Ссылка на комментарий
  • 0

Интервал из 1 минуты превращается в десять. Правда пока я курил и листал новости на телефоне (с 2016-06-23 14:27:35) запросы опять вернулись на минутный интервал. Приложение на передний план с начала эксперимента не выводил. 

Как вообще работает TTimer Delphi на андроиде? Может есть возможность задействовать некий аппаратный таймер? Есть что то такое?

Ссылка на комментарий
  • 0

Большое спасибо всем за интересное обсуждение этой новой технологии!

Цитата

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

Вот это и является для меня сложным - понять как при входе в зону, телефон сам видя это и понимая это, начинает стучать на сервер... Вот статью бы на эту тему. :)

 

Цитата

Попробуйте поэкспериментировать с  "Project options -- Version info -- persistent=true"

Я пробовала. Вроде изменений не заметила. Где-то читала, что это для служб надо устанавливать.

 

Цитата

В Tools→Getit PM есть компоненты Beacon Fence (BeaconZonesFencing, BeaconMapFencing).

Я их скачала. Судя из видео они для создания пользовательских зон.
http://www.fmxexpress.com/visually-design-zones-and-maps-using-beacon-fence-solution-for-delphi-xe8-firemonkey/

 

Видeо Байрама не много устарело. Он там говорит, что с этой технологией проблемы у андроида. Но сейчас все эти проблемы разрешены.
Я заинтересовалась этой технологией насмотревшись видео Кульгина. Он штампует видео про iBeacon как пирожки. :)

Сегодня новое выпустил

Кстати Berlin и его компонент TBeacon поддерживает и стандарт Eddystone.

Изменено пользователем Kitty
Ссылка на комментарий
  • 0
10 минут назад, Евгений Корепов сказал:

Интервал из 1 минуты превращается в десять. Правда пока я курил и листал новости на телефоне (с 2016-06-23 14:27:35) запросы опять вернулись на минутный интервал. Приложение на передний план с начала эксперимента не выводил. 

Как вообще работает TTimer Delphi на андроиде? Может есть возможность задействовать некий аппаратный таймер? Есть что то такое?

 

Ссылка на комментарий
  • 0

Вариант с Posix-таймером, показывает еще более худшие результаты :-(

Видимо на Persistent можно забить. Нужно писать сервис. Где только взять 80k рублей на апгрейд с XE8 до последней версии.

Ссылка на комментарий
  • 0
  • Модераторы

Я же писал, что приложение, рано или поздно будет убито. Для длительных операций только сервис!

Есть несколько известных мне вариантов, заставить приложение (без сервиса) дольше висеть в памяти:

1) Приложение на переднем плане с отключением блокировки экрана (сна устройства) (Так пишут игры)

2) Вывести постоянный нотификейшен на устройстве, пока он весит, приоритет у приложения повышен

 

По поводу ловли событий "бекона" в фоне или вообще не запущенном приложении.

Попробуйте разобраться, как такое реализовано в библиотеке Android Beacon Library.

Ап.

Судя по всему, всё завязано на BroadcastReceiver и сервисах:

<receiver android:name="org.altbeacon.beacon.startup.StartupBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>

</receiver> 

 

15 часов назад, Kitty сказал:

Нажимаю с удержанием кнопку на телефоне и вижу какие приложения у меня в фоне на заднем плане. Например на скриншоте вижу, что запущен хром.

Зажимая кнопку, вы видите список последних запущенных приложений. Т.е. какие-то приложения могут работать и в фоне, в момент просмотра списка, а другие уже будут выгружены из памяти.

Ссылка на комментарий
  • 0
  • Модераторы

 

13 часа назад, Kitty сказал:

А как мне поможет сервис? Приложение с компонентом TBeacon при запуске напоминает включить блютуз. Поэтому предполагаю, что в сервисе вообще нельзя использовать TBeacon.  Идеальный вариант такой - пользователь входит в зону, сервис это видит и запускает основное приложение. Для "видиния" зоны используется компонент TBeacon. Но если его засунуть в сервис и блютуз не включён, то служба, я думаю, работать не будет...

В общем, копался тут в исходниках (по другому вопросу), а потом забрёл в семплы и ... iBeacon в сервисе возможен, как оказалось есть даже пример C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\AndroidBeaconServiceDemo.

Видимо, вам остаётся только ждать, когда добавят сервисы в C++, либо попробовать переписать всё на Delphi.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...