FeLDMARShaL

Пользователи
  • Публикаций

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

  • Посещение

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

    4

FeLDMARShaL стал победителем дня 8 декабря

FeLDMARShaL имел наиболее популярный контент!

Информация о FeLDMARShaL

  • Звание
    Продвинутый пользователь

Посетители профиля

800 просмотров профиля
  1. В душе не знаю :), ниразу не пользовал и даже не устанавливал. Предполагаю проверить камунибуть и отписаться о результате. Вдруг что то забыл рассказать, но вроде все упомянул.
  2. Расскажу о том как я добился нормальной фоновой работы приложения. В моем понимании нормальная фоновая работа приложения - это сохранять геокоординаты и систематически (по мере их накопления передавать на сервер). По сути у нас получился трекер. Те кто считают что iOS такое не умеет делать, и все что будет написано ниже это фейк лучше закройти эту тему. Итак начнем, по пунктам: 1) Добавляем к проекту ключ NSLocationAlwaysAndWhenInUseUsageDescription - для новых иОС это обязательно, начиная с 11 или 12 версии уже не помню 2) Сообщаем приложению о намерении что мы будем использовать геокоординаты в фоне (редактируем ключ UIBackgroundModes выставляя галочку напротив location) 3) Далее для того чтобы не поломать другие приложения которые используют геолокацию создаем специальную дерективу, которая будет сообщать о том что наше приложение будет использовать геолокацию в фоне, я ее назвал iOS_RequestAlwaysAuthorization 4) Дальше намного сложнее, нам нужно исправить исходники самой Delphi, а именно System.iOS.Sensors. Изменять будем процедуру TiOSLocationSensor.DoStart, все что отличается от стандартного у меня в рамках описания моей директивы: function TiOSLocationSensor.DoStart: Boolean; var I: Integer; begin {$ifdef iOS_RequestAlwaysAuthorization} if TOSVersion.Check(8) and (FLocater <> nil) then FLocater.requestAlwaysAuthorization; {$else iOS_RequestAlwaysAuthorization} if TOSVersion.Check(8) and (FLocater <> nil) then FLocater.requestWhenInUseAuthorization; {$endif iOS_RequestAlwaysAuthorization} // check authorization if Authorized = TAuthorizationType.atUnauthorized then SensorError(SLocationServiceUnauthorized); // check if location sensor is enabled if not FLocater.locationServicesEnabled then SensorError(SLocationServiceDisabled); // start location updates if (LocationChange = TLocationChangeType.lctLarge) and CanUseSignifChangeNotifs then FLocater.startMonitoringSignificantLocationChanges else FLocater.startUpdatingLocation; // start heading updates if CanUseHeading then begin FLocater.startUpdatingHeading; end; // start monitoring regions if CanMonitorRegions then for I := 0 to Regions.Count - 1 do FLocater.startMonitoringForRegion(ConvLocationRegion(Regions[I])); Result := FLocater.locationServicesEnabled; if Result then Result := Authorized = TAuthorizationType.atAuthorized; {$ifdef iOS_RequestAlwaysAuthorization} FLocater.setAllowsBackgroundLocationUpdates(True); FLocater.setPausesLocationUpdatesAutomatically(False); {$endif iOS_RequestAlwaysAuthorization} end; Собственно усе, можно наслаждаться фоновой работой. Все это работает под Delphi 10.2.3. На телефоне iPhone 6s под управлением iOS 11. Как было сказано выше, работает как геолокация так и инет и вообще все остальные процессы внтури приложения, такие как TTimer Собственно вот результат данного трекера: Если приблизить то можно увидеть насколько точно и часто он обновляет координаты: И да, огромное спасибо человеку с ником Artyom Karapetyan, именно он натолкнул на мысль того как надо правильно все сделать
  3. FeLDMARShaL

    Изменение стиля TfgActivityDialog №2

    Думаю тема стилизации этого индикатора раскрыта не полностью, но на текущий момент мне этого хватит. Было бы круто если значение переменной UndefinedThemeID=-1 перекочевало в основную ветку (т.к. тема со ид равным 0 - это именно штатная тема приложения, которая многими меняется)
  4. FeLDMARShaL

    Изменение стиля TfgActivityDialog №2

    После упорных попыток, не получилось подружить компонент с созданной темой, возможно ее ид как то не так получаю и ниже приведенный код возвращает что то не то themId := TAndroidHelper.Context.getResources.getIdentifier(StringToJString('styles_dialog'), StringToJString('layout'), TAndroidHelper.Context.getPackageName) Но реализовать нужно было пришлось пофиксить немного стандартные компоненты, и именно в части const UndefinedThemeID = -1; Теперь компоненты считаю что ThemeID=0 - это кастомная тема. После чего, вот такой код (и измненная стандартная тема приложения): if not Assigned(fg_my) then begin fg_my := TfgActivityDialog.Create(nil); fg_my.Theme := TfgDialogTheme.Custom; fg_my.ThemeID := 0; end; fg_my.Show; sleep(3000); fg_my.Hide; Приводят вот к такому результату (разумеется индикатор крутится как надо):
  5. FeLDMARShaL

    Изменение стиля TfgActivityDialog №2

    Ну собственно на этом усе, ждемс идей . Я верю в силу коллективного разума
  6. FeLDMARShaL

    Изменение стиля TfgActivityDialog №2

    Собственно вот сам мини проект: test.zip
  7. FeLDMARShaL

    Изменение стиля TfgActivityDialog №2

    Коллеги. Я верю в коллективный разум. Требуется изменить визуально индикатор прогресса. Для этого к проекту необходимо подгружать стили. За основу я взял тему http://manjunath4android.blogspot.ru/2015/12/display-progress-dialog-without-text.html Будем менять индикатор на тот который указан в теме. Что было сделано с моей стороны: 1) Прилинковал все необходимые фалы к нашему проекту 2) Проконсультировался с разработчиком компонентов Полазил по исходникам, в результате чего понял что поменять стиль в текущей реализации уже должно получится. Для этого есть 2 свойства у класса TfgActivityDialog: Theme и ThemeID. Если со свойством Theme все понятно, его необходимо задать как TfgDialogTheme.Custom, то с ThemeID не так все просто. На просторах интернета нашел что это такое (R.layout.my_progress) и вроде бы даже перевел на Pascal: TAndroidHelper.Context.getResources.getIdentifier(StringToJString('my_progress'), StringToJString('layout'), TAndroidHelper.Context.getPackageName), но в конечном итоге имеем вот это: А ожидается вот это: На кнопку которая должна отобразить индикатор активности повесил вот такой код: procedure TmainForm.Button1Click(Sender: TObject); var fg: TfgActivityDialog; themId: Integer; begin themId := TAndroidHelper.Context.getResources.getIdentifier(StringToJString('my_progress'), StringToJString('layout'), TAndroidHelper.Context.getPackageName); fg := TfgActivityDialog.Create(Self); try if themId<>0 then begin fg.Theme := TfgDialogTheme.Custom; fg.ThemeID := themId; fg.Title := 'Title'; fg.Message := 'Message'; Button1.Text := 'TfgDialogTheme.Custom' end else Button1.Text := 'TfgDialogTheme.Auto'; fg.Show; sleep(3000); fg.Hide; finally FreeAndNil(fg); end; end;
  8. когдато мне Ярослав помог с этим вопросом, вот его ответ (актуально для режима слайдинга): Мне помогла, если у Вас дургой режим, там по аналогии другой модуль поправить придется
  9. Была такая проблема, идеальное решение - залезть во внуторь стиля компонента, и там у имиджа изменить свойство отвечающее за растягивание на fit к примеру
  10. Да не вопрос, я даже в quality центр написал об ошибке
  11. Задал вопрос на форуме абракадабры https://forums.embarcadero.com/thread.jspa?messageID=894743#894743 посмотрим, может местные гуру подскажут чтонибуть
  12. Вроде бы тривиальная задача получить строку с токеном оплаты (PKPayment-PKPaymentToken-transactionIdentifier: NSString) но блин, как то все сложно и ничего не работает
  13. У меня уже руки опускаются, незнаю что делать. Явно не хватает опыта нативной разработки под iOS
  14. Немного изменил подход. Создал свой класс Класс интерфейс PKPaymentAuthorizationViewControllerDelegate полученный посредством SdkTransform.exe: Процедура (одна из): При попытке создать экземпляр класса LDelegate := TMyViewDelegate.Create; выскакивает ошибка Я так понимаю что SdkTransform.exe неправильно создал заголовки нативных функций, и надо вручную их поправить. Есть идеи как это сделать? В инете нашел решение изменить объявление процедур на TPassKitCompletion1 = procedure(param1: PKPaymentAuthorizationStatus); cdecl; но мне это не помогло, ошибка остается
  15. Результат который я должен передать в процессинговый центр находится в структуре PKPaymentAuthorizationControllerDelegate в переменной с типом PKPayment