Равиль Зарипов (ZuBy)

[Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]

В теме 65 сообщений

Для kinvey только нужен ключ сервера и идентификатор отправителя. Все это получаем из статьи...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заработало! Забыла присвоить в инспекторе объектов одно из свойств компонента kinvey...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, пожалуйста на тарифе free kinvey я могу использовать если не больше 1000 пушей в месяц на один проект?

Это тут написано, но не до конца понятно, какие еще ограничения free kinvey .

https://www.kinvey.com/wp-content/uploads/2016/11/Kinvey-Pricing-112016-2.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата

Active users of the app. Note a user is active for the month if the app made at least one request for the user during that month.

Это количество запросов к сервису.если 200 пользователей сделают по 5 запросов,все,лимит исчерпан.Например запрос авторизации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я планирую раз в неделю посылать пуш из панели kinvey и все, больше ничего от kinvey мне не надо. Значит в месяц я шлю 4 пуша. Значит в моем распоряжении 250 пользователей? 4*250=1000. Правильно?

 

Изменено пользователем Ingalime

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне тоже не понятно - сколько можно пушей в месяц на free тарифе kinvey для одного приложения в месяц? Гуру растолкуйте таблицу цен. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При отправке пуша из консоли kinvey,API Calls (обращение к API сервиса) не защитывается,что правильно,ведь запроса от пользователя мы не получаем.То есть,теоретически,вы имеете "безлимитку" на пуши. Все таки Kinvey это не совсем "про пуши",сервис имеет гораздо больше функций и применений,а пуши это можно сказать бонус.Если пользоваться чисто пушами,то единственный запрос от пользователя будет приходить при первом запуске приложения,для получения пары ID/токен.Так что вариант с Kinvey,особенно при небольшом количестве пользователей,имеет право на существование).Но и тут не все так гладко.Kitty в соседней теме описала про дублирование уведомлений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо!

Теперь понятно, что если победить дубляж уведомлений, то для бизнеса с 1000 пушей в месяц, kinvey отличный выбор. Не даром ембаркадеро сделало для этого сервиса отдельный компонент...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Со статьей не удалось разобраться - не хватает знаний... :(

У kinvey проблема с дубляжами. 

Вот тут написано, что студия поддерживает сервис App42: 

App42 ссылка

Однако в Берлине нет компонентов для App42. Значит уже не поддерживаеться App42?

Просто в  App42 аж миллион пушей в месяц: Тарифы ссылка

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил тестовый проект и серверную часть, статью по ссылке обновил

https://github.com/rzaripov1990/PUSHTestFCM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бинго!

Похоже счастье наступило! И вопрос с Вашего позволения...

Нужно ли делать проверку на наличие интернета и если да то куда лучше вставить код проверки? В PushServiceRegister???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 минут назад, Ingalime сказал:

Бинго!

Похоже счастье наступило! И вопрос с Вашего позволения...

Нужно ли делать проверку на наличие интернета и если да то куда лучше вставить код проверки? В PushServiceRegister???

да в PushServiceRegister, т.к. без интернета у вас не будет токена

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Не могу понять, откуда нужно взять значение свойства AndroidPush.GCMAppID компонента KinveyProvider ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
46 минут назад, erden1 сказал:

Здравствуйте! Не могу понять, откуда нужно взять значение свойства AndroidPush.GCMAppID компонента KinveyProvider ?

читаем внимательно, kinvey тут не используется

http://blog.rzaripov.kz/2017/02/firebase-android-ios.html

http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, пожалуйста, в чем может быть дело? В базе вижу одну запись.

Отправила пуш в строке браузера ({"status":"OK"}) и код ниже почему-то отработал два раза и я получила два одинаковых друг за другом ShowMessage? :o

void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
	TPushServiceNotification* const ANotification)
{

 const String FCMSignature = L"gcm.notification.body";
 const String GCMSignature = L"message";
 const String APNsSignature = L"alert";
 String aText = "";
 TJSONValue * aObj;

	#if defined(__ANDROID__)
		aObj = ANotification->DataObject->GetValue(GCMSignature);
		if(aObj != NULL)
		   {
			aText = aObj->Value();
		   }
		   else
			  {
			   aText = ANotification->DataObject->GetValue(FCMSignature)->Value();
              }
	#endif

	#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
	  aObj = ANotification->DataObject->GetValue(APNsSignature);
	  if (aObj != NULL)
	   {
		aText = aObj->Value();
	   }
     #endif

 ShowMessage(aText);

}

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

Изменено пользователем Kitty

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если при открытом приложение срабатывает два раза OnReceiveNotificationEvent, может заменить ShowMessage тоже на сообщение в шторку? Вторая сработка чистит первую и со стороны вроде работает для пользователя:

