Перейти к содержанию
  • Регистрация

FeLDMARShaL

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

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

  • Посещение

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

    4

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

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

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

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

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

859 просмотров профиля
  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. Думаю тема стилизации этого индикатора раскрыта не полностью, но на текущий момент мне этого хватит. Было бы круто если значение переменной UndefinedThemeID=-1 перекочевало в основную ветку (т.к. тема со ид равным 0 - это именно штатная тема приложения, которая многими меняется)
  4. После упорных попыток, не получилось подружить компонент с созданной темой, возможно ее ид как то не так получаю и ниже приведенный код возвращает что то не то 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. Ну собственно на этом усе, ждемс идей . Я верю в силу коллективного разума
  6. Собственно вот сам мини проект: test.zip
  7. Коллеги. Я верю в коллективный разум. Требуется изменить визуально индикатор прогресса. Для этого к проекту необходимо подгружать стили. За основу я взял тему 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
×
×
  • Создать...