Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

AndroidでTWebBrowser(WebView)にCookieを設定してWEBサイトを表示する

~DelphiのTWebBrowser(WebView)でクッキー(Cookie)を設定してWEBサイトを表示するAndroidアプリ


Delphiを起動して新規作成を行う

Delphiを起動し、ファイル→新規作成→マルチデバイスアプリケーションをクリックし、 空のアプリケーションを選択してOKボタンを押してプロジェクトを作成します。
TButtonとTWebBrowserをフォームにドラッグ&ドロップします。
ターゲットプラットフォームをAndroid(実機をUSB接続している場合は実機)に切り替えます。
(以下の画像ではPixel 3a XLをダブルクリック)
すべて保存を押して、プロジェクトフォルダを作成してプロジェクトとユニットを保存します。


FMX.WebBrowser.Android.pasファイルをプロジェクトフォルダ内にコピーする

C:\Program Files (x86)\Embarcadero\Studio\20.0\source\fmx\FMX.WebBrowser.Android.pas
ファイルを、上記で保存したプロジェクトファイルと同じフォルダ内にコピーします。

FMX.WebBrowser.Android.pasファイルをプロジェクトに追加

プロジェクトに追加(Shift+F11)を押して、プロジェクトフォルダ内にコピーした「FMX.WebBrowser.Android.pas」ファイルを選択し、[開く]ボタンを押します。

ソースコードを記述する

Button1をダブルクリックしてソースコードを記述します。
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('Cookieを設定してTWebBrowser(WebView)で表示したいURL');
end;

(例)WebBrowser1.Navigate('https://mam-mam.net/sec/cookie.html');

参考:
AndroidのWebViewは、基本的にhttps(SSL/TLSが有効な)サイトを開くのが通常のようです。
http(SSL/TLS無効な)サイトを開く場合は、プロジェクトフォルダ内にある
AndroidManifest.template.xml
ファイルを編集して以下の赤文字の行を追加しましょう。
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%"
        android:usesCleartextTraffic="true"
        android:resizeableActivity="false">

FMX.WebBrowser.Android.pasの編集

プロジェクトフォルダ内にコピーしたFMX.WebBrowser.Android.pasファイルを編集します。

314行目あたりにあるTAndroidWebBrowserService.DoNavigate(const AURL: string)関数を編集します。
uses
  System.Classes, System.Types, System.StrUtils, System.SysUtils,  System.RTLConsts, Androidapi.JNI.Webkit,
  AndroidApi.JNI.App, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
  Androidapi.JNIBridge, Androidapi.JNI.Os, Androidapi.JNI.Net, Androidapi.Helpers, Androidapi.JNI.Widget, FMX.Forms, 
  FMX.Helpers.Android, FMX.Graphics, FMX.Surfaces, FMX.ZOrder.Android, FMX.Platform, FMX.Platform.Android, FMX.WebBrowser, FMX.Types;

・・・

procedure TAndroidWebBrowserService.DoNavigate(const AURL: string);
var
  NewURL: string;
  LFile: string;
  cm:JCookieManager;
begin
  NewURL := AURL;
  if Pos(TWebBrowser.FilesPref, AURL) <> 0 then
  begin
    LFile := Copy(AURL, length(TWebBrowser.FilesPref) + 1, length(AURL));
    if not FileExists(LFile) then
      raise EFileNotFoundException.Create(SSpecifiedFileNotFound);
    NewURL := ReplaceStr(NewURL, TWebBrowser.FilesPref, TWebBrowser.FilesPref + '/');
  end
  else if Pos('http', AURL) = 0 then
    Insert('http://', NewURL, 0);

  cm:=TJCookieManager.JavaClass.getInstance();
  cm.setAcceptCookie(true);
  cm.removeAllCookie;
  cm.setCookie(  //クッキーのURLとキーと値を設定
    StringToJString('https://mam-mam.net/'),
    StringToJString('key1=value1')
  );
  cm.setCookie(  //クッキーのURLとキーと値を設定
    StringToJString('https://mam-mam.net/'),
    StringToJString('key2=value2')
  );
  //クッキーを設定
  cm.setAcceptThirdPartyCookies(FWebView,true);

  FWebView.loadUrl(StringToJString(NewURL));
  ShouldStartLoading(NewURL);
  UpdateContentFromControl;
end;

実行

実行ボタンを押すと、アプリが実機に転送され、アプリが実行されます。
アプリが起動したら、Button1をタップすると、Cookieが設定されたてページが開きます

Copyright 2019 Mam