void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
	TPushServiceNotification* const ANotification)
{

 ClearAllNotification();

 const String FCMSignature = L"gcm.notification.body";
 const String GCMSignature = L"message";
 const String APNsSignature = L"alert";
 String aText = "";
 TJSONValue * aObj;

	#if defined(__ANDROID__)
		aObj = ANotification->DataObject->GetValue(GCMSignature);
		if(aObj != NULL)
		   {
			aText = aObj->Value();
		   }
		   else
			  {
			   aText = ANotification->DataObject->GetValue(FCMSignature)->Value();
              }
	#endif

	#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
	  aObj = ANotification->DataObject->GetValue(APNsSignature);
	  if (aObj != NULL)
	   {
		aText = aObj->Value();
	   }
     #endif

 //ShowMessage(aText);

 //шлем Notification
 if (NotificationCenter1->Supported() && aText != "")
  {
   TNotification * myNotification = NotificationCenter1->CreateNotification();

	__try
	{
     NotificationCenter1->CancelAll();
	 myNotification->AlertBody = aText;
	 NotificationCenter1->PresentNotification(myNotification);
	}
	__finally
			{
			 myNotification->DisposeOf();
			}
  }

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не получается перенос строк в пуш уведомлении. Сделала как в последнем посте темы:

перенос строк

А строки в этом проекте не переносятся.

А еще вопрос, можно послать пуш без заголовка?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Kitty сказал:

Что-то не получается перенос строк в пуш уведомлении. Сделала как в последнем посте темы:

перенос строк

А строки в этом проекте не переносятся.

а что конкретно сделала? подключила fmx.jar?

 

2 минуты назад, Kitty сказал:

А еще вопрос, можно послать пуш без заголовка?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Равиль Зарипов (ZuBy) сказал:

а что конкретно сделала? подключила fmx.jar?

 

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

А как правильно сформировать ссылку?

{"status":"ERROR","text":"Параметр `title` не передан"}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

файл api.php

} elseif ($method == "sendPush") {
	# если параметры не переданы, то отдаем ошибку
	# if (empty($title)) msgErr("Параметр `title` не передан"); // убрать
	if (!isset($title)) $title = ''; // вставить
	...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а чтобы не править файлы, можно было отправить в title название приложения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удалось разбить перенос строк в уведомлении. Однако теперь заголовок игнорируется и выводиться всегда название приложения. Так и должно быть? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем все нормально и заголовок и перенос текста работает. Видимо один раз был сбой, но это совсем не проблема.

Спасибо за статью! Все работает и пуши живут теперь и в билдере. :D

P.S.

На будущее по возможности напишите понятную статью, а как обойти ограничение на 1000 пользователей. :)

А так все работает. Только отменила ShowMessage(aText) на посылку Notification, а то два подряд ShowMessage не очень. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И снова наш любимый ios для домохозяек...:)
Нормально запустить дебаг не получается так как все время: Session ended
Однако с помощью лейбл имеем такое:

FDeviceToken = FPushService->DeviceTokenValue[TPushService_TDeviceTokenNames_DeviceToken];
//добавлено для теста
Label1->Text = L"Что тут? " + FDeviceToken;
и видим что FDeviceToken пустой.

