fix: pre-fetch bincio wheel via RN networking to avoid ATS blocking HTTP in WKWebView

WKWebView blocks HTTP requests (ATS) even when NSAllowsLocalNetworking is set for
the app's own networking — so fetch(http://192.168.x.x/api/wheel/download) inside
the WebView always fails with 'Load failed' on iOS.

- extractActivity.ts: rename wheelUrl param to wheelBase64; WebView now receives
  the wheel as pre-fetched base64 bytes rather than a URL to fetch itself
- PyodideWebView.tsx: decode wheelBase64 → Uint8Array → Blob → blob URL for
  micropip.install; fix baseUrl '' → 'https://localhost' (null origin blocks fetch
  on iOS)
- import.tsx: add fetchWheelBase64() that resolves the wheel URL via
  /api/wheel/version then fetches with native networking (HTTP works); caches
  result in memory so repeated imports in one session don't re-download
This commit is contained in:
Davide Scaini
2026-04-24 23:13:24 +02:00
parent 966528a0bf
commit 84e5cead08
3 changed files with 44 additions and 26 deletions
+4 -2
View File
@@ -54,10 +54,12 @@ export function handleWebViewMessage(e: WebViewMessageEvent): void {
}
}
// wheelBase64 is the bincio .whl file pre-fetched by the React Native side
// (native networking supports HTTP on local network; WKWebView does not).
export function extractFile(
filename: string,
base64: string,
wheelUrl: string,
wheelBase64: string,
onStatus: (msg: string) => void = () => {},
): Promise<ExtractionResult> {
if (isExtracting) return Promise.reject(new Error('Another extraction is already in progress'));
@@ -67,7 +69,7 @@ export function extractFile(
isExtracting = true;
const reqId = String(++reqCounter);
const args = JSON.stringify({ reqId, filename, base64, wheelUrl });
const args = JSON.stringify({ reqId, filename, base64, wheelBase64 });
return new Promise<ExtractionResult>((resolve, reject) => {
pending.set(reqId, {