API Bridge Wrapply: conecte o site a funções nativas do app
Guia prático das APIs bridge nativas da Wrapply para notificações, deeplinks, links de entrada, compras in-app e localização em apps Flutter gerados.
Referência Native Bridge
O app Flutter gerado expõe window.Wrapply dentro da WebView. O seu site pode chamar esse objeto para usar recursos nativos apenas quando o módulo correspondente estiver ativado. Aguarde sempre wrapplyNativeBridgeReady e trate sempre { ok:false, error } como um caso normal de fallback.
| API | Quando usar | Entrada | Resposta |
|---|---|---|---|
window.Wrapply.isNativeApp() | Detecta o wrapper nativo | none | true inside app |
notifications.requestPermission(payload) | Solicita permissão de notificações | { provider } | { ok, permission, granted } |
notifications.getToken(payload) | Lê ou atualiza o token do dispositivo | { provider, refresh? } | { ok, token, provider } |
notifications.refreshToken(payload) | Regenera o token. Alias: updateToken | { provider } | { ok, token, refreshed:true } |
notifications.show(payload) | Mostra uma notificação local imediata | { title, body?, data? } | { ok, shown:true } |
notifications.getStatus(payload) | Lê status do provedor e permissões | { provider } | { ok, granted, configured? } |
iap.getProducts(payload) | Lê produtos configurados na loja | { packageName, productIds } | { ok, available, products } |
iap.purchase(payload) | Inicia uma compra in-app | { packageName, productId, consumable? } | { ok, purchaseStarted } |
iap.restorePurchases(payload) | Restaura compras não consumíveis | { packageName } | { ok, latestPurchases } |
deepLinks.open(payload) | Abre URL interna, externa, telefone, email ou WhatsApp | { type, url/value } | { ok, type, url } |
wrapply://open/path | Abre o app instalado por email, SMS ou site externo | external link | loads https://DOMAIN/path |
Provedores de notificações
O site pode escolher o provedor de notificações em cada chamada. O Wrapply inclui somente o provedor selecionado no app gerado.
| Provedor | Uso | Configuração necessária | Nota importante |
|---|---|---|---|
| local | Padrão seguro, token local salvo em shared preferences | Nenhum arquivo externo | Útil para testes/sessão; não é token push remoto real |
| firebase | Provedor Firebase Cloud Messaging | android/app/google-services.json e opcional ios/Runner/GoogleService-Info.plist | Se os arquivos faltarem, retorna ok:false/configured:false |
| onesignal | Provedor OneSignal | OneSignal App ID na configuração/build | Exige setup OneSignal antes de enviar push remotas |
Permissões do dispositivo
Câmera, microfone e geolocalização usam APIs web padrão. O wrapper adiciona permissões nativas Android/iOS quando o recurso está ativo.
| Função | API web | Permissões nativas | Comportamento |
|---|---|---|---|
| Câmera | navigator.mediaDevices.getUserMedia({ video:true }) | Android CAMERA, iOS NSCameraUsageDescription | Usa API web padrão; o app mostra prompt nativo |
| Microfone | navigator.mediaDevices.getUserMedia({ audio:true }) | Android RECORD_AUDIO, iOS NSMicrophoneUsageDescription | Usa API web padrão; não exige chamada direta ao Wrapply |
| Geolocalização | navigator.geolocation.getCurrentPosition(...) | Android COARSE/FINE, texto iOS location usage | Localização precisa é opcional e deve ser ativada só quando necessário |
Exemplos por tipo de código
Estes exemplos são pequenos de propósito: mostram o padrão correto de integração, enquanto o PDF gerado lista os módulos ativos daquele 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" });
O que o bridge Wrapply faz
O bridge expõe uma API JavaScript dentro da WebView. Seu site pode chamar window.Wrapply e o app Flutter executa a ação nativa somente se a função foi ativada.
Ative somente os módulos necessários
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.
Exemplos JavaScript reais
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);
});
}
O que você recebe
Only selected dependencies, permissions and bridge files are included.
Firebase files, OneSignal App ID and iOS optional files are inserted only when requested.
Ao selecionar funções bridge, a Wrapply também fornece um PDF com chamadas exatas, módulos ativos e notas de configuração.
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?
Guia prático das APIs bridge nativas da Wrapply para notificações, deeplinks, links de entrada, compras in-app e localização em apps Flutter gerados.