मुफ़्त APK बनाएँ

JavaScript ब्रिज API

फ़ाइलें: इस ऐप से खोली गईं

"इससे खोलें" के ज़रिए दूसरे ऐप से मिली चीज़ को इकट्ठा करना, ऐसे चंक में जिन्हें पेज खुद खींचता है।

AppMint.getOpenedFile हेल्पर#

AppMint.getOpenedFile()

उदाहरण

आपके पेज को वह फ़ाइल देता है जो ऐप को शेयर की गई या ऐप से खोली गई ("इससे खोलें…"), चाहे आपका पेज कितनी भी देर से शुरू हो।

लौटाता है: Promise<object | null> - ऐप सामान्य रूप से खुला हो तो null। ऑब्जेक्ट में token, name, mimeType, size, kind, url, file, getFile() होते हैं, और सस्ता पड़े तो text (32 MB तक की टेक्स्ट फ़ाइलें) या base64 (8 MB तक की दूसरी डेटा फ़ाइलें) भी। kind 'image' | 'video' | 'audio' | 'document' | 'data' होता है। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें और उन फ़ाइल प्रकारों पर टिक करें जिन्हें आपका ऐप स्वीकार करता है।

async function handleStartFile() {
  if (!window.AppMint || typeof AppMint.getOpenedFile !== 'function') return;  // not in the app, or feature off
  const f = await AppMint.getOpenedFile();
  if (!f) return;                                  // opened normally
  console.log(f.name, f.mimeType, f.size, f.kind);
  if (f.kind === 'video') {
    document.querySelector('video').src = f.url;   // streams from disk, can seek
  } else if (f.kind === 'image') {
    document.querySelector('img').src = f.url;
  } else if (f.kind === 'document') {
    const file = await f.getFile();                // a real File
    await upload(file);
  } else {
    const text = typeof f.text === 'string' ? f.text : await f.file.text();
    importData(text);
  }
}
handleStartFile();

या सुनें - इवेंट (और वैकल्पिक window.onAppMintFileOpen हुक) हर नई फ़ाइल पर एक बार चलता है, उसी ऑब्जेक्ट के साथ जो detail:

window.onAppMintFileOpen = function (f) { console.log('hook:', f.name); };

window.addEventListener('appmint:fileopen', function (e) {
  const f = e.detail;             // {token, name, mimeType, size, kind, url, file, getFile, text?, base64?}
  showFile(f);
});
window.addEventListener('appmint:fileopenerror', function (e) {
  alert('Could not read ' + e.detail.name + ': ' + e.detail.error);   // detail: {name, error}
});

React ऐप में, एक छोटा हुक फ़ाइल को उठा लेता है, चाहे कॉम्पोनेंट कितनी भी देर से माउंट हो, और नई फ़ाइलों पर नज़र रखता है:

import { useEffect, useState } from 'react';

export function useOpenedFile() {
  const [file, setFile] = useState(null);
  useEffect(function () {
    const A = window.AppMint;
    if (!A || typeof A.getOpenedFile !== 'function') return;
    let alive = true;
    A.getOpenedFile().then(function (f) { if (alive && f) setFile(f); });
    function onOpen(e) { setFile(e.detail); }
    window.addEventListener('appmint:fileopen', onOpen);
    return function () { alive = false; window.removeEventListener('appmint:fileopen', onOpen); };
  }, []);
  return file;
}

नोट: इमेज, वीडियो, ऑडियो और 64 MB से बड़ी कोई भी फ़ाइल सिर्फ़ url के रूप में आती है (file null होता है); जब आपको सच में बाइट चाहिए हों तो f.getFile() कॉल करें। डेटा फ़ाइलें और दस्तावेज़ f.file के रूप में भी आते हैं। फ़ाइल आपके पेज के लिए तब तक रखी रहती है जब तक आप माँगें नहीं, इसलिए देर से माउंट होने वाला SPA भी उसे पा लेता है; हर बार नवीनतम फ़ाइल लौटाई जाती है। ऐप पहले से खुला हो और दूसरी फ़ाइल आए, तो इवेंट फिर से चलता है। काम पूरा होने पर कैश कॉपी खाली करने के लिए AppMint.releaseOpenedFile(f) कॉल करें।

