API Bridge Wrapply: collega il sito alle funzioni native dell’app
Guida pratica alle API bridge native di Wrapply per notifiche, deeplink, link in ingresso, acquisti in-app e posizione nelle app Flutter generate.
Riferimento Native Bridge
L’app Flutter generata espone window.Wrapply dentro la WebView. Il tuo sito può chiamare questo oggetto per usare funzioni native solo quando il modulo relativo è stato abilitato in configurazione. Attendi sempre wrapplyNativeBridgeReady e gestisci sempre { ok:false, error } come normale caso di fallback.
| API | Quando usarla | Input | Risposta |
|---|---|---|---|
window.Wrapply.isNativeApp() | Rileva se il sito è dentro l’app nativa | none | true inside app |
notifications.requestPermission(payload) | Chiede il permesso notifiche | { provider } | { ok, permission, granted } |
notifications.getToken(payload) | Legge o aggiorna il token dispositivo | { provider, refresh? } | { ok, token, provider } |
notifications.refreshToken(payload) | Rigenera il token. Alias: updateToken | { provider } | { ok, token, refreshed:true } |
notifications.show(payload) | Mostra una notifica locale immediata | { title, body?, data? } | { ok, shown:true } |
notifications.getStatus(payload) | Legge stato provider e permessi | { provider } | { ok, granted, configured? } |
iap.getProducts(payload) | Legge i prodotti configurati nello store | { packageName, productIds } | { ok, available, products } |
iap.purchase(payload) | Avvia un acquisto in-app | { packageName, productId, consumable? } | { ok, purchaseStarted } |
iap.restorePurchases(payload) | Ripristina acquisti non consumabili | { packageName } | { ok, latestPurchases } |
deepLinks.open(payload) | Apre URL interni, esterni, telefono, email o WhatsApp | { type, url/value } | { ok, type, url } |
wrapply://open/path | Apre l’app installata da email, SMS o sito esterno | external link | loads https://DOMAIN/path |
Provider notifiche
Il sito può scegliere il provider notifiche in ogni chiamata. Wrapply include nell’app generata solo il provider selezionato.
| Provider | Uso | Configurazione richiesta | Nota importante |
|---|---|---|---|
| local | Default sicuro, token locale salvato in shared preferences | Nessun file esterno | Utile per test/sessione; non è un vero token push remoto |
| firebase | Provider Firebase Cloud Messaging | android/app/google-services.json e opzionale ios/Runner/GoogleService-Info.plist | Se mancano i file, il bridge torna ok:false/configured:false |
| onesignal | Provider OneSignal | OneSignal App ID in configurazione/build | Richiede setup OneSignal prima di inviare push remote |
Permessi dispositivo
Fotocamera, microfono e geolocalizzazione usano le API standard del browser. Il wrapper aggiunge i permessi nativi Android/iOS quando la funzione è attiva.
| Funzione | API web | Permessi nativi | Comportamento |
|---|---|---|---|
| Fotocamera | navigator.mediaDevices.getUserMedia({ video:true }) | Android CAMERA, iOS NSCameraUsageDescription | Usa API web standard; l’app gestisce il prompt nativo |
| Microfono | navigator.mediaDevices.getUserMedia({ audio:true }) | Android RECORD_AUDIO, iOS NSMicrophoneUsageDescription | Usa API web standard; non serve una chiamata Wrapply diretta |
| Geolocalizzazione | navigator.geolocation.getCurrentPosition(...) | Android COARSE/FINE, stringa iOS location usage | La posizione precisa è opzionale e va abilitata solo se serve |
Esempi per tipo di codice
Questi esempi sono volutamente essenziali: mostrano il pattern corretto di integrazione, mentre il PDF generato elenca i moduli attivi per quella specifica app.
Ready helper
if (window.Wrapply && window.Wrapply.__nativeBridgeReady) {
callback(window.Wrapply);
return;
}
window.addEventListener("wrapplyNativeBridgeReady", () => {
callback(window.Wrapply);
}, { once: true });
}
JavaScript
if (!window.Wrapply?.notifications) return alert("Available inside the app");
const permission = await window.Wrapply.notifications.requestPermission({ provider: "firebase" });
if (!permission.ok || !permission.granted) return;
const token = await window.Wrapply.notifications.getToken({ provider: "firebase" });
await fetch("/api/device-token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ token: token.token, platform: "wrapply" })
});
});
TypeScript
declare global {
interface Window {
Wrapply?: {
__nativeBridgeReady?: boolean;
isNativeApp: () => Promise<boolean>;
notifications?: {
requestPermission: (p: Record<string, unknown>) => WrapplyResponse;
getToken: (p: Record<string, unknown>) => WrapplyResponse;
refreshToken: (p: Record<string, unknown>) => WrapplyResponse;
updateToken: (p: Record<string, unknown>) => WrapplyResponse;
show: (p: Record<string, unknown>) => WrapplyResponse;
getStatus: (p: Record<string, unknown>) => WrapplyResponse;
};
iap?: { purchase: (p: Record<string, unknown>) => WrapplyResponse };
deepLinks?: { open: (p: Record<string, unknown>) => WrapplyResponse };
};
}
}
export {};
React
export function useWrapplyBridge() {
const [ready, setReady] = useState(false);
useEffect(() => {
if (window.Wrapply?.__nativeBridgeReady) return setReady(true);
const onReady = () => setReady(true);
window.addEventListener("wrapplyNativeBridgeReady", onReady);
return () => window.removeEventListener("wrapplyNativeBridgeReady", onReady);
}, []);
return { ready, Wrapply: ready ? window.Wrapply : null };
}
Vue 3
export function useWrapplyBridge() {
const ready = ref(false);
const markReady = () => { ready.value = true; };
onMounted(() => {
if (window.Wrapply?.__nativeBridgeReady) markReady();
else window.addEventListener("wrapplyNativeBridgeReady", markReady);
});
onBeforeUnmount(() => window.removeEventListener("wrapplyNativeBridgeReady", markReady));
return { ready };
}
Angular
export class WrapplyBridgeService {
async requestToken(provider = "firebase") {
if (!window.Wrapply?.notifications) {
return { ok: false, error: "Bridge unavailable" };
}
return window.Wrapply.notifications.getToken({ provider });
}
}
jQuery
if (!window.Wrapply?.notifications) return;
const result = await window.Wrapply.notifications.getToken({ provider: "local" });
$("#wrapply-output").text(JSON.stringify(result, null, 2));
});
PHP / Laravel Blade
<script>
async function buyNativeProduct() {
if (!window.Wrapply?.iap) return;
const result = await window.Wrapply.iap.purchase({
packageName: "{{ config('app.mobile_package') }}",
productId: "premium_monthly",
consumable: false
});
console.log(result);
}
</script>
WordPress
<script>
window.wrapplyNotify = async function () {
if (!window.Wrapply?.notifications) return;
return window.Wrapply.notifications.show({
title: "WordPress",
body: "Notification called from theme/plugin"
});
};
</script>
<?php });
Deep links
wrapply://open/profile
wrapply://open/checkout?plan=premium
wrapply://open/orders/123
// Native action inside the app
await window.Wrapply.deepLinks.open({ type: "internal_url", url: "https://example.com/account" });
await window.Wrapply.deepLinks.open({ type: "mailto", value: "support@example.com" });
await window.Wrapply.deepLinks.open({ type: "tel", value: "+390000000000" });
await window.Wrapply.deepLinks.open({ type: "whatsapp", value: "+390000000000" });
A cosa serve il bridge Wrapply
Il bridge espone una API JavaScript dentro la WebView. Il tuo sito può chiamare window.Wrapply e l’app Flutter generata esegue l’azione nativa solo se quella funzionalità è stata abilitata in configurazione.
Attiva solo i moduli necessari
Local/Firebase/OneSignal provider, permission request, token read/refresh and local notification display.
Open internal WebView URLs, external browser URLs, phone, email and WhatsApp from your website.
Open the installed app from a configured scheme or app link, then route the user to the right page.
Query store products, start purchase, restore purchases and send results to your backend for validation.
Add the native permission base for maps, nearby results or geolocation flows.
Setup flow
1. Configure features
Enable only the modules you need in the Wrapply configurator.
2. Add required files
Upload Firebase files or provider identifiers when the selected provider requires them.
3. Generate source code
Wrapply writes conditional dependencies, AndroidManifest entries, Info.plist keys and bridge modules.
4. Add JavaScript calls
Call window.Wrapply from your website only after checking the bridge exists.
5. Test before publishing
Test native permissions, tokens, purchases and links on real Android/iOS devices.
Esempi JavaScript reali
Use these calls from your website only after verifying that window.Wrapply exists.
Notifications
if (!window.Wrapply?.notifications) return;
await window.Wrapply.notifications.requestPermission({ provider: 'firebase' });
const token = await window.Wrapply.notifications.getToken({ provider: 'firebase' });
await fetch('/api/device-token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: token.token, platform: 'app' })
});
}
window.Wrapply?.notifications?.show({ title: 'Order updated', body: 'Your request is ready' });
Actions and deeplinks
window.Wrapply?.deepLinks?.open({ type: 'mailto', value: 'support@example.com' });
window.Wrapply?.deepLinks?.open({ type: 'tel', value: '+390000000000' });
window.Wrapply?.deepLinks?.open({ type: 'whatsapp', value: '+390000000000' });
window.Wrapply?.deepLinks?.open({ type: 'url', url: 'https://example.com/help' });
In-app purchases
if (!window.Wrapply?.iap) return;
await window.Wrapply.iap.getProducts({ productIds: ['premium_monthly'] });
const result = await window.Wrapply.iap.purchase({
productId: 'premium_monthly',
consumable: false,
applicationUserName: currentUser.id
});
await fetch('/api/iap/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(result)
});
}
Location
navigator.geolocation.getCurrentPosition((position) => {
console.log(position.coords.latitude, position.coords.longitude);
});
}
Cosa ricevi con le funzioni bridge
Only selected dependencies, permissions and bridge files are included.
Firebase files, OneSignal App ID and iOS optional files are inserted only when requested.
Quando selezioni funzionalità bridge, Wrapply fornisce anche una guida PDF con chiamate esatte, moduli abilitati e note di configurazione del progetto generato.
Payment, notification and permission modules should be tested before publishing.
FAQ bridge
Does the bridge work on the public website?
No. It works inside the generated app WebView. Always check window.Wrapply before calling native APIs.
Do I need a backend?
For Firebase push and in-app purchase validation, yes. The app exposes tokens and purchase events, but the backend should send messages and validate receipts.
Can Wrapply implement it?
Yes. Managed publishing can include configuration, testing and documentation for the enabled bridge modules.
Ready to connect native features?
Guida pratica alle API bridge native di Wrapply per notifiche, deeplink, link in ingresso, acquisti in-app e posizione nelle app Flutter generate.