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

juppy

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

    56
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

Сообщения, опубликованные juppy

  1. Есть такая библиотека

    https://github.com/amarildolacerda/KernowSoftwareFMX

    То, что на скриншотах - это компонент ksVirtualListView. 

    Его работа показана в примере https://github.com/amarildolacerda/KernowSoftwareFMX/tree/master/Samples/Action Buttons

    Но мне не понравилось как он работает.

    Там ЭкшнБаттоны не тянутся за свайпом, а сами появляются поняв, что свайп сделан.

    На IOS такое поведение не очень ожидаемо.

    Но в целом работает очень даже миленько.

     

  2. Всем привет!

    Есть приложение, которое по DataSnap в потоке подключается к серверу и тянет с него какие-то данные.

    Все работает хорошо и без сбоев. Но есть нюанс!!!! ???

    Реализация следующая. Сервер SQL база.

     

    MyTread.Execute;

    try

      проверка доступности сервера

    except

        terminate

    end;

     Создание объектов для подключения к серверу

     Выставляем таймаут для TSQLConnection

    try

      открываем ClientDataSet

      читаем полученные данные   

    except

      terminate

    end;

     

    Как бы упрощенно но все понятно.

    Так вот если в момент, когда после открытия ClientDataSet  на мобильном устройстве пропадает связь с сервером, приложение зависает в бесконечном ожидании.

    Можно ли как-то красиво обрабатывать эту ситуацию?

    Или может есть какие-то шаблонные конструкции на этот счет.

    Можно конечно и колхоз наколхозить, но это всегда успеется. Хочется ведь все чтобы красиво... :)

    Вот есть ветка на эту тему, но сделал как там описано, ничего не ловится.

     

     

     

     

  3. Всем привет!

    Из этой темы так и непонятно как прочитать свои сообщения, которые пришли когда приложение было "inactive or killed".

    В целом задача - собирать у себя в приложении отправленные пуши все, которые дошли до устройства.

    В IOS все работает очень красиво!.

    А вот в Андроиде не могу  получить в приложение все сообщения, которые пришли по его токену.

    У меня в Андроиде событие  OnReceiveNotificationEvent отрабатывает только когда приложение активно.

    Сейчас сижу, разбираюсь. В голове каша. Дайте пожалуйста какой-нибудь намек куда смотреть?...

     

  4. 1 час назад, Lenar Gubaidullin сказал:

    Подскажите пожалуйста как Push уведомления отображать в несколько строк на устройстве клиента?

    Еще бы рисунки туда подтягивать :)

    Никак не получается отойти от одной строки

    Я сначала начал идти по пути примера Равиля. А потом просто попробовал вот так:

        tmpBody :=StringReplace(FDQuery1.FieldByName('Body').AsString, '\n', #13#10, [rfReplaceAll]);
    Работает на всех устройствах, которые проверял. И старые и новые все нормально переносится.

    ЗЫ

    '\n' в теле сообщения обозначает место переноса на сл.строчку.

  5. Ребят, еще раз всем спасибо!

    Все заработало на обеих сборках.

    Я сам невнимательно настроил 64битную часть проекта.

    Сейчас все внимательно проверил, поправил (конкретно у меня не стояла галочка "Receive Push Notifications" в ветке настроек 64бит проекта) все заработало.

  6. 31 минуту назад, sinuke сказал:

    А настройки из файла, генерируемого Firebase, студии "скармливаете"?

     

     

    Нет. Я и до этого не скармливал.

    У меня проект написан на 10.3.1.

    Все и так работало.

     

  7. 1 час назад, Lenar Gubaidullin сказал:

    Подскажите Вы библиотеки все по умолчанию ставили для 10,3,3?

    Не могли бы Вы,если не сложно выложить скриншоты настроек вашего приложения? SDK Libraries, options для Android

    Уже никак не могу понять в чем дело.

    Я бросил надежду победить 1033.

    т.к. просто на пустом проекте ставишь галочку на поле "Receipt Push Notifications" и после этого приложение уже не запускается.

     

  8. 35 минут назад, Lenar Gubaidullin сказал:

    Аналогичная проблема с PUSH.

    Решил проверить и взял чистый код Равиля Зарипова http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html

    Так и на нем валится ошибка. У меня подозрение, что в SDK проблема, но решить не удалось. Так и бьюсь который день

    Тоже думаю на SDK. Курю документацию. Пока безрезультатно.  

  9. Цитата

        FPushServiceConnection := TPushServiceConnection.Create(FPushService);
        FPushServiceConnection.OnChange := OnServiceConnectionChange;
        FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
        FPushServiceConnection.Active := true;  <<<<<<<<<<<<<<----------------------- Валится вот здесь

     

     

  10. Всем привет!

    А что, а что-то с Notifications накосячили?

     

    Пустое приложение запускается нормально :)

    Затем в 32 "Entitlement List" в поле  "Recieve push notifications" ставлю TRUE и все...

    32 битный проект при запуске на устройстве валится и пишет "Произошел сбой в работе приложения..."

    64 битный нормально запускается. Но как только я добавляю рабочий код получения токена продолжается бесконечный спэш экран призапуске.

    Кто-нибудь сталкивался с подобной проблемой?

    А, забыл.. Все это касается Андройда

     

  11. В общем, что-то удалось наколхозить.

    uses
    
    ...
    
    
    {$IFDEF ANDROID}
        , FMX.pushnotification.Android, Androidapi.Helpers,
        Androidapi.JNI.App, Androidapi.JNI.JavaTypes, AndroidApi.JniBridge,
        System.Android.Notification, Androidapi.JNI.GraphicsContentViewText
    {$ELSE}
        , FMX.pushnotification.iOS, iOSapi.UIKit
    {$ENDIF}
        ;
    
    ...
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
    {$IFDEF IOS}
      UIApp : UIApplication;
      UNType :UIUserNotificationType;
    {$ENDIF}
    {$IFDEF ANDROID}
      NM: JNotificationManager;
    {$ENDIF}
    begin
      Memo1.Lines.Clear;
    
    {$IFDEF ANDROID}
       NM := TJNotificationManager.Wrap(
       (TAndroidHelper.Context.getSystemService(
         TJContext.JavaClass.NOTIFICATION_SERVICE) as ILocalObject).GetObjectID);
    
      if NM.areNotificationsEnabled then
        Memo1.Lines.Add('Push Разрешено')
      else
        Memo1.Lines.Add('Push Отключено');
    {$ENDIF}
    
    {$IFDEF IOS}
      UIApp := TUIApplication.Wrap(TUIApplication.OCClass.sharedApplication);
      UNType := UIApp.currentUserNotificationSettings.types;
      if UNType = 0 then begin
        Memo1.Lines.Add('Push Отключено');
        exit;
      end;
      if (UNType and UIUserNotificationTypeBadge) <> 0 then
        Memo1.Lines.Add('Ярлыки Разрешены');
    
      if (UNType and UIUserNotificationTypeSound) <> 0 then
        Memo1.Lines.Add('Звук Разрешен');
    
      if (UNType and UIUserNotificationTypeAlert) <> 0 then
        Memo1.Lines.Add('Шторка Разрешено');
    {$ENDIF}
    end;

    Все как бы работает и показывает отключил пользователь пуши или нет,

    но в Андроиде в каком-то из документов было написано, что нужно проверять версию т.к. не на всех это работает.

    Но мне для теста это не надо было поэтому не запомнил где это видел :(

     

  12. Всем привет!

    Подскажите пожалуйста, а как понять разрешены или запрещены Push уведомления пользователем на iOS/Android устройстве.

    Ну, как бы понятно, что я могу отправлять пуши на полученный DeviceToken, но зачем их слать впустую если они на устройстве-клиенте запрещены?...

  13. Всем привет!

    В общем удалил я keystore файл. Естественно обновление не приняли по другому, сгенеренному.

    Написал им в поддержку, что мол извините, не нарочно удалил. Они ответили:

    Цитата

    Hi there,

    Thanks for contacting Google Play Developer Support.

    Now that we’ve verified your account, I’m happy to help you reset your upload key. The new upload key will be used to sign APKs that you upload to Play.

    Here’s how to generate and register a new upload key:

    1.      Follow the instructions in the Android Studio Help Center to generate a new key. It must be different from any previous keys. Alternatively, you can use the following command line to generate a new key:

    keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks

    ·         This key must be a 2048 bit RSA key and have 25-year validity.

    2.      Export the certificate for that key to PEM format:

    keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks

    1. Reply to this email and attach the upload_certificate.pem file.

    I look forward to your response. Please let me know if you have any questions in the meantime.

    Regards,
    Nash
    Google Play Developer Support

    Все делал как написали и отправил им РЕМ файл.

    Получил ответ уже на Русском:

    Цитата

    Здравствуйте!

    Мы получили запрос на сброс ключа загрузки для приложения SM Beer (com.embarcadero.SMBeer). Новый ключ начнет действовать 19 окт. 2019 г. в 15:00 GMT. До этого вы не сможете загружать новые APK-файлы.

    Цифровые отпечатки нового сертификата загрузки:
    MD5:  79:8B:....
    SHA1: 3A:0C:....

    Если вы не запрашивали сброс ключа, сообщите нам.

    С уважением,
    команда Google Play

    А теперь сижу и думаю... А что мне с этим счастьем делать?....

    Как я понял, keystore файл должен как-то соотноситься с сертификатом, который я им отправил.

    Но вот как его получить из jks и РЕМ файлов нигде не нашел.

    Кто-нибудь сталкивался с такой ситуацией?

     

     

  14. Светлана, вот как делаю я:

     

    procedure TMainClient.ОбновитьДанныеВПотоке
    begin
      TThread.CreateAnonymousThread(procedure ()
        begin
          TThread.Synchronize (nil, //Из потока обращаемся к контролам только через главгый поток
          procedure ()
          begin
            Показываем котролы запускаем мультик
          end);
          
          Выполняем обработку данных без использования визуальных элементов 
    
          TThread.Synchronize(nil, 
          procedure ()
          begin
            Выполняем остановку мультика скрываем контролы
          end);
      end).Start;
    end;

     

  15. Ребя, сам разобрался. Спасибо всем переживающим ?

    Перенес апдейт листбокса туда, где он должен быть.

    Теперь кусочек стал выглядеть вот так:

          TThread.Synchronize(nil, 
          procedure ()
          begin
            lbTare.BeginUpdate;
            UpdateTareBalanceItems;
            Label7.Text := 'Обновлено';
            lclCloseAnimationT;
            lbTare.EndUpdate;
          end);

    Теперь работает вот так: https://www.youtube.com/watch?v=XABighMePBo

    Если есть замечания по коду - поделитесь...

  16. Всем привет!

    Ребята: спасайте. Понимаю: что вопрос детский но не могу победить.

    Выручайте...

    В общем вот кусок кода:

    procedure TMainClient.lbTareMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    var
      ValidateAnswer:TValidateAnswer;
    begin
      if (not UpdateMouseDownT) then exit;
      UpdateMouseDownT := false;
      if (not UpdateDoT) then
      begin
        if (Layout4.Height <> 0) then
          lclCloseAnimationT;
        Exit;
      end;
    
      lclUpAnimationT;
    
      TThread.CreateAnonymousThread(procedure ()
        begin
          TThread.Synchronize (nil, 
          procedure ()
          begin
            lbTare.BeginUpdate;
            Label7.Text := 'Обновляется';
          end);
    
        ValidateAnswer := ValidateID;
        if ValidateAnswer = TValidateAnswer.aValid then
        begin
          ClientModule1.FDConnLocalSQLight.StartTransaction;
          try
            ClientModule1.GetTareBlanceToLocalBD;
            ClientModule1.FDConnLocalSQLight.Commit;
          except
            on E: Exception do
            begin
              ClientModule1.FDConnLocalSQLight.Rollback;
              TThread.Synchronize (nil,
              procedure ()
              begin
                ShowToastMessage('Синхронизация прервана '+E.Message,TShowMessageType.aToastDlg);
              end);
            end;
          end;
    
          TThread.Synchronize(nil, 
          procedure ()
          begin
            UpdateTareBalanceItems;
            lclCloseAnimationT;
            Label7.Text := 'Обновлено';
            lbTare.EndUpdate;
          end);
    
        end else
        begin
          TThread.Synchronize(nil, 
          procedure ()
          begin
            if (Layout4.Height <> 0) then
              lclCloseAnimationT;
            lbTare.EndUpdate;
            case ValidateAnswer of
              TValidateAnswer.aNotValid:
                ShowToastMessage('Код Регистрации Отклонен', TShowMessagetype.aToastDlg);
              TValidateAnswer.aNoConnection:
                ShowToastMessage('Нет Соедиения с Сервером Поставщика', TShowMessagetype.aToastDlg);
            end;
          end);
        end;
    
      end).Start;
      UpdateDoT := false; 
    
    end;

    В се работает хорошо.

    Но вот есть одна проблема... 

    Часть ЛистБокса не отрисовывается до окончания обновления данных.

    Вот как это выглядит в приложении:https://www.youtube.com/watch?v=NeZmUKwTfEk

    Видно, что внизу остается белая часть до тех пор, пока все не выполнится.

    Как ее победить - не знаю!

    Помогите...

  17. Всем привет!

    Очередной вопрос...

    Домучил я наконец Play Market и они мне прислали вот такое письмо счастья (выдержка):

    Цитата

    We are happy to let you know that the 64-bit requirement for your app (com.embarcadero.SMBeer) is extended until August 1st, 2020. After that, please note that app updates that include native code are required to provide 64-bit versions in addition to 32-bit versions when publishing to Google Play. There is no further notice or extension after August 1st, 2020.

     

    To begin updating your apps to meet these new requirements, we highly recommend reading through the relevant documents in the Android Developer Center: https://developer.android.com/distribute/best-practices/develop/64-bit

    Я посмотрел с 64 разрядного устройства в Play Market, но приложения по прежнему не видно.

    В документе по ссылке просто общие требования.

    В примере проверки 64 бит из этого документа у меня в контроле версий так и написано как в примере.

    Нужно что-то по новой загрузить или просто подождать?...

     

     

×
×
  • Создать...