AppMint.getOpenedFiles हेल्पर#

AppMint.getOpenedFiles()

उदाहरण

आपके पेज को इस सेशन में ऐप को शेयर की गई या ऐप से खोली गई हर फ़ाइल देता है - तब काम आता है जब उपयोगकर्ता एक साथ कई फ़ोटो शेयर करे।

लौटाता है: उन्हीं ऑब्जेक्ट की Promise<Array> जो AppMint.getOpenedFile() लौटाता है (token, name, mimeType, size, kind, url, file, getFile(), और सस्ता पड़े तो text / base64)। कुछ न मिला हो तो खाली ऐरे। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें और उन फ़ाइल प्रकारों पर टिक करें जिन्हें आपका ऐप स्वीकार करता है।

async function importShared() {
  if (!window.AppMint || typeof AppMint.getOpenedFiles !== 'function') return;
  const files = await AppMint.getOpenedFiles();
  const gallery = document.getElementById('gallery');
  files.forEach(function (f) {
    if (f.kind === 'image') {
      const img = document.createElement('img');
      img.src = f.url;
      img.alt = f.name;
      gallery.appendChild(img);
    } else {
      console.log('received', f.name, f.size + ' bytes');
    }
  });
}
importShared();

पेज खुला होने के दौरान आने वाली नई फ़ाइलें भी appmint:fileopen चलाती हैं, हर फ़ाइल पर एक इवेंट:

window.addEventListener('appmint:fileopen', function (e) { addToGallery(e.detail); });

उपयोगकर्ता ने जो कुछ शेयर किया, उसे एक ही रिक्वेस्ट में असली फ़ाइलों के रूप में अपलोड करना:

async function uploadShared() {
  if (!window.AppMint || typeof AppMint.getOpenedFiles !== 'function') return;
  const files = await AppMint.getOpenedFiles();
  if (!files.length) return;
  const form = new FormData();
  for (const f of files) {
    try {
      form.append('files', await f.getFile(), f.name);   // url-only media is fetched here
    } catch (e) {
      console.warn('skipped', f.name, e.message);        // released earlier
    }
  }
  await fetch('/api/upload', { method: 'POST', body: form });
}

नोट: सूची एक कॉपी है; और फ़ाइलें आने पर यह बढ़ती है। जिन फ़ाइलों को आपने AppMint.releaseOpenedFile(f) से रिलीज़ कर दिया, वे सूची में रहती हैं, लेकिन उनका url अब काम नहीं करता।

AppMint.releaseOpenedFile हेल्पर#

AppMint.releaseOpenedFile(file)

उदाहरण

ऐप को शेयर की गई या ऐप के साथ खोली गई फ़ाइल की ऐप की कैश कॉपी हटाता है, जब आपका पेज उसके साथ पूरा हो जाए।

लौटाता है: कुछ नहीं। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें।

async function importAndForget() {
  if (!window.AppMint || typeof AppMint.getOpenedFile !== 'function') return;
  const f = await AppMint.getOpenedFile();
  if (!f) return;
  const file = await f.getFile();        // take your own copy of the bytes first
  await saveToMyDatabase(file);
  AppMint.releaseOpenedFile(f);          // then free the cache on disk
}

शेयर किया गया वीडियो f.url से चलता है, इसलिए उसे तभी रिलीज़ करें जब प्लेबैक खत्म हो जाए:

