Равиль Зарипов (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 запросов,все,лимит исчерпан.Например запрос авторизации.

Rusland и Ingalime понравилось это

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


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

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

 

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

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


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

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

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


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

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

Rusland, Kitty и Равиль Зарипов (ZuBy) понравилось это

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


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

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

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

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


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

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

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

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

App42 ссылка

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

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

 

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


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

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

https://github.com/rzaripov1990/PUSHTestFCM

Евгений Корепов, Rusland и Kitty понравилось это

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


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

Бинго!

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

Нужно ли делать проверку на наличие интернета и если да то куда лучше вставить код проверки? В 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

Kitty понравилось это

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


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

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

Отправила пуш в строке браузера ({"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 сказал:

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

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

Kitty понравилось это

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


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

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

 

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

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

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

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


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

файл api.php

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

 

Kitty понравилось это

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


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

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

Kitty понравилось это

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


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

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

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


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

А сейчас заголовок нормально пришел...

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


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

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

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

P.S.

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

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

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


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

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

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

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

 

 

 

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


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

  • Похожие публикации

    • Автор: Макс Войтенко
      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?
       
       
       
    • Автор: Роман Фил
      Всем привет пытаюсь грузить файлы изображения с телефона Android на сервер методом post запроса. Для этого один из параметров запроса должен содержать полный путь к файлу. В ActionList есть стандартная опция TakePhotoFromLibraryAction - к с нее выдрать путь??? Куда он ей передается и передается ли вообще? я и справки толком не нахожу или я слепой?
       
      imgfile.Text:=TakePhotoFromLibraryAction1.????  
    • Автор: Rusland
      Приложение свернуто или закрыто.
      Отправляю один пуш, на телефоне в шторке появляется уведомление.
      Отправляю еще один, появляется второе уведомление и так далее. Сколько пушей, столько и уведомлений.
      Как сделать чтобы все уведомления собирались в одном уведомлении в шторке? (как делают telegram, whatsapp и т. п.)
    • Автор: Роман Фил
      Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 
      Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.
      Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)
      Раньше код ниже работал сейчас нет не пойму что не так. Почему стал ковырять? потому что форма встает колом при загрузке изображений.
       
      var s: string; fs: TFileStream; begin fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'), fmCreate); NetHTTPClient1.Get((Sender as TImage).Hint, fs); fs.Free; (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg')); подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl ((Sender as TImage).Hint); как проще сделать посоветуете чтоб и грузилось и форма не висла?
    • Автор: Роман Фил
      ПРивет, есть ли возможность узнать как то номер сроки в memo на delphi FMX в memo при нажатии на текст в поле memo?

      для windows на vlc можно memo.CaretPos.Y либо через WinAPi заголовки. Как такое делать в FireMonkey FMX для андроид ума не приложу. Может кто делал, поделится опытом?
    • Автор: Роман Фил
      Привет ребята! Вобщем есть текст в Memo с которого нужно брать строки с конца файла т.е. memo.lines.count-1 в цикле, 
      после этого создавая отельно динамически компоненты,  заносить текстовые  строки с memo в эти созданные динамически компоненты, ниже пример:
      procedure TVKBaseForm.Button2Click(Sender: TObject); var rec: TRectangle; txt: Ttext; i: word; // - можно и integer сути не поменяет begin for i := Memo1.Lines.Count - 1 downto 0 do begin rec := TRectangle.Create(Self); rec.Parent := MainLayout1; rec.Height := 15; rec.Align := TAlignLayout.Top; txt := Ttext.Create(Self); txt.Parent := rec; txt.Align := TAlignLayout.Client; txt.Text := Memo1.Lines.Strings[i]; end; end; Работает, но не правильно. Почему выдает не правильный порядок при выводе? почему создает сначала первый файл? Почему создает не все? Может есть какая-то синхронизация? 
      Пробовал так же
      A: integer; begin A := 1; // Присваеваем единицу While A <> Memo1.Lines.Count - 1 do begin A := A + 1; s := Memo1.Lines.Strings[A]; Application.ProcessMessages; rec := TRectangle.Create(Self); rec.Parent := MainLayout1; rec.Height := 15; rec.Align := TAlignLayout.Top; txt := Ttext.Create(Self); txt.Parent := rec; txt.Align := TAlignLayout.Client; txt.Text := s; Помогите разобраться
    • Автор: Роман Фил
      Доброе время суток .
      Я только начал знакомится с потоками , не судите меня строго .
      Вот код . Смысл которого через отдельный поток загружать текст с сервера и отображать в memo. Что я делаю? На сервере из вне имеется файлкоторый по api запросам пополняется. Его нужно в потоке постоянно выводить в memo. подгружать каждый раз. При использовании на win вес работает, на андроид не качает и не сздает файл в чем может быть проблема?
      type ThreadHTTP = class(TThread) private public Stream: TMemoryStream; i: integer; procedure Execute; override; procedure ShowResult; end; {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := true; end; procedure TForm1.Timer1Timer(Sender: TObject); var MyHTTP: ThreadHTTP; begin ProgressBar1.Value := 0; MyHTTP := ThreadHTTP.Create(False); end; { ThreadHTTP } procedure ThreadHTTP.Execute; var j: integer; begin inherited; i := 0; j := 0; Stream := TMemoryStream.Create; Form1.IdHTTP1.Get('http://сайт/base.txt', Stream); Form1.ProgressBar1.Max := Stream.Size; while j <= Stream.Size do begin inc(i); Synchronize(ShowResult); inc(j); Form1.ProgressBar1.Value := Form1.ProgressBar1.Value + 1; end; Stream.SaveToFile(tpath.getdownloadspath + '/base.txt'); Form1.Memo1.Lines.LoadFromFile(tpath.getdownloadspath + '/base.txt'); Stream.Free; end; procedure ThreadHTTP.ShowResult; begin Form1.Label1.Text := IntToStr(i) + ' kbs'; end;  
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу