Jump to content

Dave Nottage

Members
  • Content Count

    1268
  • Joined

  • Last visited

  • Days Won

    28

Posts posted by Dave Nottage


  1. Just now, Rollo62 said:

    I assumed that XCode 15 won't support or can handle older iOS 16.x SDKs any longer.

    Xcode 15 doesn't have iOS 16.x SDKs, no.. but that does not mean you cannot debug iOS 16 (or earlier) devices.

    1 minute ago, Rollo62 said:

    Can you confirm that XCode 15 can still be used for debugging same as XCode 14.3.1, under iOS 16.x, without too much trickery ?

    With no "trickery" whatsoever. iOS 16.x devices do not have the new debugging support introduced in iOS 17, and Xcode 15 handles that.

    7 minutes ago, Rollo62 said:

    The older SDK will have to be hooked into XCode manually, with all possible incompatibilities.

    Not sure what you mean by "manually". The only "incompatibilities" are if you attempt to use features in code available in the newer SDK on a device with an older OS (when the feature is not available in that older OS).

    9 minutes ago, Rollo62 said:

    Older iOS SDKs are not directly available through official channels.
           They must be extracted from an older Xcode version.

    That's true, however you can import an iOS 17.x SDK from Xcode 15, build your app against it, and It will happily run on an iOS 16.x device (as long as you do not attempt to use features from a newer OS, as mentioned above), and you can use the debugger with Delphi. As I mentioned earlier, it's debugging with an iOS 17.x device that is the major issue right now.


  2. 12 hours ago, Rollo62 said:

    Would be great if there is a way, to make XCode 15 compatible with Delphi, or vice versa.

    Delphi can already use Xcode 15. The biggest issue at the moment is debugging with iOS 17 (or higher) devices, which is a problem regardless of Xcode version. Debugging on devices with iOS 16.x still works using Xcode 15. A secondary issue is this onea problem if your app needs to link to 3rd party binaries that were built with Xcode 14 or higher.

     

    • Like 2

  3. 11 hours ago, Keesver said:

    'm using class TLocalReceiver from a Kastri sample application. When I create a new instance from this class I run into an exception:

    If you're using a demo app, you should not receive that error. The Java type comes from a java library from the Lib folder in Kastri, and which one will depend on the version of Delphi you are using.

    • Delphi 10.x:  dw-kastri-base.jar
    • Delphi 11.x: dw-kastri-base-2.0.0.jar
    • Delphi 12.x: dw-kastri-base-3.0.0.jar

    The relevant jar file would have been added to the Libraries node of the Android 32-bit target in Project Manager, e.g (Delphi 12.x):

     

    image.thumb.png.9361ceac0b49df0de6dacaa7c01f36ef.png

    <snip>
    image.thumb.png.519094f1cc9d20cfc18dad277b61b017.png

     

    Which should be compiled in with the app, unless you're using Delphi 11.3, which requires a workaround.

     


  4. 3 hours ago, Dave Nottage said:

    If so, I'll revisit this since I haven't looked at it since upgrading to 12.1.

    I revisited it anyway, and have attached the updated test project. Using Codex 2.2.0 I downloaded the AndroidX appcompat package (note that it should be v1.2.0 to align with what Delphi 12.1 uses):

     

    image.thumb.png.703b2603dd0e5cacabafa320868a675a.png


    ..and added it using the Add Android Package menu item that Codex adds to the Project Manager context menu. This is after deploying at least once, so that resources are merged properly.

     

    image.thumb.png.b8645280c72016f5b86db7d691445b9e.png

     

    In Delphi 12.1 deploying at least once also means that AndroidManifest.template.xml is created (in 12.0 and earlier it is created when building, rather than deploying), and the following is added to it, just before <%activity%>:

            <activity
                android:name="com.delphiworlds.kastri.DWFilesActivity"
                android:excludeFromRecents="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data android:mimeType="*/*" />
                    <data android:scheme="content" />
                    <data android:host="*" />
                </intent-filter>
            </activity>

    ..and of course, the dw.filesactivity.jar library is added to the Android 32-bit Libraries node (does not need to be added to 64-bit unless you're using Delphi 11.3)

    RSP41337.zip


  5. 6 hours ago, vinni said:

    Dave, thanks for your suggestion. I gave it a try, but on my side AJavaScriptResult is always 'null' for any website.

    Is this on Windows? If so, are you setting the WindowsEngine property of the TWebBrowser to EdgeOnly? The result you're seeing happens if TWebBrowser uses IE.


  6. 1 hour ago, rvk said:

    No, unfortunately TWebBrowser.Document isn't available for FMX.

    There is no Document property, however there is a way of accessing the underlying web view (ICoreWebView2 on Windows, JWebView on Android and WKWebView on macOS/iOS), e.g. on Android:

    var
      LWebView: JWebView;
    begin
      if Supports(WebBrowser1, JWebView, LWebView) then
        // Do something with LWebView
    end;

    That said, as time goes on the underlying web view (on all platforms) has had direct access to HTML removed, so it has become necessary to execute JavaScript to achieve the same thing. Unfortunately, TWebBrowser has only EvaluateJavascript, which does not support returning a result, so it's necessary to use the technique above to achieve this, as I've done in the WebBrowserExt feature in Kastri (demo here). Using TWebBrowserExt, ExecuteJavaScript could be called with cJavaScriptGetPageContents (from the DW.JavaScript unit), thus:
     

    unit Unit1;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.WebBrowser, FMX.Controls.Presentation, FMX.StdCtrls,
      DW.WebBrowserExt;
    
    type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure WebBrowser1DidFinishLoad(ASender: TObject);
      private
        FWebBrowserExt: TWebBrowserExt;
      public
        constructor Create(AOwner: TComponent); override;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.fmx}
    
    uses
      DW.JavaScript;
    
    { TForm1 }
    
    constructor TForm1.Create(AOwner: TComponent);
    begin
      inherited;
      WebBrowser1.WindowsEngine := TWindowsEngine.EdgeOnly; // On Windows, unlikely to work with IE
      FWebBrowserExt := TWebBrowserExt.Create(WebBrowser1);
    end;
    
    procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject);
    begin
      FWebBrowserExt.ExecuteJavaScript(cJavaScriptGetPageContents,
        procedure(const AJavaScriptResult: string; const AErrorCode: Integer)
        begin
          // AJavaScriptResult should now contain the page contents
        end
      );
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WebBrowser1.Navigate('http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm');
    end;
    
    end.
    

     

    2 hours ago, rvk said:

    Not sure whether that answer was wrong in 2017, but it's certainly incomplete now, given the above.


  7. 42 minutes ago, TTSander said:

    Then when I call

    
    TJXcBarcodeScanner.JavaClass.startScan;

    nothing happens.

    Does this mean you've moved on from attempting to generate a custom classes.dex?

     

    Going by their documentation, the init method needs to be called. (the one that takes a Context and a ScannerResult as parameters). This may present a problem because Delphi uses init as a method name for Java constructors, and XcBarcodeScanner has its own static method called init (which is not a constructor), so the JNI code may actually try and find a constructor method (and fail) rather than the actual method called init. I'm not sure if there's a solution for this yet, other than writing Java code of your own (that you would call from Delphi) that uses the XcBarcodeScanner class.

     

    Incidentally, I've managed to acquire the .jar file myself using information from the Github link you gave. 


  8. 2 hours ago, TTSander said:

    It's an SDK for connecting to the barcode scanner of MovFast-handhelds. I extracted the .jar-file from the supplied .aar file

    I've tried searching for this with not much success. Do you have a link?


  9. 5 minutes ago, TTSander said:

    I'm trying to generate a custom classes.dex file for our android app because I need to include a specific .jar-file

    What is the jar file, and is there some reason why just adding the jar to the project is not sufficient?


  10. 2 hours ago, Fudley said:

    However it is never overwritten

    Overwrite can be somewhat misleading. It refers to what happens when the file is deployed from the local file to the application package, not whether the file is overwritten when the app starts - this process occurs in the System.StartUpCopy unit (in the rtl\common folder of the Delphi source), and as evidenced by line 83 (at least in Delphi 12.1):

      if not FileExists(DestFileName) then //do not overwrite files

    ..when the files are put in their final destination, if the file exists it is not overwritten. A couple of possible workarounds:

     

    1. Patch the System.StartUpCopy unit so that it does overwrite 


    2. Use files with "versioned" filenames, e.g. fudley-1.0.0.db, and replace the entry in the deployment with the new version. In your apps startup code, look for files using pattern matching, e.g:

    uses
      System.IOUtils;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      LDBFiles: TArray<string>;
    begin
      LDBFiles := TDirectory.GetFiles(TPath.GetDocumentsPath, 'fudley-*.db', TSearchOption.soTopDirectoryOnly);
      // If there's only ever one file, it should be the value in LDBFiles[0], so rename that to fudley.db 
    end;

     


  11. 17 minutes ago, Lars Fosdal said:

    Took me a while to get past all the Ios island travel tips before finding this: https://developer.apple.com/design/human-interface-guidelines/live-activities

    Same thing happened to me re Ios Island 🙂

     

    Following the live activities link leads to: https://developer.apple.com/documentation/ActivityKit/displaying-live-data-with-live-activities

     

    Which talks about using Widget Extensions, which are yet to be possible in Delphi, however there's a slim chance that the extension can "talk" to Delphi code: https://blog.grijjy.com/2018/11/15/ios-and-macos-app-extensions-with-delphi/

     

    I have very little optimism about the possibility

     

    • Like 2
    • Thanks 1

  12. 6 hours ago, Peter J. said:

    I don't even have sdk 32 installed!

    targetSdkVersion refers to the highest API level that your app can target, not which API level in your SDK that you built against. If Play Store says your app targets API level 32, check AndroidManifest.xml in the project output folder for which you built the app for Play Store. You may just need to do a clean and rebuild to ensure that AndroidManifest.xml is updated.


  13. On 3/21/2024 at 5:44 AM, Rollo62 said:

    The ExoPlayer in its old form is deprecated, does this Alcinoe library also works in the new Media3-Version?

    No - the Alcinoe implementation is based on the old ExoPlayer (in the com.google.android.exoplayer2 namespace). I am working on an implementation that uses Media3, but only just today have experimental code working that plays a video from a nominated URI.

    • Like 2
×