Куда копать? Спасибо.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
    • От Виталий Иванов
      Ошибка при запуске программы на отладку:
       
      "
      Can't open socket: Permission denied 
      Exiting
      .
      "
       
      кто знает как побороть ? 
       
      Отладку запускаю на OnePlus3 с Android 8.0.0, драйвера Google USB переустанавливал. 

    • От ra.eremeev
      Добрый день, Уважаемые Форумчане!
       
      Подскажите, пожалуйста, как исключить множественное отображение уведомлений от одного приложения на устройстве?
      Поясню: допустим, приложение находится в фоне или не запущено вовсе. Устройство в течение некоторого времени получает несколько уведомлений для данного приложения.
      В шторке будут отображены все полученные уведомления.
      Хотелось бы, чтобы отображалось только последнее пришедшее (как, например, во всех приложениях. В ВК, например)
      Решается ли вопрос на уровне отправляемого уведомления/настройки приложения или проекта?
      Или требуется писать сервис, который будет в фоне висеть и очищать список пришедших уведомлений, выводя последнее?
    • От dim
      Есть код который работает при смещении карты и получив координаты центра пытаюсь получить адрес по ним.
      procedure TMasterDetailForm.MapView3CameraChanged(Sender: TObject); var myCoordinat: TLocationCoord2D; begin inherited; myCoordinat.Create(MapView3.Location.Latitude,MapView3.Location.longitude); if (int(myCoordinat.Latitude)<>0) then begin //проверяю, что координаты определены if not Assigned(fGeocoder) then begin if Assigned(fGeocoder.Current) then fGeocoder := TGeocoder.Current.Create; if Assigned(fGeocoder) then fGeocoder.OnGeocodeReverse := OnGeocodeReverseEventStart; end; if Assigned(fGeocoder) and not fGeocoder.Geocoding then fGeocoder.GeocodeReverse(myCoordinat); end end; все работало до очередного обновления, а сейчас ругается "java.io.IOException: Service not Available" на fGeocoder.GeocodeReverse(myCoordinat);
      подскажите куда копать
    • От striker
      Всем привет!
      Нужен совет.
      Есть Grid, в нем расписание дня.
      В БД каждая строка это отдельная запись.
      Нужно как-то визуально сделать подобие объединения ячеек в Excel.
      Т.е. нужно занять расписание на 2 часа.
      При этом функционал по событиям для строки "второго часа" должен быть недоступен.
      Может хотя бы границу стирать, т.е. оставлять значение в верхней ячейки, а нижнюю просто не отображать.
      Как это лучше сделать?
      FMX, Windows, Delphi XE6, MySQL
       

    • От x11
      Нет ли у FMX готовой функции для открытия веб-ссылок из приложения?
      А то приходится городить огород с лисапетами и кучей IFDEF.
      В итоге что у меня получилось.
      Для удобства разнес все по разным модулям.
      Модуль для Windiws
      unit uUtilsWindows; interface {$IFDEF MSWINDOWS} uses ShellApi, Variants, Windows, FMX.Types, FMX.Platform.Win; procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle); {$ENDIF} implementation {$IFDEF MSWINDOWS} procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle); begin ShellExecute(FmxHandleToHWND(WindowHandle), 'open', PChar(VarToStr(sURL)), nil, nil, SW_NORMAL); end; {$ENDIF} end.  
      Модуль для Android
      unit uUtilsAndroid; interface {$IFDEF ANDROID} uses FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, AndroidApi.Helpers; procedure AndroidOpenUrl(const sUrl: string); {$ENDIF} implementation {$IFDEF ANDROID} procedure AndroidOpenUrl(const sUrl: string); Var Uri: Jnet_Uri; OpenLinkIntent: JIntent; begin Uri := StrToJURI(sUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);// будем что-то смотреть OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);// смотреть в браузере OpenLinkIntent.setData(Uri);// смотреть эту ссылку SharedActivity.startActivity(OpenLinkIntent);// открываем end; {$ENDIF} end.  
      теперь в основной форме:
      uses ..., ...{$IFDEF ANDROID}, vkbdhelper, uUtilsAndroid{$ENDIF} {$IFDEF MSWINDOWS}, uUtilsWindows {$ENDIF}; ... ... ... procedure TfmEditObject.actOpenUrlExecute(Sender: TObject); begin {$IFDEF ANDROID}AndroidOpenUrl(edMapsCoordUrl.Text);{$ENDIF} {$IFDEF MSWINDOWS}WindowsOpenUrl(edMapsCoordUrl.Text, Self.Handle);{$ENDIF} end;  
      А если добавлять ещё одну платформу, то ещё один модуль понадобится.
      Может есть более правильный вариант, так сказать, дизайна исходного кода?
       
    • От SerhioUser
      Добрый день.
      Как в FMX при перерисовке объекта включить/отключить привязку к вертикальной синхронизации (v-sync) развертки экрана? Есть ли такая возможность в FMX? (В OpenGL и DirectX - есть)
      Например если делаем видео-плеер, то чтобы не было артефактов синхронизация нужна, а если хотим узнать реальный fps - синхронизацию выключаем.
    • От Макс Войтенко
      var Keyboard: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then if TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState then ShowMessage( 'клавиатура открыта' ) else ShowMessage( 'клавиатура скрыта' ); end; ТАК Я на шел для делфи. Но мне нужно для C++
    • От Роман Фил
      Привет Всем уважаемые! 
      Пытаюсь сделать растягивание по содержимому компонента. Как это реализовано в мессенджерах типа WhatsApp если большой текст то растягивает (выделяется) по содержимому большое поле, если короткий то малое. 
        Text2.Text := Memo1.Lines.Strings[4];   text2.Height := canvas.TextHeight(Text2.Text); //по высоте строки меняется т.к. там и есть одна строка в TText просто переносится WordWrap визуально.   text2.Height:=canvas.TextWidth(text2.Text); //  - так чушь  Как это вообще реализовано кто нибудь сталкивался?

    • От Роман Фил
      Привет ребят! Помогите кто знает, попытаюсь доходчиво объяснить - 
      имеется набор компонентов KernowSoftwareFMX - в нем использую TksTableView для вывода данных с Tmemo, в нем так же есть Image.
      В Tmemo с сервера грузится файл txt внутри которого строки с ссылками на изображения вида http://бла-бла/1.png
      Для загрузки использую FMX.Features.Bitmap.Helpers.pas - позволяет по прямой ссылке загружать изображение в TImage.
      что пытаюсь сделать?
      Нужно наполнять список TksTableView с Memo содержащий ссылки и в строках TksTableView - они же ListItem тоже самое что в ListView  и загружать в image каждой строки картинки по ссылкам memo.
       
      AItem.Image.Bitmap := Image4.MultiResBitmap.Bitmaps[1].LoadFromUrl(Memo1.Lines.Strings[i]); - так ругается [DCC Error] untMain.pas(92): E2010 Incompatible types: 'TBitmap' and 'procedure, untyped pointer or untyped parameter' AItem.Image.Bitmap := Image4.Bitmap.LoadFromUrl(Memo1.Lines.Strings[i]); - так тожн не работает Глюк в том что первым делом создаются строки . а потом грузятся по очереди картинки в Image4.
      Как заставить подгружать картинки в  TksTableView?
      Как ожидать хавершения загрузки каждой картинки в Image4 и после создавать AItem.Image.Bitmap?
       
       
       
  • Последние посетители   0 пользователей онлайн

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