Равиль Зарипов (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

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


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

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

?

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


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

?

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

 

promo.jpg

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


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

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

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


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

Просьба проголосовать:

https://quality.embarcadero.com/browse/RSP-17939

Спасибо.

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

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


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

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

 

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


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

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

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

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


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

Может на этом форуме найдется специалист по 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

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


Ссылка на сообщение
Поделиться на другие сайты
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 минут назад, Евгений Корепов сказал:

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

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

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

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


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

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

    • От 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 пользователей онлайн

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