async function playShared() {
  if (!window.AppMint || typeof AppMint.getOpenedFile !== 'function') return;
  const f = await AppMint.getOpenedFile();
  if (!f || f.kind !== 'video') return;
  const video = document.querySelector('video');
  video.src = f.url;
  video.play();
  video.addEventListener('ended', function () {
    video.removeAttribute('src');
    video.load();
    AppMint.releaseOpenedFile(f);        // the url stops working from here
  }, { once: true });
}

शेयर की गई फ़ोटो का एक बैच इम्पोर्ट करने के बाद, सभी कैश कॉपी एक साथ खाली करें:

async function importAllPhotos() {
  if (!window.AppMint || typeof AppMint.getOpenedFiles !== 'function') return;
  const files = await AppMint.getOpenedFiles();
  for (const f of files) {
    if (f.kind !== 'image') continue;
    const file = await f.getFile();      // fetched from f.url
    await savePhoto(file);
    AppMint.releaseOpenedFile(f);
  }
}

नोट: वही ऑब्जेक्ट दें जो आपको मिला था (उसका token ज़रूरी है)। जो File आप पहले ही ले चुके हैं वह वैध रहता है; url काम करना बंद कर देता है, और getFile() फ़ेल हो जाता है, जब तक File पहले से न ली जा चुकी हो। जो वीडियो आप अब भी f.url से चला रहे हैं उसे रिलीज़ न करें। ऐप की स्क्रीन बंद होने पर ये कॉपी अपने आप भी हट जाती हैं, इसलिए जल्दी रिलीज़ करने का फ़ायदा लंबे सेशन में डिस्क की जगह बचाना है।

openedFileChunk ब्रिज#

window.WebToApk.openedFileChunk(token: String, offset: String, len: Int): String

AppMint.getOpenedFile() / getOpenedFiles() / releaseOpenedFile() के लिए आंतरिक। पेज खुद खींचता है, उस पर धकेला नहीं जाता: कोल्ड स्टार्ट पर खुली फ़ाइल तब तक रखी रहती है जब तक माँगी न जाए, इसलिए देर से माउंट होने वाला SPA भी उसे पा लेता है। हर फ़ाइल के मेटाडेटा में `kind` (image | video | audio | document | data) और `url` होता है - https://appassets.androidplatform.net/appmint-shared/<token>/<name>, जो कैश कॉपी से बाइट रेंज के साथ परोसा जाता है, इसलिए शेयर किया गया वीडियो <video src> में स्ट्रीम होता है और सीक करता है। डेटा फ़ाइलें और दस्तावेज़ MAX_IO_CHUNK स्लाइस में File में खींचे जाते हैं; मीडिया और 64 MB से बड़ी कोई भी चीज़ सिर्फ़ url रहती है (getFile() माँगने पर लाता है), इसलिए 300 MB की क्लिप कभी JS ऐरे में नहीं रहती।

इसका वर्णन अलग से नहीं, बल्कि इसके समूह ऐप को शेयर की गईं या ऐप से खोली गईं फ़ाइलें में है।

उदाहरण

AppMint.getOpenedFile() के पीछे का आंतरिक हिस्सा: शेयर की गई या खोली गई फ़ाइल के बाइट का एक स्लाइस लौटाता है, जिसे हेल्पर File में जोड़ देता है। पेजों को पब्लिक API इस्तेमाल करना चाहिए - f.file, f.getFile() या f.url.

लौटाता है: (sync) offset से शुरू होने वाले अधिकतम len बाइट की एक base64 स्ट्रिंग (ऑफ़सेट स्ट्रिंग के रूप में दिया जाता है, इसलिए 2 GB से बड़ी फ़ाइलें भी काम करती हैं); फ़ाइल के अंत पर, अनजान या रिलीज़ किए गए टोकन पर, या पढ़ने में त्रुटि होने पर ""। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें।

पब्लिक API (इसे इस्तेमाल करें):

if (window.AppMint && typeof AppMint.getOpenedFile === 'function') {
  AppMint.getOpenedFile().then(function (f) {
    if (!f) return;
    return f.getFile().then(function (file) { console.log('got', file.size, 'bytes'); });
  });
}

हेल्पर इसके साथ क्या करता है, सिर्फ़ आर्गुमेंट समझाने के लिए:

if (window.WebToApk && typeof WebToApk.openedFileChunk === 'function') {
  const meta = JSON.parse(WebToApk.openedFilesPending() || '[]')[0];
  if (meta) {
    const b64 = WebToApk.openedFileChunk(meta.token, '0', WebToApk.openedFileMaxChunk());
    console.log('first slice is', atob(b64).length, 'bytes of', meta.size);
  }
}

बहुत बड़ी शेयर की गई फ़ाइल को स्लाइस के बिना पढ़ना - f.url को स्ट्रीम करें और प्रगति दिखाएँ (यहाँ CSV की पंक्तियाँ गिनते हुए):

async function countRows() {
  if (!window.AppMint || typeof AppMint.getOpenedFile !== 'function') return;
  const f = await AppMint.getOpenedFile();
  if (!f) return;
  const res = await fetch(f.url);                // served from disk, no base64 round trips
  if (!res.ok) throw new Error('shared file unavailable (' + res.status + ')');
  const reader = res.body.getReader();
  let seen = 0, rows = 0;
  for (;;) {
    const step = await reader.read();
    if (step.done) break;
    seen += step.value.length;
    for (let i = 0; i < step.value.length; i++) if (step.value[i] === 10) rows++;
    showProgress(seen / f.size);
  }
  console.log(rows + ' rows in ' + f.name);
}

नोट: len को 1 बाइट … 4 MB के बीच रखा जाता है। मीडिया फ़ाइलों के लिए f.url को स्ट्रीम करना स्लाइस खींचने से कहीं सस्ता है।

openedFileCollected ब्रिज#

window.WebToApk.openedFileCollected(token: String)

AppMint.getOpenedFile() / getOpenedFiles() / releaseOpenedFile() के लिए आंतरिक। पेज खुद खींचता है, उस पर धकेला नहीं जाता: कोल्ड स्टार्ट पर खुली फ़ाइल तब तक रखी रहती है जब तक माँगी न जाए, इसलिए देर से माउंट होने वाला SPA भी उसे पा लेता है। हर फ़ाइल के मेटाडेटा में `kind` (image | video | audio | document | data) और `url` होता है - https://appassets.androidplatform.net/appmint-shared/<token>/<name>, जो कैश कॉपी से बाइट रेंज के साथ परोसा जाता है, इसलिए शेयर किया गया वीडियो <video src> में स्ट्रीम होता है और सीक करता है। डेटा फ़ाइलें और दस्तावेज़ MAX_IO_CHUNK स्लाइस में File में खींचे जाते हैं; मीडिया और 64 MB से बड़ी कोई भी चीज़ सिर्फ़ url रहती है (getFile() माँगने पर लाता है), इसलिए 300 MB की क्लिप कभी JS ऐरे में नहीं रहती।

इसका वर्णन अलग से नहीं, बल्कि इसके समूह ऐप को शेयर की गईं या ऐप से खोली गईं फ़ाइलें में है।

उदाहरण

AppMint.getOpenedFile() के पीछे का आंतरिक हिस्सा: शेयर की गई या खोली गई फ़ाइल को इकट्ठा की हुई चिह्नित करता है, ताकि वह अब "नई" के रूप में न दिखे, लेकिन उसकी कैश कॉपी बनी रहे। पेजों को पब्लिक API इस्तेमाल करना चाहिए; इसे सीधे कॉल करने की कोई वजह नहीं है।

लौटाता है: कुछ नहीं। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें।

पब्लिक API (इसे इस्तेमाल करें) - हर फ़ाइल एक बार इकट्ठा होकर आपके पेज को दी जाती है:

if (window.AppMint && typeof AppMint.getOpenedFiles === 'function') {
  AppMint.getOpenedFiles().then(function (files) {
    files.forEach(function (f) { console.log(f.name, f.kind); });
  });
}
window.addEventListener('appmint:fileopen', function (e) { console.log('new file', e.detail.name); });

स्टार्टअप पर इकट्ठा की गई फ़ाइल सूची में भी होती है और इवेंट से भी बताई जाती है, इसलिए हर फ़ाइल को एक ही बार प्रोसेस करने के लिए अपनी हैंडलिंग token से तय करें:

const handled = new Set();
function handleOnce(f) {
  if (handled.has(f.token)) return;
  handled.add(f.token);
  addToInbox(f);
}
window.addEventListener('appmint:fileopen', function (e) { handleOnce(e.detail); });
if (window.AppMint && typeof AppMint.getOpenedFiles === 'function') {
  AppMint.getOpenedFiles().then(function (files) { files.forEach(handleOnce); });
}

जो फ़ाइल पढ़ी न जा सके वह भी इकट्ठा की जाती है; उसकी रिपोर्ट एक बार appmint:fileopenerror के ज़रिए होती है, इसके बजाय appmint:fileopen:

window.addEventListener('appmint:fileopenerror', function (e) {
  const d = e.detail;             // {name, error}
  showBanner('Could not open "' + d.name + '". Try sharing it again.');
  console.warn('opened file failed:', d.error);
});

नोट: इसे खुद कॉल करने से फ़ाइल AppMint.getOpenedFile() और appmint:fileopen इवेंट से छिप जाएगी, और किसी को मिलेगी भी नहीं। कैश कॉपी खाली करने के लिए इस्तेमाल करें AppMint.releaseOpenedFile(f).

openedFileMaxChunk ब्रिज#

window.WebToApk.openedFileMaxChunk(): Int

AppMint.getOpenedFile() / getOpenedFiles() / releaseOpenedFile() के लिए आंतरिक। पेज खुद खींचता है, उस पर धकेला नहीं जाता: कोल्ड स्टार्ट पर खुली फ़ाइल तब तक रखी रहती है जब तक माँगी न जाए, इसलिए देर से माउंट होने वाला SPA भी उसे पा लेता है। हर फ़ाइल के मेटाडेटा में `kind` (image | video | audio | document | data) और `url` होता है - https://appassets.androidplatform.net/appmint-shared/<token>/<name>, जो कैश कॉपी से बाइट रेंज के साथ परोसा जाता है, इसलिए शेयर किया गया वीडियो <video src> में स्ट्रीम होता है और सीक करता है। डेटा फ़ाइलें और दस्तावेज़ MAX_IO_CHUNK स्लाइस में File में खींचे जाते हैं; मीडिया और 64 MB से बड़ी कोई भी चीज़ सिर्फ़ url रहती है (getFile() माँगने पर लाता है), इसलिए 300 MB की क्लिप कभी JS ऐरे में नहीं रहती।

इसका वर्णन अलग से नहीं, बल्कि इसके समूह ऐप को शेयर की गईं या ऐप से खोली गईं फ़ाइलें में है।

उदाहरण

AppMint.getOpenedFile() के पीछे का आंतरिक हिस्सा: सबसे बड़ा स्लाइस जो openedFileChunk एक कॉल में लौटाता है (4 MB)। पेजों को पब्लिक API इस्तेमाल करना चाहिए, जो पहले से इसी आकार के स्लाइस में पढ़ता है।

लौटाता है: (sync) बाइट की एक संख्या (4194304)। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें।

पब्लिक API (इसे इस्तेमाल करें):

if (window.AppMint && typeof AppMint.getOpenedFile === 'function') {
  AppMint.getOpenedFile().then(function (f) {
    if (f && f.file) console.log('pulled in 4 MB slices:', f.file.size, 'bytes');
  });
}

कच्चा कॉल, अगर आपको सिर्फ़ संख्या जाननी हो:

if (window.WebToApk && typeof WebToApk.openedFileMaxChunk === 'function') {
  console.log('slice size', WebToApk.openedFileMaxChunk());
}

धीमे इम्पोर्ट की प्रोफ़ाइलिंग करते समय, अंदाज़ा लगाना कि हेल्पर इंतज़ार कर रही हर फ़ाइल के लिए कितने ब्रिज कॉल करेगा:

if (window.WebToApk && typeof WebToApk.openedFileMaxChunk === 'function') {
  const slice = WebToApk.openedFileMaxChunk();
  JSON.parse(WebToApk.openedFilesPending() || '[]').forEach(function (m) {
    console.log(m.name, (m.size / 1048576).toFixed(1) + ' MB =', Math.ceil(m.size / slice), 'slice(s)');
  });
}

नोट: फ़ाइल-एक्सेस ब्रिज के getMaxIoChunkSize() जितनी ही सीमा।

openedFileRelease ब्रिज#

window.WebToApk.openedFileRelease(token: String)

AppMint.getOpenedFile() / getOpenedFiles() / releaseOpenedFile() के लिए आंतरिक। पेज खुद खींचता है, उस पर धकेला नहीं जाता: कोल्ड स्टार्ट पर खुली फ़ाइल तब तक रखी रहती है जब तक माँगी न जाए, इसलिए देर से माउंट होने वाला SPA भी उसे पा लेता है। हर फ़ाइल के मेटाडेटा में `kind` (image | video | audio | document | data) और `url` होता है - https://appassets.androidplatform.net/appmint-shared/<token>/<name>, जो कैश कॉपी से बाइट रेंज के साथ परोसा जाता है, इसलिए शेयर किया गया वीडियो <video src> में स्ट्रीम होता है और सीक करता है। डेटा फ़ाइलें और दस्तावेज़ MAX_IO_CHUNK स्लाइस में File में खींचे जाते हैं; मीडिया और 64 MB से बड़ी कोई भी चीज़ सिर्फ़ url रहती है (getFile() माँगने पर लाता है), इसलिए 300 MB की क्लिप कभी JS ऐरे में नहीं रहती।

इसका वर्णन अलग से नहीं, बल्कि इसके समूह ऐप को शेयर की गईं या ऐप से खोली गईं फ़ाइलें में है।

उदाहरण

AppMint.releaseOpenedFile(f) के पीछे का आंतरिक हिस्सा: टोकन से, शेयर की गई या खोली गई फ़ाइल की कैश कॉपी हटाता है। पेजों को पब्लिक API इस्तेमाल करना चाहिए।

लौटाता है: कुछ नहीं। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें।

पब्लिक API (इसे इस्तेमाल करें):

async function useAndRelease() {
  if (!window.AppMint || typeof AppMint.getOpenedFile !== 'function') return;
  const f = await AppMint.getOpenedFile();
  if (!f) return;
  const file = await f.getFile();       // keep your own copy first
  await store(file);
  AppMint.releaseOpenedFile(f);         // calls WebToApk.openedFileRelease(f.token)
}

उपयोगकर्ता शेयर की गई फ़ाइल को इम्पोर्ट किए बिना हटा देता है - कैश कॉपी तुरंत खाली करें:

async function offerImport() {
  if (!window.AppMint || typeof AppMint.getOpenedFile !== 'function') return;
  const f = await AppMint.getOpenedFile();
  if (!f) return;
  const box = showImportPrompt(f.name, f.size);   // your own "Import / Discard" UI
  box.querySelector('.discard').addEventListener('click', function () {
    AppMint.releaseOpenedFile(f);
    box.remove();
  });
  box.querySelector('.import').addEventListener('click', async function () {
    await store(await f.getFile());
    AppMint.releaseOpenedFile(f);
    box.remove();
  });
}

जिस फ़ाइल को ऐप इस्तेमाल नहीं कर सकता, उसे मना करते ही रिलीज़ कर दिया जाता है:

