Chat v mobilnej aplikácii
Chat Otta zobrazíte v aplikácii pre Android aj iOS cez webové zobrazenie. Stačí otvoriť jednu adresu, nič sa neinštaluje.
Adresa chatu
https://ottoai.sk/m/<verejný kľúč>?lang=skVerejný kľúč je ten istý ako v kóde chatu na webe (data-otto-key). Tajný API kľúč aplikácia nepotrebuje. lang je sk, cs alebo en, bez neho platí jazyk z panela.

Čo stránka robí
- Chat je otvorený na celú obrazovku, bez bubliny, a rešpektuje výrez displeja.
- Krížik v hlavičke chat nezatvorí, ale pošle aplikácii udalosť
close. Obrazovku zatvorí aplikácia. - Odkazy a karty produktov neopustia chat, aplikácia dostane udalosť s adresou a sama rozhodne, kam ju otvorí.
- Rozhovor ostáva uložený v úložisku zobrazenia, po návrate do aplikácie pokračuje.
Udalosti pre aplikáciu
Stránka posiela správy cez most, ktorý aplikácia pripojí. Každá je JSON s "source": "otto".
| type | Kedy príde | Ďalšie polia |
|---|---|---|
ready | chat sa načítal a je otvorený | |
close | zákazník klikol na krížik alebo stlačil Esc | |
message | prišla odpoveď Otta alebo správa kolegu | role: bot alebo operator |
handoff | Otto odovzdal rozhovor kolegovi | |
resolved | kolega rozhovor uzavrel | |
productClick | zákazník klikol na kartu produktu | url |
link | zákazník klikol na iný odkaz | url |
error | chat je vypnutý alebo kľúč neplatí | reason: off alebo key |
Prihlásený zákazník
Ak chcete, aby kolega videl meno a e-mail prihláseného zákazníka, vložte pred načítaním stránky objekt window.ottoUser. Osobné údaje nikdy neposielajte v adrese. Príklady nižšie to ukazujú pre každú platformu.
Android (Kotlin)
Most pripojte cez androidx.webkit s povoleným pôvodom https://ottoai.sk, nie cez addJavascriptInterface.
val web = WebView(this)
web.settings.javaScriptEnabled = true
web.settings.domStorageEnabled = true
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER)) {
WebViewCompat.addWebMessageListener(web, "ottoChatBridge", setOf("https://ottoai.sk")) { _, sprava, _, _, _ ->
val u = JSONObject(sprava.data ?: "{}")
when (u.optString("type")) {
"close" -> finish()
"productClick", "link" -> startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(u.optString("url"))))
}
}
}
if (WebViewFeature.isFeatureSupported(WebViewFeature.DOCUMENT_START_SCRIPT)) {
WebViewCompat.addDocumentStartJavaScript(web,
"window.ottoUser = { name: 'Ján Novák', email: 'jan@example.sk' };", setOf("https://ottoai.sk"))
}
web.loadUrl("https://ottoai.sk/m/pk_vas_kluc?lang=sk")iOS (Swift)
final class OttoMost: NSObject, WKScriptMessageHandler {
var zatvor: () -> Void = {}
func userContentController(_ c: WKUserContentController, didReceive m: WKScriptMessage) {
guard m.frameInfo.securityOrigin.host == "ottoai.sk", let u = m.body as? [String: Any] else { return }
switch u["type"] as? String {
case "close": zatvor()
case "productClick", "link":
if let s = u["url"] as? String, let url = URL(string: s) { UIApplication.shared.open(url) }
default: break
}
}
}
let most = OttoMost()
let nastavenie = WKWebViewConfiguration()
nastavenie.userContentController.add(most, name: "ottoChat")
nastavenie.userContentController.addUserScript(WKUserScript(
source: "window.ottoUser = { name: 'Ján Novák', email: 'jan@example.sk' };",
injectionTime: .atDocumentStart, forMainFrameOnly: true))
let web = WKWebView(frame: .zero, configuration: nastavenie)
web.load(URLRequest(url: URL(string: "https://ottoai.sk/m/pk_vas_kluc?lang=sk")!))WKUserContentController si most drží silnou referenciou. Keď obrazovku zatvárate, zavolajte removeScriptMessageHandler(forName: "ottoChat").
React Native
import { WebView } from "react-native-webview";
import { Linking } from "react-native";
<WebView
source={{ uri: "https://ottoai.sk/m/pk_vas_kluc?lang=sk" }}
injectedJavaScriptBeforeContentLoaded={"window.ottoUser = { name: 'Ján Novák', email: 'jan@example.sk' }; true;"}
onMessage={(e) => {
const u = JSON.parse(e.nativeEvent.data);
if (u.type === "close") navigation.goBack();
if (u.type === "productClick" || u.type === "link") Linking.openURL(u.url);
}}
/>Flutter
final ovladac = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..addJavaScriptChannel('OttoChat', onMessageReceived: (sprava) {
final u = jsonDecode(sprava.message) as Map<String, dynamic>;
if (u['type'] == 'close') Navigator.of(context).pop();
if (u['type'] == 'productClick' || u['type'] == 'link') launchUrl(Uri.parse(u['url'] as String));
})
..loadRequest(Uri.parse('https://ottoai.sk/m/pk_vas_kluc?lang=sk'));webview_flutter nevie vložiť skript pred načítaním stránky, prihláseného zákazníka tu zatiaľ neodovzdáte.
Súkromie a obchody s aplikáciami
- Apple od novembra 2025 (pravidlo 5.1.2(i)) chce, aby aplikácia pred odoslaním osobných údajov do AI tretej strany jasne povedala, čo posiela, a získala súhlas. Ak odovzdávate
window.ottoUser, opýtajte sa zákazníka najprv. - V štítkoch súkromia App Store a vo formulári Data safety na Google Play uveďte správy chatu a údaje, ktoré chatu odovzdávate.
- Chat žije na
ottoai.sk. Do cudzieho rámca (iframe) ho vložiť nejde, vo webovom zobrazení aplikácie áno.

