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

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

65 сообщений в этой теме

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

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

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

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

 

 

 

Китти, сори за off top, но, мне кажется, ты бы обошлась меньшей кровью, если бы уже перешла на дельфи))).

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


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

Китти, сори за off top, но, мне кажется, ты бы обошлась меньшей кровью, если бы уже перешла на дельфи))).

А зачем? Все работает и на С++. Был баг. Его решили. Равиль помог определить и суппорт быстро решил. А что в делфи багов нет? Из-за бага менять язык? Нет.

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


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

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

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

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

0) то что в первой статье указано для IOS все сделала?

1) на чем тест проводишь?

2) CFBundleIdentifier в Version Info идентичен названию пакета в консоли?

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


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

Вроде все сделал как надо. Тестирую на стенде где было собрано давно нормальное приложение. Теперь добавляю приложение с пушами... и не работает...

Теперь или баг С++ Builder или моя тупость при работе с ios...

123.jpg

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


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

?

Вроде все верно. Наверное что-то еще упустила... :(

 

promo.jpg

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


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

В iOS проекте Project > Options > Entitlement List нет Receive Push Notification.
Может нужен какой-то доп. ключ добавить в Version info проекта? Спасибо.

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


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

Равиль Зарипов, подскажите, пожалуйста, что надо изменить в php сервере, чтобы обойти ограничение на 1000 устройств?

 

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

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


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

Равиль Зарипов, подскажите, пожалуйста, что надо изменить в php сервере, чтобы обойти ограничение на 1000 устройств?

ну думаю изменить нужно код, а что именно поменять это решение не для этого форума. вам нужно обратиться на форум по php

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

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


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

Может на этом форуме найдется специалист по PHP чтобы снять ограничение на 1000 устройств? Просто тут многие занимались пушами.

Евгений Корепов, предлагал свой вариант, но как его адаптировать и правильно интегрировать в сервер из блога Равиля?

function SendGCMMessagesPacket($apiKey, $DevicesTokenArray, $message, $title, $DBLink, $TableName, $MyLog_GCM_file) {
	if (count($DevicesTokenArray)==0) {
		MyLog($MyLog_GCM_file, "Count Devices Token Array is 0, skip sending");
		return(0);
	}
	$Count_Success = 0;
	$DeviceCountMax = 1000;
	$DeviceCountIndex = 0; 
	$DevicesTokenPacketArray = array();
	$gcpm = new GCMPushMessage($apiKey);
	while ($DeviceCountIndex<=count($DevicesTokenArray)) {
		$DevicesTokenPacketArray = array_slice($DevicesTokenArray, $DeviceCountIndex, $DeviceCountMax);
		MyLog($MyLog_GCM_file, "Packet send: start index $DeviceCountIndex,  count ".count($DevicesTokenPacketArray));
		$gcpm->setDevices($DevicesTokenPacketArray);
		$ResponceJSON = $gcpm->send($message, array('title' => $title));
		$Count_Success = $Count_Success + AnalyzeResponse($DevicesTokenPacketArray, $ResponceJSON, $DBLink, $TableName, $MyLog_GCM_file);
		MyLog($MyLog_GCM_file, $ResponceJSON);
		$DeviceCountIndex = $DeviceCountIndex + $DeviceCountMax;			
//		sleep(1);
	}
	return($Count_Success);	
}

 

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


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

Очень много говориться, что снять ограничение на 1000 устройств это раз плюнуть, ну пару строк кода...

Все это не соотвествует действительности и никто не может предоставить решение. Одни общие фразы. Кто нибудь может показать php сервер для пушей для нормального использования свыше 1000 пушей?

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


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

Очень много говориться, что снять ограничение на 1000 устройств это раз плюнуть, ну пару строк кода...

Все это не соотвествует действительности и никто не может предоставить решение. Одни общие фразы. Кто нибудь может показать php сервер для пушей для нормального использования свыше 1000 пушей?

я уже писал, это форум не по php. Вам не сюда, покажите свой сервер на пхп-форуме и вам помогут.

в следующий раз буду удалять такие посты

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


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

Равиль, сразу извиняюсь, готов понести наказание, но запощу решение. 

Как уже говорил все просто, если у вас 4345 сообщений, то делим массив токенов и отправляем 4 раза по 1000, и один раз 345. Не забывайте что вы программисты, и во всех языках программирования это делается одинаково просто. Вот код, писал прямо в гитхабе, естественно не проверял, если что то упустил, прошу прощения (а упустил я анализ результата).

function pushSendOver1000($title, $text, $tokens, $server_key) {
	$Count_Success = 0;
	$DeviceCountMax = 1000;
	$DeviceCountIndex = 0; 
	$DevicesTokenPacketArray = array();	
	while ($DeviceCountIndex<=count($tokens)) {
		$DevicesTokenPacketArray = array_slice($tokens, $DeviceCountIndex, $DeviceCountMax);
		pushSend($title, $text, $DevicesTokenPacketArray, $server_key);
		$DeviceCountIndex = $DeviceCountIndex + $DeviceCountMax;			
	}	
}

Запостил также на гитхаб. Можете ручками добавить функцию в конец https://github.com/rzaripov1990/PUSHTestFCM/blob/master/pushTest/push.php и соответственно вызывать не pushSend, а pushSendOver1000

Vitaldj, Rusland, Kitty и 1 другому понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
23 минуты назад, Евгений Корепов сказал:

Равиль, сразу извиняюсь, готов понести наказание, но запощу решение. 

Как уже говорил все просто, если у вас 4345 сообщений, то делим массив токенов и отправляем 4 раза по 1000, и один раз 345. Не забывайте что вы программисты, и во всех языках программирования это делается одинаково просто. Вот код, писал прямо в гитхабе, естественно не проверял, если что то упустил, прошу прощения (а упустил я анализ результата).


function pushSendOver1000($title, $text, $tokens, $server_key) {
	$Count_Success = 0;
	$DeviceCountMax = 1000;
	$DeviceCountIndex = 0; 
	$DevicesTokenPacketArray = array();	
	while ($DeviceCountIndex<=count($tokens)) {
		$DevicesTokenPacketArray = array_slice($tokens, $DeviceCountIndex, $DeviceCountMax);
		pushSend($title, $text, $DevicesTokenPacketArray, $server_key);
		$DeviceCountIndex = $DeviceCountIndex + $DeviceCountMax;			
	}	
}

Запостил также на гитхаб. Можете ручками добавить функцию в конец https://github.com/rzaripov1990/PUSHTestFCM/blob/master/pushTest/push.php и соответственно вызывать не pushSend, а pushSendOver1000

одобрил запрос, но не тестировал) 

26 минут назад, Евгений Корепов сказал:

Не забывайте что вы программисты, и во всех языках программирования это делается одинаково просто

этого не донести, им нужно на блюдичке

Тему закрываю

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


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

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

    • Автор: Макс Войтенко
      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 пользователей

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