Smakołyki tworzenia aplikacji mobilnych w Delphi Zdzisław Sroczyński Caprisoft Politechnika Śląska Zakład Informatyki Zlot programistów Delphi 2017 Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 1 / 65
ios: https://developer.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 2 / 65
ios: bundle identifier opcje Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 3 / 65
ios: https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 4 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 5 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 6 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 7 / 65
Połączenie z PAserver Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 8 / 65
Provisioning: developer.apple.com Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 9 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 10 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 11 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 12 / 65
Application Loader (macos) Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 13 / 65
https://itunesconnect.apple.com/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 14 / 65
Recenzja maile Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 15 / 65
Android: https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 16 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 17 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 18 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 19 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 20 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 21 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 22 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 23 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 24 / 65
https://play.google.com/apps/ Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 25 / 65
Porady pliki w sekcji Deployment trzeba dodać dla każdej platformy, symulatora też bundle ID w opcjach Version Info generate ios universal binary file w opcjach Compiling Edit SDK nowsza wersja istotna dla Application Loader przy problemach z instalacją: usuń starą wersję programu z telefonu różne wersje Xcode na tym samym Macu (konto w opcjach, command line tools), pierwszy start zgoda Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 26 / 65
Symulator ios odśwież! Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 27 / 65
Symulator ios Xcode 8.2 Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 28 / 65
Symulator ios Xcode 8.3.3 Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 29 / 65
Thumbnail PhotoPuzzle TFMXBitmapHelper = class helper f o r TBitmap function CreateFitThumbnail ( const Width, Height : Integer ) : TBitmap end ; function TFMXBitmapHelper. CreateFitThumbnail ( const Width, Height : Integer ) : TBitmap ; var R : TRectF ; begin Result := TBitmap. Create ( Width, Height ) ; Result. Canvas. BeginScene ; i f width<=self. Width then begin R := RectF ( 0, 0, Self. Width, Self. Height ) ; R. Fit ( RectF ( 0, 0, Width, Height ) ) ; end e l s e R := RectF ( 0, 0, Width, Height ) ; Result. Canvas. DrawBitmap ( Self, RectF ( 0, 0, Self. Width, Self. Height ), R, 1. 0 ) ; Result. Canvas. EndScene ; Zdzisław end ; Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 30 / 65
PhotoPuzzle Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 31 / 65
Android vkhardwareback (IFDEF) procedure TFormPuzzle. FormKeyUp ( Sender : TObject ; v ar Key : Word ; v ar KeyChar : Char ; Shift : TShiftState ) ; begin i f Key = vkhardwareback then begin key :=0; { $IFDEF ANDROID} MessageDlg ( Koniec?, TMsgDlgType. mtconfirmation, [ TMsgDlgBtn. mbyes, TMsgDlgBtn. mbcancel ], 0, procedure ( const AResult : TModalResult ) begin i f end ) ; {$ENDIF} end ; end ; AResult=mrYes then MainActivity. finish ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 32 / 65
PL FMX.Platform.Metrics.iOS.pas f u n c t i o n TCocoaTouchMetricsServices. GetCurrentLangID : string ; var lngs : NSArray ; CurrentLocale : NSLocale ; LanguageISO : NSString ; begin lngs := TNSLocale. OCClass. preferredlanguages ; LanguageISO:= TNSString. Wrap ( lngs. objectatindex ( 0 ) ) ; // CurrentLocale := TNSLocale. Wrap ( TNSLocale. OCClass. currentlocale ) ; // LanguageISO := TNSString. Wrap ( CurrentLocale. objectforkey ( ( NSLocaleLanguageCode as ILocalObject ). GetObjectID ) ) ; Result := UTF8ToString ( LanguageISO. UTF8String ) ; i f Length ( Result ) > 2 then Delete ( Result, 3, MaxInt ) ; end ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 33 / 65
PL FMX.Dialogs.iOS.pas (1) function ZSTranslate ( co : String ) : String ; var LocaleSvc : IFMXLocaleService ; begin LocaleSvc := TPlatformServices. Current. GetPlatformService ( IFMXLocaleService ) as IFMXLocaleService ; i f LocaleSvc. GetCurrentLangID = p l then begin i f co = Yes then result := Tak e l s e i f co = No then result := Nie e l s e result := co ; end ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 34 / 65
PL FMX.Dialogs.iOS.pas (2) function TCocoaDialogsService. MessageDialog ( const AMessage : string ; const ADialogType : TMsgDlgType ;... AlertView := TUIAlertView. Wrap ( AlertView. initwithtitle ( StrToNSStr ( ZSTranslate ( MsgTitles [ ADialogType ] ) ), StrToNSStr ( AMessage ), Delegate. GetObjectID, nil, nil ) ) ; f o r B := Low ( TMsgDlgBtn ) to High ( TMsgDlgBtn ) do i f B i n AButtons then AlertView. addbuttonwithtitle ( StrToNSStr ( ZSTranslate ( ButtonCaptions [ B ] ) ) ) ; AlertView. Show ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 35 / 65
PL FMX.Platform.Metrics.Android.pas function TAndroidMetricsServices. GetCurrentLangID : string ; var Locale : JLocale ; begin Locale := TJLocale. JavaClass. getdefault ; // Result := JStringToString ( Locale. getiso3language ) ; Result := JStringToString ( Locale. getlanguage ) ; i f Length ( Result ) > 2 then Delete ( Result, 3, MaxInt ) ; end ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 36 / 65
PL FMX.Dialogs.Android.pas procedure TFMXDialogService. MessageDialogAsync ( const AMessage : string ; const ADialogType : TMsgDlgType ; const AButtons : TMsgDlgButtons ; const ADefaultButton : TMsgDlgBtn ; const AHelpCtx : THelpContext ; const ACloseDialogProc : TInputCloseDialogProc ) ;... f o r B i n AButtons do begin i f ButtonIndex < ButtonsCount then begin LCaptions. Items [ ButtonIndex ] := StringToJString ( ZSTranslate ( ButtonCaptions [ B ] ) ) ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 37 / 65
Warsztaty1 TDialogServiceAsync TDialogServiceAsync. MessageDialog ( Komunikat, TMsgDlgType. mtconfirmation, [ TMsgDlgBtn. mbyes, TMsgDlgBtn. mbno ], TMsgDlgBtn. mbyes, 0, procedure ( const AResult : TModalResult ) begin i f AResult = mryes then FWarsztaty1. label1. Text:= k l i k n i e t o TAK! e l s e FWarsztaty1. label1. Text:= k l i k n i e t o NIE! ; end ) ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 38 / 65
Warsztaty1 IFMXPhoneDialerService var PhoneDialerService : IFMXPhoneDialerService ; begin i f TPlatformServices. Current. SupportsPlatformService ( IFMXPhoneDialerService, IInterface ( PhoneDialerService ) ) then begin PhoneDialerService. Call ( Edit1. Text ) end e l s e ShowMessage ( To u r z a d z e n i e n i e p o t r a f i dzwonic! ) ;... Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 39 / 65
Warsztaty1 kontakty i f ( Source. SourceName = Phone c o n t a c t s ) // Android or ( Source. SourceName = Card ) //ios then Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 40 / 65
TMapView problem Z-Order MapView1. Snapshot ( SnapshotHandler ) ;... procedure TForm1. SnapshotHandler ( const ABitmap : TBitmap ) ; begin Rectangle1. Fill. Bitmap. Bitmap. Assign ( ABitmap ) ; end ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 41 / 65
Lokalizacje Swift ;) Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 42 / 65
ios dodawanie frameworka Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 43 / 65
AudioToolbox przykład (1) { $IFDEF IOS} Const libaudiotoolbox = / System / L i b r a r y / Frameworks / AudioToolbox. framework / AudioToolbox ; ksystemsoundid_vibrate = $FFF ; Procedure AudioServicesPlaySystemSound ( insystemsoundid : i n t e g e r ) ; Cdecl ; External libaudiotoolbox Name _PU + A u dioservicesplaysystemsound ; Procedure AudioServicesCreateSystemSoundID ( soundfileurlref : CFURLRef ; v ar insystemsoundid : I n t e g e r ) ; Cdecl ; External libaudiotoolbox Name _PU + A udioservicescreatesystemsoundid ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 44 / 65
AudioToolbox przykład (2) var lasersoundid, explsoundid : Integer ; soundfileurlref : CFURLRef ; Path : CFStringRef ; URL : CFURLRef ;... AFilename:= TPath. GetDocumentsPath + PathDelim + l a s e r. mp3 ; Path := CFStringCreateWithCharacters ( nil, PChar ( AFileName ), Length ( AFileName ) ) ; URL := CFURLCreateWithFileSystemPath ( nil, Path, kcfurlposixpathstyle, False ) ; AudioServicesCreateSystemSoundID ( URL, lasersoundid ) ; AudioServicesPlaySystemSound ( lasersoundid ) ; {$ENDIF} Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 45 / 65
Pauza w animacjach TAnimatorHelper = class helper f o r TAnimator class procedure PauseAnimations ( const Target : TFmxObject ; vpause : Boolean ) ; end ; class procedure TAnimatorHelper. PauseAnimations ( const Target : TFmxObject ; vpause : Boolean ) ; var I : Integer ; begin f o r I := Target. ChildrenCount 1 downto 0 do begin i f ( Target. Children [ I ] is TCustomPropertyAnimation ) then TFloatAnimation ( Target. Children [ I ] ). Pause:=vpause ; i f ( Target. Children [ I ] is TPathAnimation ) then TPathAnimation ( Target. Children [ I ] ). Pause:=vpause ; end ; Zdzisław end ; Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 46 / 65
Zatrzymanie animacji TFMXObjectAniStopper = class helper f o r TFMXObject procedure StopAnimations ; end ; procedure TFMXObjectAniStopper. StopAnimations ; var iani : i n t e g e r ; begin f o r iani := ( ChildrenCount 1) downto 0 do begin i f ( Children [ iani ] is TCustomPropertyAnimation ) then TFloatAnimation ( Children [ iani ] ). DisposeOf e l s e i f ( Children [ iani ] is TPathAnimation ) then TPathAnimation ( Children [ iani ] ). DisposeOf ; end ; end ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 47 / 65
Przykład MathGalaxy Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 48 / 65
FMX.WebBrowser.Android.pas procedure TAndroidWebBrowserService. InitUIThread ; begin FJWebBrowser := TJWebBrowser. JavaClass. init ( TAndroidHelper. Activity ) ; FJWebBrowser. getsettings. setjavascriptenabled ( True ) ;... FJWebBrowser. getsettings. setsupportzoom ( f a l s e ) ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 49 / 65
FMX.WebBrowser.Delegate.iOS.pas procedure TWebViewDelegate. webviewdidfinishload ( webview : UIWebView ) ; var LRequest : NSURLRequest ; begin... i f webview <> nil then begin webview. scrollview. setminimumzoomscale ( 1. 0 ) ; webview. scrollview. setmaximumzoomscale ( 1. 0 ) ; webview. scrollview. setzoomscale ( 1. 0 ) ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 50 / 65
Przykład WebbrowserFMX Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 51 / 65
Smartwatche Android Wear Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 52 / 65
Huawei Watch specyfikacja Android Wear 2.0 (Android 7.1.1) ekran okrągły 1.4 cala 400x400 (ok. 286ppi) CPU: Qualcomm MSM8926 Snapdragon 400 Quad-core 1.2 GHz Cortex-A7 GPU: Adreno 305 pamięć 4GB, p. operacyjna 512MB RAM komunikacja: Wi-Fi 802.11 b/g, Bluetooth 4.1, LE sensory: akcelerometr, żyroskop, czujnik tętna Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 53 / 65
Wersja Android/wersja Android Wear Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 54 / 65
LG Watch, LG Watch R specyfikacja LG Watch: ˆ Android Wear 1.5 (Android 6.0.1) ˆ ekran prostokątny 1.65 cala 280x280 (ok. 240ppi) ˆ brak Wi-Fi, kompas ˆ brak przycisku fizycznego (reset w kopercie) LG Watch R: ˆ Android Wear 2.0 (Android 7.1.1) ˆ ekran okrągły 1.3 cala 320x320 (ok. 245ppi) ˆ barometr nowsze modele: własny moduł łączności komórkowej, zwiększona pamięć, GPS Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 55 / 65
Smartwatch projektowanie UI/UX wskaźnik postępu/pracy powolne łącze internetowe dostosowanie do kształtu i rozdzielczości ekranu uwzględnienie małych rozmiarów ekranu powiększanie widoku sterowanie za pomocą gestów powiększanie, przesuwanie, odświeżanie gest przesunięcia w prawo zarezerwowany dla systemu operacyjnego zakończenie aplikacji Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 56 / 65
Aplikacja Pogoda Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 57 / 65
Aplikacja Pogoda Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 58 / 65
Aplikacja Pogoda gesty ruch palca w górę, dół, w lewo przesuwanie wykresu gest mniejsze powrót wykresu do pozycji wyjściowej w poziomie gest koło odświeżenie wykresu gest długie przyciśnięcie (long tap) powiększenie/pomniejszenie wykresu Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 59 / 65
Progress indicator v FMX arc1. StartAngle :=0; arc1. EndAngle :=30; arc1. RotationAngle :=0; TAnimator. AnimateFloat ( arc1, EndAngle, arc1. EndAngle +180,10) ; TAnimator. AnimateFloat ( arc1, R o t a t i o n A n g l e,360*55,55) ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 60 / 65
Aplikacja Kalendarz Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 61 / 65
Aplikacja Kalendarz Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 62 / 65
Aplikacja Kalendarz gesty i nawigacja dostosowanie położenia i rozmiaru kontrolki kalendarza na podstawie nazwy modelu urządzenia (Build.MODEL) ruch palca w górę, dół zmiana miesiąca pola z lewej/prawej zmiana miesiąca listy wyboru miesięcy i lat częściowo przesłonięte analogiczny problem występuje w niektórych dialogach w systemie operacyjnym Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 63 / 65
FMX.Calendar.Style.pas procedure FillDaysOfPreviousMonth ; // FillDaysOfCurrentMonth, FillDaysOfNextMonth... i f DateToStr ( Item. Date ) = DateToStr ( System. DateUtils. Today ( ) ) then begin Item. TextSettings. Font. Style:= [ TFontStyle. fsbold ] ; Item. FontColor:=claGreen ; end e l s e begin Item. TextSettings. Font. Style:= [ ] ; Item. FontColor:= clapurple ; end ; i f DayOfWeek ( Item. Date ) = 1 then begin Item. StyledSettings:=Item. StyledSettings [ TStyledSetting. FontColor ] ; Item. FontColor:=claRed ; end ; Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 64 / 65
Dziękuję za uwagę pytania: zdzislaw@sroczynski.pl Zdzisław Sroczyński Smakołyki tworzenia aplikacji mobilnych w Delphi 65 / 65