Programowanie wieloplatformowe z użyciem
Embarcadero RAD Studio/Delphi
Zdzisław Sroczyński Politechnika Śląska Instytut Matematyki
Wydział Matematyki Stosowanej materiały dydaktyczne do przedmiotu:
Aplikacje mobilne dla systemu iOS
Platforma Firemonkey/FMX
▶ Firemonkey – zalety:
jeden wspólny kod źródłowy – ujednolicony model obiektowy odwzorowany na API różnych syst.oper.
natywne kompilatory LLVM dla ARM, Intela
Windows, macOS, iOS, Android (32/64b), Linux (64b)
GUI – „pixel perfect”, grafika wektorowa 2D, 3D, animacje, efekty, style
kluczowe kontrolki mogą być natywne (combobox, date/time picker)
ujednolicona obsługa sensorów (GPS, akcelerometr, aparat cyfrowy)
szybkie prototypowanie aplikacji (rapid prototyping)
rozbudowane IDE: RAD Studio, różne języki
programowania do wyboru: Delphi/Object Pascal, C++
bezpłatna wersja IDE „Community” (limit przychodu)
▶ Firemonkey – wady:
koszty wersji komercyjnej (ale wciąż open-source!)
ogólnie GUI rysowane przez Firemonkey nie jest natywne (podobnie jak w Javie, Flutterze i aplikacjach
webowych), problemy z z-index
możliwości FMX stanowią pewien wybór (szeroki) możliwości poszczególnych, obsługiwanych platform mobilnych
im większa integracja z systemem operacyjnym, tym więcej kodu trzeba opracować warunkowo dla konkretnej platformy
zmiany wymagań po stronie producentów (Apple, Google) wymagają czasu na zaadaptowanie (podobnie jak w innych narzędziach firm trzecich)
Aplikacja FMX skompilowana dla Apple iOS, MS Windows i Android:
oczywiście możliwe jest zaprojektowanie dedykowanego
układu dla każdego systemu operacyjnego...
a także różnych rozmiarów ekranu:
Architektura Firemonkey/FMX
Kompilacja na Android w RAD Studio
źródło: felix-colibri.com
Kompilacja na iOS w RAD Studio
źródło: felix-colibri.com
paserver (Platform Assistant Server)
Aplikacja pomocnicza (nie tylko dla iOS, są też wersje
dla Linux i Windows!)
paserver (SDK)
paserver (provisioning i konfiguracja)
iOS – kontrolki natywne
FMX – Beaconfence
RAD Studio – Multi device preview
Podstawowe cechy Firemonkey
▶ możliwości graficzne:
”efekty” graficzne i animacje
edycja w sposób wizualny
inicjowanie w zależności od zdarzeń w systemie
możliwe wywołania synchroniczne i asynchroniczne
▶ Przykład (zmiana położenia panelu):
T A n i m a t o r . A n i m a t e F l o a t ( Panel1 ,’ P o s i t i o n . X ’, −50 , 0 . 4 ,
T A n i m a t i o n T y p e . atIn , T I n t e r p o l a t i o n T y p e . i t E x p o n e n t i a l ) ;
Style wizualne w Firemonkey
▶ Style:
osadzone w zasobach aplikacji
ładowane z zewnętrznego pliku
definicja w postaci plików tekstowych
możliwe wywołania synchroniczne i asynchroniczne
▶ Przykład (zmiana stylu wyzwalana kliknięciem):
o b j e c t T I n n e r G l o w E f f e c t
S t y l e N a m e = ’ I n n e r G l o w E f f e c t 1 ’ T r i g g e r = ’ I s P r e s s e d=t r u e ’ E n a b l e d = F a l s e
. . .
Wersje językowe oprogramowania w Firemonkey
▶ Obiekt TLang:
kreator tłumaczenia
automatyczny dobór wersji językowej wg ustawień systemu operacyjnego
GetCurrentLangID ≠ NSLocale.preferredLanguages
▶ Korekta źródeł biblioteki:
f u n c t i o n T C o c o a T o u c h M e t r i c s S e r v i c e s . G e t C u r r e n t L a n g I D : s t r i n g; v a r
l n g s : N S A r r a y ; L a n g u a g e I S O : N S S t r i n g ; b e g i n
l n g s := T N S L o c a l e . O C C l a s s . p r e f e r r e d L a n g u a g e s ; L a n g u a g e I S O := T N S S t r i n g . W r a p ( l n g s . o b j e c t A t I n d e x ( 0 ) ) ; R e s u l t := U T F 8 T o S t r i n g ( L a n g u a g e I S O . U T F 8 S t r i n g ) ; i f L e n g t h( Result ) > 2 t h e n
D e l e t e( Result , 3 , MaxInt ) ; end;
Aplikacja Firemonkey dla iOS w j. polskim i angielskim:
AppTethering
▶ działa na Windows, MacOS, Android i iOS oraz pomiędzy aplikacjami na tych platformach
▶ współpraca aplikacji wykorzystujących RTL RAD Studio (w tej samej podsieci)
połączenia IP
połączenia Bluetooth (classic)
▶ wyszukiwanie podłączonych aplikacji
▶ uruchamianie zdalnego kodu
▶ wymiana danych
▶ prosty protokół, łatwa implementacja, wsparcie
gotowych komponentów
AppTethering – schemat
AppTethering – obsługa zdalnego zasobu
T e t h e r i n g A p p P r o f i l e 1 . R e s o u r c e s . F i n d B y N a m e (’ nazwa ’) . Value :=’ w a r t o s c ’; . . .
p r o c e d u r e T M a i n F o r m . T e t h e r i n g A p p P r o f i l e 1 R e s o u r c e s 0 R e s o u r c e R e c e i v e d ( c o n s t S e n d e r : T O b j e c t ; c o n s t A R e s o u r c e : T R e m o t e R e s o u r c e ) ; b e g i n
M e m o 1 . T e x t :=’ o t r z y m a n o : ’ + A R e s o u r c e . Value . A s S t r i n g ; end;
. . .
f o r v a r i := 0 t o T e t h e r i n g M a n a g e r 1 . R e m o t e P r o f i l e s . C o u n t − 1 do
T e t h e r i n g A p p P r o f i l e 1 . S e n d S t r e a m ( T e t h e r i n g M a n a g e r 1 . R e m o t e P r o f i l e s [ i ] ,’ nazwa ’, ↩ P i c t u r e S t r e a m 1 ) ;
. . .
p r o c e d u r e T e t h e r i n g A p p P r o f i l e 1 R e s o u r c e R e c e i v e d (
c o n s t S e n d e r : T O b j e c t ; c o n s t A R e s o u r c e : T R e m o t e R e s o u r c e ) ; b e g i n
T T h r e a d . S y n c h r o n i z e (n i l,p r o c e d u r e v a r
L S i z e : I n t 6 4 ; b e g i n
t r y
L S i z e := A r e s o u r c e . V a l u e . A s S t r e a m . S i z e ; A r e s o u r c e . V a l u e . A s S t r e a m . P o s i t i o n := 0 ;
T A n i m a t o r . A n i m a t e F l o a t W a i t ( I m a g e F o t o , ’ O p a c i t y ’, 0 , 0 . 5 ) ; I m a g e F o t o . B i t m a p . L o a d F r o m S t r e a m ( A r e s o u r c e . V a l u e . A s S t r e a m ) ; T A n i m a t o r . A n i m a t e F l o a t W a i t ( I m a g e F o t o , ’ O p a c i t y ’, 1 , 0 . 5 ) ; I m a g e F o t o . R e p a i n t ;
e x c e p t end; end ) ; end;
AppThethering
Visual Live Binding
wizualne łączenie danych z kontrolkami:
FMX.MobilePreview
Styl podobny do iOS na platformie Windows:
Apple iOS – cykl życia aplikacji
▶ ograniczona wielozadaniowość:
wydajność i oszczędzanie energii
konieczność prezentacji wielu uruchomionych procesów
▶ cykl życia aplikacji iOS (v>3):
not running
inactive – stan przejściowy/tymczasowy
active
background – stan przejściowy/tymczasowy
suspended
▶ zarządzanie aplikacjami przez iOS:
ostrzeżenia o braku pamięci (poziomy zależne od urządzenia)
automatyczne usuwanie zamrożonych (suspended) aplikacji
Testowanie aplikacji dla iOS
▶ wykorzystanie symulatora ≠ fizycznego urządzenia
możliwie wiele wersji systemu operacyjnego i urządzeń o różnych rozdzielczościach i wymiarach ekranu
unicode, utf-8
połączenie z serwerami internetowymi
testowanie dotyku, gestów, ruchu i zmiany orientacji
symulacja na wydajnej maszynie klasy desktop jest znacznie szybsza niż na prawdziwym urządzeniu!
testowanie ostrzeżeń o braku pamięci
timery i opóźnienia – płynność animacji/zamrażanie przy przechodzeniu do stanu background
wywołania natywnych kontrolek systemu operacyjnego – dla cyklicznych animacji, np. ActivityIndicatorView zamiast TAniIndicator
testowanie w długich przedziałach czasu, rzędu dni
Podsumowanie
▶ cechy aplikacji mobilnych
użytkowe pośrednictwo graficzne wykorzystujące duże elementy kontrolne rozmieszczone na małym ekranie
praca ciągła
zapisywanie danych pomiędzy sesjami pracy użytkownika
wykorzystanie urządzeń peryferyjnych/sensorów
▶ testowanie aplikacji dla iOS
uwzględnienie cyklu życia aplikacji iOS
dokładnie określone wymagania odnośnie sposobu interakcji człowiek-komputer (iOS Human Interface Guidelines)
konieczność wykorzystania fizycznych urządzeń
konieczność weryfikacji wydajności dla złożonych lub cyklicznych animacji dla platformy Firemonkey