Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   IdHTTP in Android Release Modus (https://www.delphipraxis.net/208152-idhttp-android-release-modus.html)

mtle 18. Jun 2021 13:50

IdHTTP in Android Release Modus
 
Hallo,
ich arbeite an einer Android (später auch IOS) App, die Dateien für den Offline-Modus bereitstellt.
Diese werden von einer Webseite geladen mit IdHTTP.

Das funktioniert auch alles unter Windows bzw auf Android im Debug-Modus. Sobald ich den Release Modus verwende, stürzt die Android-App beim ersten Online-Zugriff (IdHttp.Post/Get) ab. Berechtigungen sind identisch, der Abruf von zugehörigen Metadaten per RestClient funktioniert in der Release-Version. D.h. Zugriff auf Internet ist vorhanden.

Test Gerät läuft auf Android 11. Habe leider keine anderen Beiträge finden können, die mich einer Lösung näher gebracht haben.

LG
mtle

philipp.hofmann 18. Jun 2021 15:23

AW: IdHTTP in Android Release Modus
 
Geht es um https? Dann ist die Frage: Sind de SSL-Libraries im Release-Modus deployed? Diese muss man in beiden Konfigurationen in den Projekt-Deployment-Settings aufführen.

mtle 21. Jun 2021 07:48

AW: IdHTTP in Android Release Modus
 
:wall:
Danke, manchmal übersieht man die einfachsten Dinge.
Hab nicht dran gedacht, daß die Bereitstellung auch "doppelt" konfiguriert werden muß.

Stewag 16. Jul 2021 10:45

AW: IdHTTP in Android Release Modus
 
Ich habe gerade dasselbe Problem (Android App stürzt ab beim GET einer htpps Datei) jedoch arbeite ich nicht mit idHTTP sondern mit THTTPClient.
Damit sollten keine SSL Libs nötig sein.
Unter Windows klappt das einwandfrei, unter Android jedoch nicht.

Hier der Code:

Code:
procedure TFMain.FormCreate(Sender: TObject);
var
  mstream: TMemoryStream;

  function DownloadFile(const aURL: string; aStream: TStream): boolean;
  // THTTPClient benötigt im Gegensatz zu TidHTTP beim Download von htpps:// KEINE SSL Dateien!
  var
    vHTTP: THTTPClient;
  begin
    Assert(aStream <> nil);
    vHTTP := THTTPClient.Create;
    vHTTP.CustomHeaders['Pragma'] := 'no-cache';

    try
      Result := vHTTP.Get(aURL, aStream).StatusCode = 200;
    finally
      vHTTP.Free
    end
  end;

begin
  mstream := TMemoryStream.Create;

  try
    DownloadFile('https://www.[]', mstream);
    Memo1.Lines.LoadFromStream(mstream);
    mstream.Free;
  except
    // [kein Internet, lokal gespeicherten Dateiinhalt/Backup verarbeiten]
  end;

end

TiGü 16. Jul 2021 11:34

AW: IdHTTP in Android Release Modus
 
Delphi-Quellcode:
procedure TFMain.FormCreate(Sender: TObject);
var
  mstream: TMemoryStream;

  function DownloadFile(const aURL: string; aStream: TStream): boolean;
  // THTTPClient benötigt im Gegensatz zu TidHTTP beim Download von htpps:// KEINE SSL Dateien!
  var
    vHTTP: THTTPClient;
    vResponse: IHTTPResponse;
  begin
    Result := False;
    Assert(aStream <> nil);
    vHTTP := THTTPClient.Create;
    try
      vHTTP.CustomHeaders['Pragma'] := 'no-cache';
      vResponse := vHTTP.Get(aURL, aStream);
      if Assigned(vResponse) then
      begin
        Result := vResponse.StatusCode = 200;
      end else
      begin
          // kluge Log-Möglichkeit, damit man mitbekommt, das keine Instanz von IHTTPResponse zurückkommt
      end;
    finally
      vHTTP.Free
    end;
  end;

begin
  mstream := TMemoryStream.Create;
  try
    try
      DownloadFile('https://www.[]', mstream);
      Memo1.Lines.LoadFromStream(mstream);
    except
      // [kein Internet, lokal gespeicherten Dateiinhalt/Backup verarbeiten]
    end;
  finally
    mstream.Free;
  end;
end;
Wie ist es denn so?

Rollo62 16. Jul 2021 12:46

AW: IdHTTP in Android Release Modus
 
Ich sehe da zwei Probleme.

1. Der Request ist blocking
http://docwiki.embarcadero.com/RADSt...g_its_Response
Deshalb sollte man das besser asynchron in einem Thread aufrufen.

2. In FormCreate sollte man unter Mobile nichts machen.
Besser auf FormShow warten, und da dann irgendwelche längerdauernden Tasks machen.

Wird Android blockiert, insbesondere beim Startup, ist das meistens eine Garantie dass dich das OS killt.

Stewag 16. Jul 2021 14:12

AW: IdHTTP in Android Release Modus
 
Die erweiterte DownloadFile Function von TiGü und das Verschieben in OnShow hat leider nichts gebracht.

Mit Threads komme ich alleine nicht klar. Kann mir da bitte jemand mit einem Stück Code helfen?

zeras 16. Jul 2021 15:09

AW: IdHTTP in Android Release Modus
 
Zitat:

Zitat von Rollo62 (Beitrag 1492407)

.....

2. In FormCreate sollte man unter Mobile nichts machen.
Besser auf FormShow warten, und da dann irgendwelche längerdauernden Tasks machen.

Ist das wirklich so? Sollte man OnCreate bei Mobile vergessen?
Ich hole mir da meine Ini rein, initialisiere TTS, holen mit die Versionen etc.
Sollte ich das wirklich alles erst im Formshow machen?

Rollo62 16. Jul 2021 16:39

AW: IdHTTP in Android Release Modus
 
Ja, denn das System ist mit hochfahren beschäftigt.
Dauert da etwas zu lange wird man rausgeworfen.
Phones akzeptieren keine Geisterzustände.
Wenn der ViewController dann sichtbar ist, dann ist die App im Foreground, da kann der User machen was er will.
Aber längere Zeit blockieren geht auch da in die Hose, z.b. wenn ein Anruft kommt, dann fliegt die App wieder raus.

Du hast natürlich etwas Zeit, wenn es nicht lange blockiert Ok,
Aber eine hhtp Abfrage fällt da nicht drunter.

Stewag 21. Jul 2021 06:33

AW: IdHTTP in Android Release Modus
 
Der Fehler wurde an einer anderen Stelle verursacht. Ein thread ist für das GET nicht unbedingt erforderlich

Rollo62 21. Jul 2021 09:33

AW: IdHTTP in Android Release Modus
 
Dann würde ich trotzdem mal probieren was unter Android passiert wenn Du das machst
Delphi-Quellcode:
  ...
  vResponse := vHTTP.Get(aURL, aStream);
  Sleep( 60000 );
  ...
Wie lange lässt sich das dein Phone gefallen ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz