我在 Android 中的 WebView 元素遇到问题。 我想用 JavaScript 和 CSS 显示本地 HTML 文件。
我的第一次尝试是直接使用本地文件: 当我使用
file://
方案时,它似乎不起作用。
所以我使用
http.server
创建了一个本地服务器,并调用 http://localhost:8000/file.html
。
import flet as ft
import http.server
import socketserver
import threading
import sys
import ssl
SERVER = "localhost"
PORT = 8000
HTML_DIRECTORY = "assets/html"
class HookHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=HTML_DIRECTORY, **kwargs)
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
def start_server():
with ThreadedTCPServer((SERVER, PORT), HookHandler) as httpd:
httpd.serve_forever()
def main(page: ft.Page):
wv = ft.WebView(
f"http://{SERVER}:{PORT}/file.html",
expand=True
)
page.add(wv)
server_thread = threading.Thread(target=start_server)
server_thread.daemon = True
server_thread.start()
app = ft.app(main)
但是当我访问这些文件时,出现安全错误 ERR_CLEARTEXT_NOT_PERMITTED。我找不到在 WebView 组件中禁用此安全性的方法。
因此,我已将 SSL 添加到我的服务器,并使用
localhost
的自签名证书,然后调用 http://localhost:8000/file.html
。
import flet as ft
import http.server
import socketserver
import threading
import sys
import ssl
SERVER = "localhost"
PORT = 8000
HTML_DIRECTORY = "assets/html"
class HookHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=HTML_DIRECTORY, **kwargs)
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
def get_ssl_context(certfile, keyfile):
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile, keyfile)
return context
def start_server():
with ThreadedTCPServer((SERVER, PORT), HookHandler) as httpd:
context = get_ssl_context("cert.pem", "key.pem")
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print("Serving at port", PORT)
httpd.serve_forever()
def main(page: ft.Page):
wv = ft.WebView(
f"https://{SERVER}:{PORT}/file.html",
expand=True,
)
page.add(url_input, submit_btn, wv)
server_thread = threading.Thread(target=start_server)
server_thread.daemon = True
server_thread.start()
app = ft.app(main)
当我打开我的申请表时,它是空白的。 如果我在 Android 的 Firefox 浏览器中打开相同的 URL,我会看到安全警报(因为证书是自签名的),但我可以检查“我没问题,继续”并且 HTML 文件已正确呈现。
我的问题:如何用Flet的WebView显示本地文件?
经过大量搜索,我找到了一个不能让我满意的解决方法:修改
Androidmanifest.xml
以添加android:usesCleartextTraffic="true"
属性。
但这意味着反编译APK,手动修改文件,编译一个新的APK,签署这个APK。
有没有办法在 flet build apk
命令中自动在此文件中添加自定义元素/属性?
修改
AndroidManifest.xml
:
AndroidManifest.xml
中的 flet-build-template\{{cookiecutter.out_dir}}\android\app\src\main
文件。--template-dir
选项。示例:
flet build apk --include-packages flet_webview --template-dir C:\Users\PhunkyBob\flet-build-template
APK 文件将使用此修改后的清单并正确签名。