API jembatan JavaScript
Jendela
Layar penuh, picture-in-picture, warna bilah sistem, pemblokiran tangkapan layar, apakah build mengaktifkan perlindungan salin (AppMint.copyProtection), layar splash, dan menutup jendela.
AppMint.copyProtection helper#
AppMint.copyProtection
Contoh
true saat aplikasi dibuat dengan Perlindungan salin aktif; tidak ada (undefined) jika tidak. Hanya-baca - halaman tidak bisa menyalakan atau mematikan perlindungan, hanya menanyakan apakah aktif.
Mengembalikan: true, atau undefined saat perlindungan mati (dan di browser). Memerlukan: Perlindungan salin diaktifkan di Langkah 3 (Integrasi), di bawah Opsi Tampilan, saat Anda membuat aplikasi. Bawaan mati.
Dengan perlindungan aktif, teks aplikasi tidak bisa dipilih, disalin, atau dipotong; salin / potong, peristiwa contextmenu, dan Ctrl/Cmd + C, X, dan A dibatalkan di luar kolom yang bisa diedit; dan tidak ada menu tekan-lama yang muncul. Input, textarea, select, dan area contenteditable tetap sepenuhnya bisa diedit, sehingga formulir tetap berfungsi.
Sembunyikan tombol "Salin" Anda sendiri saat perlindungan aktif - tombol itu tidak akan menyalin apa pun dan tampak rusak:
const protectedApp = !!(window.AppMint && window.AppMint.copyProtection === true);
document.querySelectorAll('[data-copy-button]').forEach((btn) => {
btn.hidden = protectedApp;
});Atau pilih kata-kata sebuah petunjuk sekali saja, saat mulai:
const hint = document.getElementById('share-hint');
hint.textContent = (window.AppMint && window.AppMint.copyProtection === true)
? 'Tap Share to send this lesson to a friend.'
: 'Select any text to copy it, or tap Share.';Gabungkan dengan kunci tangkapan layar untuk halaman yang tidak boleh keluar dari aplikasi:
if (window.AppMint && AppMint.copyProtection === true && window.WebToApk && WebToApk.setSecureScreen) {
WebToApk.setSecureScreen(true); // also blocks screenshots and recents thumbnails
document.body.classList.add('protected');
}Catatan: Menu tekan-lama pada tautan dan gambar (buka, salin, bagikan, atau unduh) adalah sakelar build terpisah, Menu tekan-lama pada tautan dan gambar, di tempat yang sama. Defaultnya mati, jadi tekan-lama pada tautan tidak melakukan apa pun kecuali Anda mengaktifkannya; perlindungan salin selalu mematikannya. Halaman tetap bisa menolak menu pada satu elemen dengan membatalkan contextmenu (el.addEventListener('contextmenu', (e) => e.preventDefault())). Perlindungan menghentikan penyalinan di dalam aplikasi; ini tidak menghentikan tangkapan layar - untuk itu, lihat WebToApk.setSecureScreen(true).
screen.orientation standar web#
screen.orientation.lock(type) / unlock()
Contoh
Kunci Screen Orientation standar, yang ditolak WebView biasa: memutar aplikasi ke lanskap untuk video atau game dan kembali lagi.
Mengembalikan: lock(type) → sebuah Promise yang selesai begitu orientasi diminta; ditolak TypeError untuk tipe tidak dikenal dan NotSupportedError di Android TV. unlock() kembali ke orientasi yang dipakai saat aplikasi dibuat. Memerlukan: tidak ada.
const player = document.getElementById('player');
document.getElementById('fullscreen').addEventListener('click', async () => {
try {
await screen.orientation.lock('landscape'); // either landscape, follows the sensor
} catch (e) {
console.log('Could not rotate:', e.name);
}
player.classList.add('wide');
});
document.getElementById('done').addEventListener('click', () => {
screen.orientation.unlock();
player.classList.remove('wide');
});
screen.orientation.addEventListener('change', () => console.log(screen.orientation.type));Putar game ke lanskap saat dimulai; di Android TV layar sudah lanskap, jadi lanjutkan saja:
async function startGame() {
try {
await screen.orientation.lock('landscape');
} catch (e) {
if (e.name !== 'NotSupportedError') console.log('Could not rotate:', e.name);
}
runGame();
}
function quitGame() {
screen.orientation.unlock(); // back to the orientation the app was built with
showMenu();
}Ikuti bentuk video yang sedang diputar, dan kembali saat selesai:
const video = document.getElementById('clip');
video.addEventListener('play', () => {
const wide = video.videoWidth >= video.videoHeight;
screen.orientation.lock(wide ? 'landscape' : 'portrait').catch((e) => console.log(e.name));
});
video.addEventListener('ended', () => screen.orientation.unlock());Catatan: tipe: any, natural, portrait, portrait-primary, portrait-secondary, landscape, landscape-primary, landscape-secondary. Tidak seperti Chrome, halaman tidak harus dalam layar penuh lebih dulu. Aplikasi buatan AI memakai lockOrientation() dari @/lib/appmintNative.
window.close standar web#
window.close()
Contoh
Menutup layar utama aplikasi. Shell menggantikan window.close() sehingga tombol "Tutup" atau "Keluar" di halaman Anda berfungsi di dalam aplikasi.
Mengembalikan: tidak ada. Membutuhkan: tidak ada.
document.getElementById('exit-btn').onclick = function () {
saveDraft(); // anything unsaved — the screen closes at once
window.close(); // in the app: WebToApk.closeWindow(); in a browser: normal behaviour
};Sembunyikan tombol di browser, tempat window.close() biasanya tidak melakukan apa pun pada tab yang dibuka pengguna:
if (!window.WebToApk) document.getElementById('exit-btn').hidden = true;Tanya dulu, karena aplikasi langsung tertutup saat window.close() berjalan:
document.getElementById('quit').addEventListener('click', function () {
if (hasUnsavedChanges() && !confirm('You have unsaved changes. Close the app anyway?')) {
return;
}
window.close();
});Catatan: Penggantinya dipasang setelah setiap halaman selesai dimuat, jadi panggilan saat skrip pertama halaman berjalan memakai window.close() milik WebView sendiri (yang tidak melakukan apa pun). Tidak ada konfirmasi keluar di jalur ini. Popup masuk yang memanggil window.close() ditangani terpisah: ia menutup popup, bukan aplikasi.
__lockOrientation jembatan#
window.WebToApk.__lockOrientation(type: String): String
screen.orientation.lock(type): "ok", "type" untuk string yang bukan OrientationLockType, atau "unsupported" (Android TV selalu lanskap).
Contoh
Transport internal di balik screen.orientation.lock(type). Halaman memakai API standar; jangan pernah memanggil ini langsung - metode __ dapat berubah tanpa pemberitahuan.
Mengembalikan: 'ok', 'type' untuk string yang bukan jenis kunci orientasi, atau 'unsupported' (Android TV). Memerlukan: tidak ada yang perlu diaktifkan.
Gunakan API publik:
document.getElementById('play').addEventListener('click', async () => {
try { await screen.orientation.lock('landscape'); } catch (e) { /* NotSupportedError on TV */ }
});
document.getElementById('exit').addEventListener('click', () => screen.orientation.unlock());Bedakan jenis kunci yang salah dari perangkat yang tidak bisa berputar:
async function lockTo(type) {
if (!screen.orientation || typeof screen.orientation.lock !== 'function') return 'unsupported';
try {
await screen.orientation.lock(type);
return 'ok';
} catch (e) {
if (e instanceof TypeError) return 'bad-type'; // not an OrientationLockType string
return 'unsupported'; // NotSupportedError (Android TV)
}
}
lockTo('portrait-primary').then((r) => console.log('orientation lock:', r));Bekukan layar sesuai cara pengguna memegangnya saat mereka menandatangani, lalu kembalikan rotasi:
async function startSigning() {
const current = screen.orientation.type; // e.g. 'landscape-primary'
try { await screen.orientation.lock(current); } catch (e) { /* keep going unlocked */ }
showSignaturePad();
}
function finishSigning() {
hideSignaturePad();
screen.orientation.unlock();
}Catatan: Diimplementasikan di shell aplikasi (WebApiPolyfills.kt). Kode halaman yang sama berfungsi tanpa perubahan di Chrome.
__unlockOrientation jembatan#
window.WebToApk.__unlockOrientation()
screen.orientation.unlock(): kembali ke orientasi yang dipakai pembuat aplikasi saat membuat build.
Contoh
Transport internal di balik screen.orientation.unlock(). Halaman memakai API standar; jangan pernah memanggil ini langsung - metode __ dapat berubah tanpa pemberitahuan.
Mengembalikan: tidak ada; aplikasi kembali ke orientasi yang dipilih saat build. Memerlukan: tidak ada yang perlu diaktifkan.
Gunakan API publik:
document.getElementById('play').addEventListener('click', async () => {
try { await screen.orientation.lock('landscape'); } catch (e) { /* NotSupportedError on TV */ }
});
document.getElementById('exit').addEventListener('click', () => screen.orientation.unlock());Hanya rute game yang lanskap; setiap rute lain kembali ke orientasi aplikasi sendiri:
function onRouteChange(path) {
if (path.startsWith('/play')) {
screen.orientation.lock('landscape').catch(() => {});
} else if (screen.orientation && typeof screen.orientation.unlock === 'function') {
screen.orientation.unlock(); // menus, settings and the store
}
}
window.addEventListener('popstate', () => onRouteChange(location.pathname));
onRouteChange(location.pathname);Pertahankan slide onboarding tetap tegak, lalu buka kuncinya setelah selesai:
async function showOnboarding() {
try { await screen.orientation.lock('portrait'); } catch (e) { /* TV: no lock */ }
await runOnboardingSlides(); // your own flow
screen.orientation.unlock(); // back to the orientation the app was built with
}Catatan: Diimplementasikan di shell aplikasi (WebApiPolyfills.kt). Kode halaman yang sama berfungsi tanpa perubahan di Chrome.
__wakeLock jembatan#
window.WebToApk.__wakeLock(docId: String, held: Boolean): Boolean
Screen Wake Lock: [held] true menjaga layar tetap menyala selama dokumen [docId] memegang sentinel. Mengembalikan false saat kunci tidak bisa diambil.
Contoh
Jalur internal di balik navigator.wakeLock.request('screen') dan WakeLockSentinel.release(). Halaman memakai API standar; jangan panggil ini langsung - metode __ bisa berubah tanpa pemberitahuan.
Mengembalikan: true saat flag layar-menyala diterapkan untuk dokumen itu. Memerlukan: tidak ada yang perlu diaktifkan.
Gunakan API publik:
let lock = null;
async function keepScreenOn() {
if (!('wakeLock' in navigator)) return;
lock = await navigator.wakeLock.request('screen');
lock.addEventListener('release', () => { lock = null; });
}Ambil kunci lagi saat pengguna kembali ke aplikasi, karena setiap kunci dilepas di latar belakang:
let lock = null;
let wantLock = false;
async function acquire() {
if (!('wakeLock' in navigator)) return;
try {
lock = await navigator.wakeLock.request('screen');
lock.addEventListener('release', () => { lock = null; });
} catch (e) {
lock = null; // NotAllowedError: the page was not visible
}
}
function startRecipeMode() { wantLock = true; acquire(); }
function stopRecipeMode() { wantLock = false; if (lock) lock.release(); }
document.addEventListener('visibilitychange', () => {
if (wantLock && !lock && document.visibilityState === 'visible') acquire();
});Jaga layar tetap menyala hanya saat timer latihan berjalan, dan biarkan tidur lagi saat timer selesai:
async function runTimer(seconds) {
const lock = ('wakeLock' in navigator)
? await navigator.wakeLock.request('screen').catch(() => null)
: null;
try {
for (let left = seconds; left > 0; left--) {
showRemaining(left);
await new Promise((r) => setTimeout(r, 1000));
}
} finally {
if (lock && !lock.released) await lock.release();
}
}Catatan: Aplikasi melepas setiap kunci saat masuk ke latar belakang dan memicu appmint:wakelock-lost, yang melepas sentinel (peristiwa release mereka terpicu).
closeWindow jembatan#
window.WebToApk.closeWindow()
Gunakan wrapper promise: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // listing jika tidak ada sheet r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Lihat RatePrompt.
Dijelaskan oleh kelompoknya, Lembar ulasan dalam aplikasi Google Play, bukan sendiri-sendiri.
Contoh
Menutup layar utama aplikasi (sama seperti menekan Kembali di halaman terakhir). Halaman biasanya memanggil window.close() standar, yang diarahkan shell ke sini.
Mengembalikan: tidak ada. Membutuhkan: tidak ada.
document.getElementById('quit').onclick = function () {
if (confirm('Close the app?')) window.close(); // in the app: the screen closes
};Panggilan mentah melakukan hal yang sama:
if (window.WebToApk && typeof window.WebToApk.closeWindow === 'function') {
window.WebToApk.closeWindow();
}Tombol "Keluar" yang menyimpan dulu, dan disembunyikan di browser yang tidak punya layar aplikasi untuk ditutup:
var exitBtn = document.getElementById('exit-btn');
if (!(window.WebToApk && typeof window.WebToApk.closeWindow === 'function')) {
exitBtn.hidden = true;
} else {
exitBtn.onclick = async function () {
exitBtn.disabled = true;
await saveDraft(); // your own save; closing does not wait for anything
window.WebToApk.closeWindow();
};
}Catatan: Ini langsung menutup layar aplikasi - tanpa konfirmasi keluar, bahkan jika build memilikinya. Simpan dulu apa pun yang belum tersimpan. Di browser window.close() hanya menutup tab yang dibuka sendiri oleh skrip.
enterPip jembatan#
window.WebToApk.enterPip(): Boolean
Mengecilkan seluruh aplikasi menjadi jendela picture-in-picture mengambang sekarang - video atau panggilan yang ingin terus ditonton pengguna saat mereka pergi. Android 8+ dan hanya jika build mengaktifkan PiP (flag manifest yang dibutuhkannya); mengembalikan apakah jendela terbuka. Meninggalkan aplikasi dengan PiP aktif melakukan ini dengan sendirinya; ini adalah tombol "perkecil" yang eksplisit.
Contoh
Mengecilkan seluruh aplikasi menjadi jendela picture-in-picture mengambang kecil sekarang - tombol "perkecil" untuk video atau panggilan.
Mengembalikan: true jika jendela mengambang terbuka, false jika tidak (secara sinkron). Memerlukan: Picture-in-Picture (PiP) diaktifkan di Langkah 3 (Integrasi), di bawah Opsi Tampilan, saat Anda membuat aplikasi. Android 8+.
var pipBtn = document.getElementById('pip-btn');
pipBtn.onclick = function () {
if (!(window.WebToApk && typeof window.WebToApk.enterPip === 'function')) return;
var ok = window.WebToApk.enterPip();
if (!ok) pipBtn.hidden = true; // PiP not enabled in this build, or Android 7 and older
};Sesuaikan halaman dengan jendela kecil: jendelanya menjadi sangat sempit, jadi listener resize bisa menyembunyikan semuanya kecuali video.
window.addEventListener('resize', function () {
var small = window.innerWidth < 300;
document.querySelector('nav').style.display = small ? 'none' : '';
});Ikuti pembukaan dan penutupan jendela mengambang dengan peristiwa appmint:pip (detail.inPip), misalnya untuk menyembunyikan kontrol panggilan:
window.addEventListener('appmint:pip', function (e) {
var inPip = !!(e.detail && e.detail.inPip);
document.body.classList.toggle('pip', inPip); // CSS: .pip .call-controls { display: none; }
if (!inPip) {
document.getElementById('chat-panel').hidden = false; // back to the full-size screen
}
});
document.getElementById('minimise').onclick = function () {
if (window.WebToApk && typeof window.WebToApk.enterPip === 'function') {
document.getElementById('chat-panel').hidden = true;
window.WebToApk.enterPip();
}
};Catatan: Dengan PiP aktif, menekan Home sudah masuk ke jendela mengambang dengan sendirinya; metode ini hanya untuk tombol eksplisit. Ini mengembalikan false pada build tanpa sakelar PiP, karena flag manifest yang dibutuhkannya tidak ada. Ukuran jendela PiP dipilih oleh Android. Aplikasi buatan AI bisa memakai pip dari @/lib/appmintNative.
isFullscreen jembatan#
window.WebToApk.isFullscreen(): Boolean
Membiarkan halaman menyembunyikan bilah status (jam/baterai) dan bilah navigasi sendiri - mis. game yang masuk ke layar bermain: WebToApk.setFullscreen(true) // sembunyikan bilah sistem WebToApk.setFullscreen(false) // kembalikan WebToApk.toggleFullscreen() WebToApk.isFullscreen() Pilihan diingat di antara peluncuran. Tidak berpengaruh pada aplikasi yang sudah dikunci pembuatnya ke layar penuh/kios - tidak ada yang bisa dikembalikan di sana. Item menu samping "Layar penuh" adalah padanannya untuk pengguna akhir dan dikendalikan oleh opsi enableFullscreenToggle milik pembuat aplikasi; jembatan ini selalu tersedia untuk halaman aplikasi itu sendiri.
Dijelaskan oleh kelompoknya, Jembatan layar penuh, bukan sendiri-sendiri.
Contoh
Memberi tahu apakah bilah status dan navigasi Android sedang disembunyikan sekarang.
Mengembalikan: true / false, secara sinkron. Memerlukan: tidak ada.
function barsHidden() {
if (window.WebToApk && typeof window.WebToApk.isFullscreen === 'function') {
return window.WebToApk.isFullscreen();
}
return false; // in a browser
}
if (barsHidden()) {
document.getElementById('fs-btn').textContent = 'Exit fullscreen';
}Susun halaman sesuai pilihan yang diingat saat mulai, karena pilihan itu bertahan setelah restart:
document.addEventListener('DOMContentLoaded', function () {
var hidden = !!(window.WebToApk && typeof window.WebToApk.isFullscreen === 'function' &&
window.WebToApk.isFullscreen());
document.documentElement.classList.toggle('bars-hidden', hidden);
// CSS: .bars-hidden header { padding-top: env(safe-area-inset-top); }
});Letakkan tombol "tampilkan bilah" saat aplikasi dibuat layar penuh dan bilah tidak bisa kembali:
function showBars() {
var W = window.WebToApk;
if (!(W && typeof W.isFullscreen === 'function')) return;
W.setFullscreen(false);
setTimeout(function () { // the change is applied on the UI thread
if (W.isFullscreen()) {
document.getElementById('bars-btn').hidden = true;
}
}, 100);
}Catatan: Ini mengembalikan true saat pembuat aplikasi membuat aplikasi dengan Layar penuh atau Mode Kios Imersif, ATAU saat halaman memanggil setFullscreen(true) / toggleFullscreen(). Pada kasus pertama setFullscreen(false) tidak bisa mengembalikan bilah.
isSecureScreen jembatan#
window.WebToApk.isSecureScreen(): Boolean
WebToApk.setSecureScreen(true) // blokir tangkapan layar di halaman INI WebToApk.setSecureScreen(false) // lepaskan lebih awal WebToApk.isSecureScreen() // -> boolean Perlindungan milik halaman yang memintanya. Perlindungan dilepas begitu aplikasi berpindah ke tempat lain - dokumen baru, rute pushState, rute #hash - sehingga layar terlindungi tidak bisa membuat sisa aplikasi terkunci, dan halaman yang ingin perlindungan kembali setelah dimuat ulang cukup memintanya lagi. Yang dilakukannya: tangkapan layar, perekaman layar, casting, dan thumbnail layar recents semuanya berhenti selama aktif. Yang tidak bisa dilakukannya: menghentikan kamera yang diarahkan ke layar. Tidak ada yang bisa di Android, dan tidak ada jembatan di sini yang akan berpura-pura bisa.
Dijelaskan oleh kelompoknya, Perlindungan tangkapan layar, bukan sendiri-sendiri.
Contoh
Memberi tahu apakah perlindungan tangkapan layar (setSecureScreen) sedang aktif sekarang.
Mengembalikan: sebuah boolean, seketika. Memerlukan: tidak ada.
function updateLockIcon() {
var on = !!window.WebToApk &&
typeof window.WebToApk.isSecureScreen === 'function' &&
window.WebToApk.isSecureScreen();
document.getElementById('shield').hidden = !on;
}Periksa sebelum menampilkan nomor kartu, dan aktifkan perlindungan lebih dulu jika halaman ini belum memintanya:
function revealCardNumber(full) {
var W = window.WebToApk;
if (W && typeof W.isSecureScreen === 'function' && !W.isSecureScreen()) {
W.setSecureScreen(true); // the new state is committed when this returns
}
document.getElementById('card-number').textContent = full;
}Sakelar "Sembunyikan dari tangkapan layar" yang dimulai dari keadaan sebenarnya dan membaliknya:
var toggle = document.getElementById('privacy-toggle');
var W = window.WebToApk;
if (!W || typeof W.isSecureScreen !== 'function') {
toggle.hidden = true;
} else {
toggle.checked = W.isSecureScreen();
toggle.addEventListener('change', function () {
toggle.checked = W.setSecureScreen(!W.isSecureScreen());
});
}Catatan: Ini kembali ke false dengan sendirinya saat aplikasi berpindah ke halaman atau rute lain, karena perlindungan milik halaman yang memintanya.
setFullscreen jembatan#
window.WebToApk.setFullscreen(enabled: Boolean)
Membiarkan halaman menyembunyikan bilah status (jam/baterai) dan bilah navigasi sendiri - mis. game yang masuk ke layar bermain: WebToApk.setFullscreen(true) // sembunyikan bilah sistem WebToApk.setFullscreen(false) // kembalikan WebToApk.toggleFullscreen() WebToApk.isFullscreen() Pilihan diingat di antara peluncuran. Tidak berpengaruh pada aplikasi yang sudah dikunci pembuatnya ke layar penuh/kios - tidak ada yang bisa dikembalikan di sana. Item menu samping "Layar penuh" adalah padanannya untuk pengguna akhir dan dikendalikan oleh opsi enableFullscreenToggle milik pembuat aplikasi; jembatan ini selalu tersedia untuk halaman aplikasi itu sendiri.
Dijelaskan oleh kelompoknya, Jembatan layar penuh, bukan sendiri-sendiri.
Contoh
Menyembunyikan (true) atau menampilkan (false) bilah status dan bilah navigasi Android, misalnya saat game masuk ke layar bermain.
Mengembalikan: tidak ada. Memerlukan: tidak ada - selalu tersedia untuk halaman Anda. Pilihan diingat di antara peluncuran.
function enterPlayScreen() {
if (window.WebToApk && typeof window.WebToApk.setFullscreen === 'function') {
window.WebToApk.setFullscreen(true); // hide clock/battery and the nav bar
}
}
function leavePlayScreen() {
if (window.WebToApk && window.WebToApk.setFullscreen) {
window.WebToApk.setFullscreen(false); // bring the bars back
}
}Jauhkan konten Anda dari bawah lubang kamera saat bilah disembunyikan:
document.body.style.paddingTop = 'env(safe-area-inset-top)';
document.body.style.paddingBottom = 'env(safe-area-inset-bottom)';Sembunyikan bilah saat video diputar dan kembalikan saat dijeda atau selesai:
var video = document.getElementById('movie');
function hideBars(hidden) {
if (window.WebToApk && typeof window.WebToApk.setFullscreen === 'function') {
window.WebToApk.setFullscreen(hidden);
}
}
video.addEventListener('play', function () { hideBars(true); });
video.addEventListener('pause', function () { hideBars(false); });
video.addEventListener('ended', function () { hideBars(false); });Catatan: Ini tidak berpengaruh pada aplikasi yang dibuat dengan Layar penuh (atau Mode Kios Imersif) aktif di Langkah 3 (Integrasi) - pembuat aplikasi mengunci pilihan itu. Ini hanya menyembunyikan bilah Android; bilah atas aplikasi sendiri (yang punya tombol menu samping) adalah sakelar Tampilkan Bilah Atas. Saat diaktifkan, shell menambahkan viewport-fit=cover ke meta viewport Anda agar halaman tertata ke seluruh layar. Lihat toggleFullscreen dan isFullscreen. Aplikasi buatan AI bisa memakai fullscreen dari @/lib/appmintNative.
setSecureScreen jembatan#
window.WebToApk.setSecureScreen(enabled: Boolean): Boolean
Menetapkan perlindungan untuk halaman SAAT INI dan mengembalikan keadaan yang kini berlaku. Flag jendela diterapkan di thread UI, tetapi keadaan yang dikembalikan sudah final, jadi halaman bisa memanggil ini lalu langsung menampilkan konten sensitifnya tanpa menunggu callback.
Contoh
Memblokir tangkapan layar, perekaman layar, casting, dan pratinjau layar recents selama halaman SAAT INI menampilkan sesuatu yang pribadi.
Mengembalikan: sebuah boolean seketika - keadaan yang kini berlaku (nilai yang Anda kirim). Anda bisa menampilkan konten pribadi tepat setelah panggilan. Memerlukan: tidak ada.
function showStatement() {
if (window.WebToApk && typeof window.WebToApk.setSecureScreen === 'function') {
window.WebToApk.setSecureScreen(true);
}
render(statementView);
}Lepaskan sendiri hanya saat Anda menyembunyikan konten pribadi TANPA berpindah halaman (modal ditutup, tab berganti di dalam satu halaman):
function closeCardDetails() {
hide(cardDetailsModal);
if (window.WebToApk && typeof window.WebToApk.setSecureScreen === 'function') {
window.WebToApk.setSecureScreen(false);
}
}Tampilkan kode pemulihan sekali pakai hanya setelah penangkapan diblokir, karena panggilan menjawab dengan keadaan yang berlaku:
function revealRecoveryCode(code) {
var W = window.WebToApk;
if (!(W && typeof W.setSecureScreen === 'function')) {
alert('Open the app to see your recovery code.');
return;
}
if (W.setSecureScreen(true)) {
document.getElementById('recovery-code').textContent = code;
}
}Catatan: Perlindungan milik halaman yang memintanya. Perlindungan dilepas begitu aplikasi berpindah ke tempat lain - halaman baru, rute pushState atau rute #hash - jadi tidak ada yang perlu dibersihkan saat keluar, dan setelah dimuat ulang halaman harus memintanya lagi. Jangan terapkan ulang dengan timer: flag harus sudah aktif saat pengguna menekan tombol tangkapan layar. Tidak ada yang bisa menghentikan kamera yang diarahkan ke layar.
setStatusBarColor jembatan#
window.WebToApk.setStatusBarColor(color: String, style: String): Boolean
Mewarnai bilah status dan navigasi dengan [color] dan memilih warna ikon: [style] 'light' berarti ikon terang pada bilah gelap, 'dark' sebaliknya, '' membiarkan luminans yang menentukan. [color] adalah `#RGB`, `#RGBA`, `#RRGGBB`, `#AARRGGBB` (alfa DULU - urutan `#RRGGBBAA` CSS juga dibaca alfa-dulu) atau nama warna dasar ('black', 'navy'…); `rgb()`/`hsl()` tidak dibaca. Mengembalikan false saat warna tidak bisa diurai.
Contoh
Mewarnai bilah status Android dan memilih ikon terang atau gelap di atasnya.
Mengembalikan: true, atau false saat warna tidak bisa diurai (secara sinkron). Memerlukan: tidak ada.
style adalah 'light' (ikon terang, untuk bilah gelap), 'dark' (ikon gelap, untuk bilah terang), atau '' (shell memilih dari kecerahan warna):
function paintBar(color, style) {
if (window.WebToApk && typeof window.WebToApk.setStatusBarColor === 'function') {
return window.WebToApk.setStatusBarColor(color, style);
}
return false; // in a browser
}
paintBar('#0B0F1A', 'light'); // dark bar, light icons
paintBar('#FFFFFF', 'dark'); // white bar, dark icons
paintBar('#0E7C86', ''); // icons chosen automaticallyCocokkan bilah dengan setiap layar:
function showScreen(name) {
var colors = { home: '#0B0F1A', settings: '#FFFFFF' };
paintBar(colors[name] || '#0B0F1A', name === 'settings' ? 'dark' : 'light');
}Ikuti tema terang atau gelap ponsel, termasuk saat berganti ketika aplikasi sedang terbuka:
var darkTheme = window.matchMedia('(prefers-color-scheme: dark)');
function matchTheme() {
if (!(window.WebToApk && typeof window.WebToApk.setStatusBarColor === 'function')) return;
if (darkTheme.matches) {
window.WebToApk.setStatusBarColor('#121212', 'light');
} else {
window.WebToApk.setStatusBarColor('#F5F5F5', 'dark');
}
}
matchTheme();
darkTheme.addEventListener('change', matchTheme);Catatan: Warna berupa string warna Android: #RRGGBB atau #AARRGGBB (dan nama seperti red). Bentuk CSS seperti rgb(...) atau #RGB mengembalikan false. Ini juga berfungsi di Android 15+, tempat plugin StatusBar Capacitor tidak bisa mewarnai bilah. Saat bilah disembunyikan (layar penuh) warna disimpan untuk saat bilah kembali. Aplikasi buatan AI bisa memakai setStatusBar dari @/lib/appmintNative.
splashHold jembatan#
window.WebToApk.splashHold()
Menahan splash peluncuran bermerek sampai [splashReady] dipanggil. Secara bawaan splash tersembunyi begitu body memiliki elemen anak yang sudah ditata, yang bagi aplikasi yang menggambar kerangka lalu mengambil layar pertamanya berarti "splash, lalu kerangka". Aplikasi yang lebih suka menampilkan layar pertama yang sudah jadi memanggil ini saat impor dan [splashReady] begitu layar itu tampil. Dibatasi pada batas pengaman 6 detik yang sama dengan pemeriksaan tampilan, sehingga halaman yang tidak pernah melaporkan siap tetap terbuka.
Contoh
Menahan splash peluncuran aplikasi di layar sampai Anda memanggil splashReady() - sehingga pengguna melihat layar pertama Anda yang sudah jadi, bukan "splash, lalu kerangka pemuatan".
Mengembalikan: tidak ada. Membutuhkan: tidak ada.
Panggil sedini mungkin (di bagian atas skrip pertama Anda), lalu panggil splashReady() begitu layar pertama tergambar:
if (window.WebToApk && typeof window.WebToApk.splashHold === 'function') {
window.WebToApk.splashHold();
}
loadFirstScreen() // your own async start-up (fetch data, render)
.catch(function (err) { showError(err); })
.then(function () {
if (window.WebToApk && window.WebToApk.splashReady) window.WebToApk.splashReady();
});Tahan splash sampai gambar hero layar pertama selesai dimuat, agar aplikasi terbuka dengan gambar yang sudah jadi:
if (window.WebToApk && typeof window.WebToApk.splashHold === 'function') {
window.WebToApk.splashHold();
}
function releaseSplash() {
if (window.WebToApk && window.WebToApk.splashReady) window.WebToApk.splashReady();
}
var hero = document.getElementById('hero');
if (hero.complete) {
releaseSplash();
} else {
hero.addEventListener('load', releaseSplash);
hero.addEventListener('error', releaseSplash); // a broken image must not keep the splash up
}Tahan hanya saat layar pertama membutuhkan data, dan biarkan layar yang langsung tergambar terbuka seperti biasa:
var signedIn = !!localStorage.getItem('session');
if (signedIn && window.WebToApk && typeof window.WebToApk.splashHold === 'function') {
window.WebToApk.splashHold(); // the dashboard needs its data before it looks right
}
if (signedIn) {
loadDashboard().finally(function () {
if (window.WebToApk && window.WebToApk.splashReady) window.WebToApk.splashReady();
});
} else {
showLoginScreen(); // paints at once; the splash hides by itself
}Catatan: Tanpa splashHold() splash tersembunyi begitu body halaman memiliki elemen anak yang terlihat. Splash yang ditahan tetap tersembunyi sendiri setelah beberapa detik (batas pengaman yang sama dengan pemeriksaan tampilan normal), jadi halaman yang tidak pernah memanggil splashReady() tetap terbuka. Selalu panggil splashReady() juga di jalur kesalahan. Waktu splash minimum dari pembuat aplikasi tetap berlaku. Aplikasi buatan AI bisa memakai splash dari @/lib/appmintNative.
splashReady jembatan#
window.WebToApk.splashReady()
Layar pertama sudah tampil - sembunyikan splash peluncuran sekarang (dengan memperhatikan durasi splash minimum dari pembuat aplikasi). Idempoten; tidak berbahaya saat tidak ada yang ditahan.
Contoh
Memberi tahu shell bahwa layar pertama Anda sudah tampil, sehingga splash peluncuran tersembunyi sekarang.
Mengembalikan: tidak ada. Memerlukan: tidak ada. Aman dipanggil lebih dari sekali, dan tidak berbahaya saat tidak ada yang ditahan.
Ini berpasangan dengan splashHold():
if (window.WebToApk && window.WebToApk.splashHold) window.WebToApk.splashHold();
async function start() {
try {
var res = await fetch('/api/today');
renderToday(await res.json());
} catch (e) {
renderOfflineMessage();
} finally {
if (window.WebToApk && typeof window.WebToApk.splashReady === 'function') {
window.WebToApk.splashReady(); // hide the splash in every case
}
}
}
start();Tampilkan layar hanya setelah browser menggambar apa yang baru Anda render (dua animation frame):
renderApp(document.getElementById('root'));
requestAnimationFrame(function () {
requestAnimationFrame(function () {
if (window.WebToApk && typeof window.WebToApk.splashReady === 'function') {
window.WebToApk.splashReady();
}
});
});Tunggu beberapa pekerjaan awal, dan sembunyikan splash bahkan saat salah satunya gagal:
if (window.WebToApk && window.WebToApk.splashHold) window.WebToApk.splashHold();
Promise.allSettled([
loadProfile(), // your own start-up requests
loadFeed(),
document.fonts.ready // no flash of the wrong font
]).then(function (results) {
results.forEach(function (r) { if (r.status === 'rejected') console.warn(r.reason); });
if (window.WebToApk && typeof window.WebToApk.splashReady === 'function') {
window.WebToApk.splashReady();
}
});Catatan: Durasi splash minimum dari pembuat aplikasi tetap dipatuhi. Jika Anda tidak pernah memanggil splashHold(), splash tersembunyi sendiri saat halaman tampil, dan splashReady() tidak melakukan apa pun tambahan.
toggleFullscreen jembatan#
window.WebToApk.toggleFullscreen()
Membiarkan halaman menyembunyikan bilah status (jam/baterai) dan bilah navigasi sendiri - mis. game yang masuk ke layar bermain: WebToApk.setFullscreen(true) // sembunyikan bilah sistem WebToApk.setFullscreen(false) // kembalikan WebToApk.toggleFullscreen() WebToApk.isFullscreen() Pilihan diingat di antara peluncuran. Tidak berpengaruh pada aplikasi yang sudah dikunci pembuatnya ke layar penuh/kios - tidak ada yang bisa dikembalikan di sana. Item menu samping "Layar penuh" adalah padanannya untuk pengguna akhir dan dikendalikan oleh opsi enableFullscreenToggle milik pembuat aplikasi; jembatan ini selalu tersedia untuk halaman aplikasi itu sendiri.
Dijelaskan oleh kelompoknya, Jembatan layar penuh, bukan sendiri-sendiri.
Contoh
Mengalihkan bilah status dan navigasi Android antara tersembunyi dan tampil.
Mengembalikan: tidak ada. Memerlukan: tidak ada. Keadaan baru diingat di antara peluncuran.
Tombol "layar penuh" yang juga memperbarui labelnya sendiri:
var btn = document.getElementById('fs-btn');
if (window.WebToApk && typeof window.WebToApk.toggleFullscreen === 'function') {
btn.onclick = function () {
window.WebToApk.toggleFullscreen();
// The change is applied on the UI thread; read the state a moment later.
setTimeout(function () {
btn.textContent = window.WebToApk.isFullscreen() ? 'Exit fullscreen' : 'Fullscreen';
}, 100);
};
} else {
btn.hidden = true; // in a browser
}Ketuk dua kali foto atau tampilan baca untuk menyembunyikan atau menampilkan bilah:
var viewer = document.getElementById('photo-viewer');
viewer.addEventListener('dblclick', function () {
if (window.WebToApk && typeof window.WebToApk.toggleFullscreen === 'function') {
window.WebToApk.toggleFullscreen();
}
});Alihkan dengan tombol F pada keyboard fisik, tetapi tidak saat pengguna mengetik di kolom:
document.addEventListener('keydown', function (e) {
if (e.key !== 'f' || e.target.closest('input, textarea, [contenteditable]')) return;
if (window.WebToApk && typeof window.WebToApk.toggleFullscreen === 'function') {
e.preventDefault();
window.WebToApk.toggleFullscreen();
}
});Catatan: Ini tidak berpengaruh pada aplikasi yang dibuat dengan Layar penuh atau Mode Kios Imersif aktif (bilah tetap tersembunyi). Item menu samping "Layar penuh" untuk pengguna akhir adalah sakelar build terpisah (Tombol Layar Penuh di Langkah 3, di bawah Opsi Tampilan); metode jembatan ini berfungsi tanpanya.