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

Лидеры

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

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

    Модераторы


    • Баллы

      2

    • Постов

      2 517


  2. ENERGY

    ENERGY

    Пользователи


    • Баллы

      2

    • Постов

      568


  3. AngryOwl

    AngryOwl

    Пользователи


    • Баллы

      1

    • Постов

      394


  4. Anasazi

    Anasazi

    Пользователи


    • Баллы

      1

    • Постов

      65


Популярный контент

Показан контент с высокой репутацией 22.08.2017 во всех областях

  1. Привет Всем! vkbdhelper.pas Давно пользовался vkbdhelper'ом, но он был только для андроида. руки добрались и до этого, теперь его можно использовать и на IOS изменения * почистил uses секцию * убрал зависимость от платформ (кросс-платформенный) * добавил глобальную переменную VKOffset VKOffset - расстояние между контролом и клавиатурой для тех случаев когда включены подсказки/автозамена и контрол оказывается под доп. панелькой Не все клавиатуры включают доп. панели в свой размер! Например для IOS нужно всегда прибавлять 30-32 пикселя, панель с кнопкой Done перекрывает контрол {$IFDEF IOS} VKOffset := 31; {$ELSE} VKOffset := 0; // на свой вкус // не знаю как определить размер доп. панельки // когда она не входит в размер клавиатуры // и определить есть ли панелька вообще... {$ENDIF} vkbdhelper.zip
    1 балл
  2. Кто просил PHP код, для отправки пушей, без лимита на 1000 токенов за одну отправку. Вот готовый вариант: <?php $server_key = 'AAAAnCw-yKA:APA91bEYphFbq_w...'; $title = 'Title'; $text = 'test'; $limit = 999; $field_name = 'DeviceToken'; $sql = mysqli_connect("mysqlserver.com", "DBName", "DBPassword"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $offset = 0; while (true) { $query = "SELECT $field_name FROM `DBName`.`TableName` LIMIT $limit OFFSET $offset"; $result = mysqli_query($sql, $query); if (!$result) { die('Invalid query: ' . mysql_error()); } if (mysqli_num_rows($result) == 0) { echo "{\"result\":true}"; exit; } $arr = array(); while ($row = mysqli_fetch_array($result, MYSQL_ASSOC)) { $arr[] = $row["$field_name"]; } pushSend($title, $text, $arr, $server_key); $offset = $offset + $limit; /* free result set */ mysqli_free_result($result); // foreach($arr as $item) { // echo $item, '<br>'; //} //echo '-----------<br>'; } mysqli_close($sql); // max 1000 function pushSend($title, $text, $tokens, $server_key) { $url = 'https://fcm.googleapis.com/fcm/send'; $headers = array('Authorization: key=' . $server_key, 'Content-Type: application/json'); if (is_array($tokens)) $fields['registration_ids'] = $tokens; else $fields['registration_ids'] = array($tokens); $fields['priority'] = 'high'; $fields['notification'] = array('body' => $text, 'title' => $title); $fields['data'] = array('message' => $text, 'title' => $title); $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => json_encode($fields) )); $result = curl_exec($ch); curl_close($ch); return $result; } ?>
    1 балл
  3. @Равиль Зарипов (ZuBy) по поводу вашей статьи: В коде отправлять токен на базу нужно только в событии OnChange , которое срабатывает в момент вызова FPushServiceConnection.Active := true; Если вы отправляете на базу в OnChange, а затем еще и в TFormMain.PushServiceRegister; - то данные отправятся 2 раза. Device ID и Token конечно же будут одинаковые. Т.е. проще говоря после строки FPushServiceConnection.Active := true; не должно идти никакого кода. Я проверил в отладчике на 4 и 5 Android. procedure TFormMain.PushServiceRegister; begin FPushService := nil; FPushServiceConnection := nil; {$IF defined(ANDROID)} FPushService := TPushServiceManager.Instance.GetServiceByName< (TPushService.TServiceNames.GCM); FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey; {$ENDIF} {$IF defined(IOS) AND defined(CPUARM)} FPushService := TPushServiceManager.Instance.GetServiceByName (TPushService.TServiceNames.APS); {$ENDIF} if Assigned(FPushService) then begin FPushServiceConnection := TPushServiceConnection.Create(FPushService); FPushServiceConnection.OnChange := OnServiceConnectionChange; FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent; FPushServiceConnection.Active := true; // ниже код нужно удалить, иначе токен отправится на базу дважды. FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; FDeviceToken := FPushService.DeviceTokenValue [TPushService.TDeviceTokenNames.DeviceToken]; // тут отправляем в хранилище токенов (на сервер с БД например) end; end;
    1 балл
  4. Можете скинуть куда-нибудь файл push.php с внесенными вами изменениями?
    1 балл
  5. Отличная статья! Но добавлю один нюанс - функция function pushSend($title, $text, $tokens, $server_key) реализована не до конца, дело в том что у FCM есть одно ограничение - отправка не больше 1000 токенов за раз. Сам на это напоролся и не мог понять почему части пользователей рассылки не приходят (рассылка велась по регионам России, общее количество около 100 тысяч). Пришлось накидать промежуточную функцию для разбивки на пакеты по 1000 штук: function SendGCMMessagesPacket($apiKey, $DevicesTokenArray, $message, $title, $DBLink, $TableName, $MyLog_GCM_file) { if (count($DevicesTokenArray)==0) { MyLog($MyLog_GCM_file, "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; } return($Count_Success); } Функция AnalyzeResponse анализирует ответ и помечает в базе не зарегистрированные токены как неактивные function AnalyzeResponse($DevicesTokenArray, $ResponceJSON, $DBLink, $TableName, $MyLog_GCM_file) { $Count_Success = 0; $ResponceArray = json_decode($ResponceJSON, true); if (isset($ResponceArray['results'])) { $Index = 0; foreach ($ResponceArray['results'] as $key => $value){ if (isset($value['error'])) { if (isset($DevicesTokenArray[$Index])) { MyLog($MyLog_GCM_file, $DevicesTokenArray[$Index].' : '.$value['error']); $query = "UPDATE $TableName SET Active = 0 WHERE DeviceToken = '$DevicesTokenArray[$Index]'"; $mysql_result = mysqli_query($DBLink, $query); } } else { $Count_Success = $Count_Success + 1; } $Index = $Index + 1; } } return($Count_Success); }
    1 балл
  6. Rusland

    [TPath] Как составлять TPathData?

    Если нужно нарисовать простую фигуру (треугольник, ромб, трапеция итп), то можно самому писать, строя отрезки. Вот для примера треугольник: Обратите внимание на направление оси Y. Координаты точек: A (0,0) B (2,-2) С (2,0) Значит TPathData будет такой: M0,0 L2,-2 L2,0 L0,0 M - Move to L - Line to (в конце возвращаемся в исходную точку) или можно так M0,0 L2,-2 L2,0 Z
    1 балл
  7. Решение ведь простое для тех кто в runtime создаёт компоненты, поместить на форму самим TLayout с именем sVKBHelperLayout и указать Parent у компонентов этот layout
    1 балл
  8. AngryOwl

    [Android] Прозрачность TMemo Delphi XE8

    Отредактировать стиль. Например, добавив новый для "прозрачного" TMemo. Что-то типа такого: object TLayout StyleName = 'memofreestyle' EnableDragHighlight = False Position.X = 280.000000000000000000 Position.Y = 249.000000000000000000 Size.Width = 290.000000000000000000 Size.Height = 175.000000000000000000 Size.PlatformDefault = False Visible = False TabOrder = 97 object TActiveStyleObject StyleName = 'background' Align = Contents EnableDragHighlight = False Size.Width = 290.000000000000000000 Size.Height = 175.000000000000000000 Size.PlatformDefault = False ActiveTrigger = Focused ActiveLink = < item CapInsets.Left = 7.000000000000000000 CapInsets.Top = 7.000000000000000000 CapInsets.Right = 7.000000000000000000 CapInsets.Bottom = 7.000000000000000000 SourceRect.Left = 238.000000000000000000 SourceRect.Top = 86.000000000000000000 SourceRect.Right = 318.000000000000000000 SourceRect.Bottom = 113.000000000000000000 end> SourceLink = <> object TRectangle StyleName = 'Rectangle1' Align = Contents EnableDragHighlight = False Fill.Color = x32000000 HitTest = False Sides = [] Size.Width = 290.000000000000000000 Size.Height = 175.000000000000000000 Size.PlatformDefault = False Stroke.Color = xC8282828 Visible = False end object TLayout StyleName = 'content' Align = Client EnableDragHighlight = False Size.Width = 290.000000000000000000 Size.Height = 175.000000000000000000 Size.PlatformDefault = False end end object TBrushObject StyleName = 'foreground' end object TBrushObject StyleName = 'selection' Brush.Color = x7F67A8D3 end object TFontObject StyleName = 'font' end end
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...