window.addEventListener('appmint:fileopen', function (e) {
  const f = e.detail;
  if (!/\.(gpx|tcx)$/i.test(f.name)) {
    alert(f.name + ' is not a GPX or TCX activity file.');
    AppMint.releaseOpenedFile(f);
    return;
  }
  importActivity(f.text);                // gpx/tcx arrive as text
});

नोट: रिलीज़ के बाद, f.url त्रुटि लौटाता है और उस टोकन के लिए openedFileChunk "" लौटाता है। जो File ऑब्जेक्ट आपके पास पहले से है उस पर असर नहीं पड़ता।

openedFilesPending ब्रिज#

window.WebToApk.openedFilesPending(): String

बाहरी पेज को कुछ नहीं मिलता: फ़ाइलें ऐप के अपने पेज के लिए रखी रहती हैं।

उदाहरण

AppMint.getOpenedFile() / AppMint.getOpenedFiles() के पीछे का आंतरिक हिस्सा: शेयर की गई या खोली गई उन फ़ाइलों की सूची देता है जिन्हें पेज ने अभी इकट्ठा नहीं किया (सिर्फ़ मेटाडेटा, बाइट नहीं)। पेजों को पब्लिक API इस्तेमाल करना चाहिए।

लौटाता है: (sync) एक JSON स्ट्रिंग: {token, name, mimeType, size, isText, kind, url} की एक ऐरे। कुछ भी इंतज़ार में न हो तो []। ज़रूरत: बिल्ड करते समय Receive Shares From Other Apps चालू करें (इसके बिना सूची हमेशा खाली रहती है और AppMint हेल्पर इंस्टॉल नहीं होते)।

पब्लिक API (इसे इस्तेमाल करें):

if (window.AppMint && typeof AppMint.getOpenedFile === 'function') {
  AppMint.getOpenedFile().then(function (f) {
    if (f) console.log('opened with the app:', f.name, f.kind);
  });
}
window.addEventListener('appmint:fileopen', function (e) { console.log('arrived:', e.detail.name); });

सिर्फ़ डीबगिंग के लिए - देखें कि क्या इंतज़ार में है, उसे इकट्ठा किए बिना:

if (window.WebToApk && typeof WebToApk.openedFilesPending === 'function') {
  const waiting = JSON.parse(WebToApk.openedFilesPending() || '[]');
  console.log(waiting.length + ' file(s) waiting', waiting.map(function (m) { return m.name; }));
}

ऐसी फ़ाइल को डीबग करना जो पेज तक कभी नहीं पहुँची - देखें कि क्या अब भी इंतज़ार में है और वह f.file के रूप में आएगी या सिर्फ़ f.url:

if (window.WebToApk && typeof WebToApk.openedFilesPending === 'function') {
  const STREAM_LIMIT = 64 * 1024 * 1024;   // the helper's url-only threshold
  JSON.parse(WebToApk.openedFilesPending() || '[]').forEach(function (m) {
    const urlOnly = m.kind === 'image' || m.kind === 'video' || m.kind === 'audio' || m.size > STREAM_LIMIT;
    console.log(m.name, m.mimeType, m.size + ' bytes',
      urlOnly ? 'will come as url only' : 'will be pulled into f.file',
      m.isText ? '(text)' : '');
  });
}

नोट: हेल्पर load के बाद और हर नई फ़ाइल आने पर इन्हें अपने आप इकट्ठा करता है, इसलिए पेज को यहाँ शायद ही कुछ दिखता है। इकट्ठा होने के बाद फ़ाइल इस सूची से हट जाती है, लेकिन रिलीज़ होने तक पढ़ी जा सकती है।

हर डॉक्स बिल्ड पर ऐप रनटाइम और उसकी उदाहरण फ़ाइलों से बनाया जाता है। Markdown में पढ़ें · सभी फ़ैमिली.

2026-10-03 को शिप किए गए ब्रिज से मिलाकर जाँचा गया।