Modul SMS Gateway nahrazuje Odoo IAP pro odesilani SMS. Misto cloudove sluzby pouziva fyzicke Android telefony jako SMS brany. Kazdy telefon se sparuje s Odoo pomoci QR kodu a automaticky odesilajici SMS z fronty.
| Komponenta | Popis |
|---|---|
sms_gateway |
Odoo modul - spravuje telefony, frontu, API endpointy |
sms-gateway-app |
React Native (Expo) aplikace pro Android |
sms.gateway.phone |
Model reprezentujici jeden registrovany telefon |
sms.sms |
Rozsireny o gateway_phone_id a gateway_state
|
sms, mass_mailing_sms,
phone_validation
qrcode (pro generovani QR kodu)pip install qrcode[pil]
sms_gateway do adresare Odoo addons:
cp -r extra/sms/sms_modules/sms_gateway /path/to/odoo/addons/
sms_gateway je vzajemne
exkluzivni s sms_httpsms. Pokud pouzivate sms_httpsms,
odinstalujte ho pred instalaci sms_gateway.
Stahnete nejnovejsi release APK z
GitHub Releases.
Na telefonu otevrete stazeny .apk soubor a povolte instalaci z neznamych zdroju.
SEND_SMS a READ_SMS, ktera vyzaduji specialni review.
Sideloading APK z GitHub Releases je zamysleny zpusob distribuce.
npx expo)cd sms-gateway-app
# Instalace zavislosti
npm install
# Prebuild nativniho projektu (nutne pro nativni moduly)
npx expo prebuild
# Spusteni na pripojenem telefonu
npx expo run:android
# NEBO build release APK pres EAS
eas build --profile production-apk --platform android
gh release create v1.x.x ./build/*.apk \
--repo Varyshop/sms-gateway-app \
--title "v1.x.x" \
--notes "Release notes"
| Opravneni | Ucel |
|---|---|
SEND_SMS |
Odesilani SMS bez otevreni aplikace |
RECEIVE_SMS |
Cteni prichozich SMS (detekce STOP) |
READ_PHONE_STATE |
Cteni cisel SIM karet |
READ_PHONE_NUMBERS |
Cteni telefonniho cisla |
CAMERA |
Skenovani QR kodu |
| Pole | Popis | Priklad |
|---|---|---|
| Name | Nazev telefonu | Telefon 1 - O2 |
| Phone Number | Hlavni cislo (mezinarodni format) | +420777123456 |
| Phone Number 2 | Druhe cislo (dual SIM, volitelne) | +420608987654 |
| Daily Limit | Max SMS za den | 500 |
| SMS per Minute | Max SMS za minutu (rate limit) | 100 |
| Heartbeat Timeout | Po kolika minutach bez heartbeatu = offline | 5 |
{
"type": "sms_gateway",
"url": "https://vas-odoo-server.cz",
"api_key": "nahodny_bezpecnostni_token"
}
Ahoj {{ object.name }}! Mate 20% slevu na vse.
Nakupte na https://www.example.cz/akce
STOP pro odhlaseni
https://vas-server.cz/r/ABC123/s/42). Puvodni odhlasovaci
odkazy se nahradi textem STOP pro odhlaseni.
Pouzijte Odoo domain filtr pro vyber prijemcu:
| Priklad filtru | Popis |
|---|---|
[("category_id", "in", [10])] |
Kontakty s kategorii ID 10 |
[("country_id.code", "=", "CZ")] |
Ceske kontakty |
[("customer_rank", ">", 0)] |
Pouze zakazniky |
[("opt_out", "=", False)] |
Pouze ti, co se neodhlasili |
Kazdy gateway telefon muze mit nastaven Partner Domain Filter. Tento filtr urcuje, ktere SMS se budou prirazovat danemu telefonu na zaklade partnera prijemce.
sms.sms._send() prirazuje SMS do fronty, hleda
dostupne telefony
domain_filter se overi, zda
partner prijemce odpovida filtru
| Scenar | Domain Filter | Vysvetleni |
|---|---|---|
| Telefon pro VIP zakazniky | [("category_id", "in", [10])] |
Pouze zakaznici s kategorii "VIP" (ID 10) |
| Telefon pro Prahu | [("state_id.name", "=", "Praha")] |
Pouze zakaznici z Prahy |
| Telefon pro vsechny | (prazdne) | Prijima SMS pro vsechny partnery |
| Telefon pro firmy | [("is_company", "=", True)] |
Pouze firmy, ne fyzicke osoby |
failure_type='sms_server'). Doporucujeme mit alespon jeden
telefon bez filtru jako fallback.
sms.sms zaznamy ve stavu outgoing
_send() priradi kazde SMS gateway telefonu a zmeni stav na
pending
Pokud se SMS nevytvorily automaticky:
Kampan lze pozastavit bez zruseni:
Vsechny URL v SMS tele jsou automaticky prevadeny na kratke trackovaci odkazy:
| Faze | Priklad |
|---|---|
| Puvodni text | Nakupte na https://www.example.cz/akce |
| Po konverzi | Nakupte na https://vas-server.cz/r/ABC123 |
| Po prirazeni SMS ID | Nakupte na https://vas-server.cz/r/ABC123/s/42 |
link.tracker zaznam s kratky kodem a UTM parametry
/s/{sms_id} pro identifikaci konkretniho prijemce
mailing.trace (ktery prijemce klikl)https://www.example.cz/akce?utm_campaign=Q1_2025&utm_medium=sms&utm_source=kampan
Automaticky pridavane pri presmerovani:
| Parametr | Hodnota | Zdroj |
|---|---|---|
utm_campaign |
Nazev kampane | mailing.mailing.campaign_id |
utm_medium |
"sms" | mailing.mailing.medium_id |
utm_source |
Nazev zdroje | mailing.mailing.source_id |
System podporuje dva zpusoby odhlaseni z SMS kampani:
/sms-gateway/inbound
phone.blacklist
Odoo standardne generuje odhlasovaci URL ve formatu
/sms/{mailing_id}/{trace_code}. Nas modul tyto URL
nahrazuje textem "STOP pro odhlaseni", protoze:
Odoo pouziva model phone.blacklist z modulu
phone_validation:
+420777123456)
SMS Marketing > Configuration > Phone Blacklist
| Metrika | Popis | Jak se meri |
|---|---|---|
| Sent | Pocet uspesne odeslanych SMS | sms.sms ve stavu sent |
| Delivered | Dorucene SMS | = sent + opened + replied |
| Clicked | Prijemci co klikli na odkaz | mailing.trace s links_click_datetime |
| Click Rate | Procento kliknuti | (unikatni kliknuti / celkem odeslano) × 100 |
| Bounced | Neplatna cisla | mailing.trace ve stavu bounce |
| Failed | Chyba odeslani | mailing.trace ve stavu error |
Kazdy odkaz v SMS ma vlastni link.tracker zaznam:
| Limit | Kde se nastavuje | Popis |
|---|---|---|
| Daily Limit | sms.gateway.phone |
Max SMS za den na telefon. Pocitadlo sent_today se
resetuje o pulnoci.
|
| SMS per Minute | sms.gateway.phone |
Max SMS za minutu. Aplikace pocita delay mezi SMS:
60000 / rate_limit ms.
|
| Android SMS limit | OS Android | Android standardne omezuje na ~30 SMS za 30 minut. Muze byt zmenen v nastaveni. |
rate_limit na kazdem gateway telefonu
(napr. 100 SMS/min)
60000 / rate_limit milisekund
daily_limit, neni mu prirazena zadna
dalsi SMS
adb shell settings put global sms_outgoing_check_max_count 10000
System podporuje telefony s dvema SIM kartami:
phone_number a
phone_number_2
SimManager modulu
Vsechny endpointy vyzaduji hlavicku X-API-Key s platnym API
klicem gateway telefonu.
Odeslani heartbeatu a ziskani stavu fronty.
// Request
{
"phone_numbers": ["+420777123456", "+420608987654"],
"battery_level": 85,
"signal_strength": -70
}
// Response
{
"success": true,
"pending_count": {"+420777123456": 12, "+420608987654": 5},
"rate_limit": 100
}
Ziskani SMS cekajicich na odeslani.
// Request
{"phone_numbers": ["+420777123456"], "limit": 20}
// Response
{
"success": true,
"sms_list": [
{
"id": 123,
"phone_number": "+420999888777",
"message": "Text SMS zpravy...",
"uuid": "abc-123-def",
"gateway_phone_number": "+420777123456"
}
]
}
Potvrzeni stavu odeslani SMS.
// Request - uspech
{"status": "sent"}
// Request - chyba
{"status": "error", "error_message": "Permission denied"}
// Request - probihajici
{"status": "sending"}
// Response
{"success": true}
Nahlaseni prichozi SMS (pro STOP detekci). Zprava se ulozi do modelu sms.gateway.inbound a pokud obsahuje STOP, cislo se prida na blacklist.
// Request
{
"from_number": "+420999888777",
"message": "STOP",
"to_number": "+420777123456"
}
// Response
{
"success": true,
"blacklisted": true,
"partner_found": true
}
Hromadne nahlaseni vice prichozich SMS najednou. Od v1.2.0 aplikace posila vsechny prijate
SMS (nejen STOP) na server. Server provadi deduplikaci podle kombinace from_number + to_number + message + received_at,
takze opakovane odeslani stejnych zprav (napr. pri rescan inboxu) nevytvori duplicity.
// Request
{
"messages": [
{
"from_number": "+420999888777",
"message": "STOP",
"to_number": "+420777123456",
"received_at": "2026-03-22T10:30:00Z"
},
{
"from_number": "+420111222333",
"message": "Dekuji za informaci",
"to_number": "+420777123456",
"received_at": "2026-03-22T11:15:00Z"
}
]
}
// Response
{
"success": true,
"processed": 2,
"duplicates_skipped": 0
}
Vsechny prichozi SMS se ukladaji do modelu sms.gateway.inbound:
| Pole | Typ | Popis |
|---|---|---|
from_number |
Char | Cislo odeslatele (E.164) |
to_number |
Char | Cislo gateway telefonu, na ktere SMS prisla |
message |
Text | Obsah SMS zpravy |
received_at |
Datetime | Cas prijmu zpravy na telefonu |
partner_id |
Many2one | Nalezeny partner podle cisla odeslatele (muze byt prazdne) |
is_stop |
Boolean | Zda zprava obsahuje klicove slovo STOP |
is_blacklisted |
Boolean | Zda je cislo odeslatele na blacklistu |
gateway_phone_id |
Many2one | Odkaz na sms.gateway.phone |
Statistiky gateway telefonu.
// Response
{
"success": true,
"phones": [
{
"id": 1,
"name": "Telefon 1 - O2",
"phone_number": "+420777123456",
"phone_number_2": null,
"state": "online",
"sent_today": 142,
"daily_limit": 500,
"sent_total": 4582,
"pending_count": 23,
"rate_limit": 100
}
]
}
Registrace FCM tokenu pro push notifikace. Telefon posle svuj FCM token po sparovani nebo kdyz se token obnovi.
// Request
{
"fcm_token": "dK3xP9...dlouhy_firebase_token"
}
// Response - uspech
{
"success": true,
"message": "FCM token registered"
}
// Response - FCM neni povoleno
{
"success": true,
"message": "FCM not enabled, token ignored"
}
Hromadne potvrzeni stavu vice SMS najednou. Efektivnejsi nez jednotlive /confirm/{sms_id} volani.
// Request
{
"results": [
{"sms_id": 123, "status": "sent"},
{"sms_id": 124, "status": "sent"},
{"sms_id": 125, "status": "error", "error_message": "Number unreachable"}
]
}
// Response
{
"success": true,
"processed": 3
}
Od verze v18.0.2.2.0 modul obsahuje modely pro SMS marketing primo z mobilni aplikace. Admin definuje segmenty a sablony v Odoo, operator je pouziva z appky bez pristupu do backendu.
Definuje skupinu prijemcu (napr. „Neobjednali 3 mesice“).
| Pole | Typ | Popis |
|---|---|---|
name | Char | Nazev segmentu (prekladatelny) |
code | Char, unique | Slug (no_order_3m, one_order_only, new_customers_30d) |
domain_filter | Char | Deklarativni Odoo domena, napr. [("country_id.code", "=", "CZ")]. Pokud je nastavena, pouzije se misto code-based logiky. |
sequence | Integer | Poradi v seznamu |
active | Boolean | Aktivni/neaktivni |
description | Text | Popis zobrazeny v appce |
| Code | Nazev | Logika |
|---|---|---|
no_order_3m | Neobjednali 3 mesice | SQL: partneri s objednavkou, ale zadnou za 90 dni |
one_order_only | Jedina objednavka | SQL: partneri s presne 1 potvrzenou objednavkou |
new_customers_30d | Novi zakaznici (30 dni) | Domain: [("create_date", ">=", today - 30d)] |
| Metoda | Popis |
|---|---|
_get_domain() |
Vrati zakladni Odoo domain segmentu. Pouzije domain_filter nebo dispatchuje na _domain_{code}(). |
_get_full_domain(phone, exclude_contacted_days) |
Single source of truth — sklada kompletni domain: segment + blacklist + phone filter + exclusion kontaktovanych. |
_get_storable_domain(phone, exclude_contacted_days) |
Vraci domain vhodnou pro ulozeni do mailing_domain. Deklarativni segmenty se ulozi jako citelna domena; SQL segmenty se pre-resolvi na ('id', 'in', [...]). |
_resolve_recipient_ids(phone, exclude_days, limit) |
Resolvi domain na seznam partner ID. Pouziva se pro pocty a preview. |
_get_recipient_count(phone, exclude_days) |
Spocita pocet odpovidajicich partneru. |
_get_exclusion_domain(days) |
Vrati domain leaf vylucujici partnery kontaktovane v poslednich N dnech (SQL na mailing_trace). |
domain_filter se automaticky pridava v
_get_full_domain(), takze domena telefonu a segmentu se vzdy kombinuji.
SMS sablona prirazena ke gateway telefonu.
| Pole | Typ | Popis |
|---|---|---|
name | Char | Nazev sablony |
body | Text | Text SMS (muze obsahovat {{object.name}}) |
phone_id | Many2one → sms.gateway.phone | Prirazeny telefon |
segment_ids | Many2many → sms.marketing.segment | Povolene segmenty |
default_limit | Integer (100) | Vychozi navrh poctu prijemcu |
max_limit | Integer (500) | Hard cap na pocet prijemcu |
exclude_contacted_days | Integer (0) | Vyloucit partnery kontaktovane v poslednich N dnech |
| Pole | Typ | Popis |
|---|---|---|
gateway_phone_forced_id | Many2one → sms.gateway.phone | Vynuceny telefon pro vsechny SMS v kampani |
recipient_limit | Integer | Max pocet prijemcu |
marketing_template_id | Many2one → sms.marketing.template | Zpetny odkaz na sablonu |
created_from_app | Boolean | Vytvoreno z mobilni appky |
paused | Boolean | Pozastavena kampan (neodesila se, ale SMS jsou ve fronte) |
Endpointy pro mobilni appku umoznujici vytvorit a sledovat SMS kampane
bez pristupu do Odoo backendu. Vsechny endpointy: POST,
auth pres X-API-Key, JSON body/response.
Vrati sablony prirazene k telefonu identifikovanemu API klicem.
// Response
{
"success": true,
"templates": [
{
"id": 1,
"name": "Akce tento tyden",
"body": "Ahoj {{object.name}}! Mate slevu 20%...",
"segments": [
{"id": 1, "name": "Neobjednali 3 mesice", "code": "no_order_3m"},
{"id": 2, "name": "Jedina objednavka", "code": "one_order_only"}
],
"default_limit": 100,
"max_limit": 500,
"exclude_contacted_days": 14
}
]
}
Pro kazdý segment spocita pocet odpovidajicich prijemcu (vcetne phone domain filtru a exclusion).
// Request
{"template_id": 1}
// Response
{
"success": true,
"filters": [
{
"id": 1,
"code": "no_order_3m",
"name": "Neobjednali 3 mesice",
"description": "Partneri s objednavkou ale zadnou za 90 dni",
"recipient_count": 342
}
]
}
Nahled kampane — pocet prijemcu a renderovany text s ukázkovym partnerem.
// Request
{"template_id": 1, "segment_id": 1, "limit": 200}
// Response
{
"success": true,
"recipient_count": 200,
"preview_text": "Ahoj Jan Novak! Mate slevu 20%...",
"template_name": "Akce tento tyden",
"segment_name": "Neobjednali 3 mesice"
}
Vytvori mailing.mailing s plnym trackingem. Prijima volitelny custom_body (uprava textu z appky) a send_now prepinac.
// Request
{
"template_id": 1,
"segment_id": 1,
"limit": 200,
"custom_body": "Upraveny text SMS...",
"send_now": true
}
// Response
{
"success": true,
"campaign_id": 42,
"recipient_count": 200,
"state": "sending"
}
send_now=false, kampan se vytvori ve stavu
in_queue s paused=true. SMS jsou ve fronte, ale neodesílají se
dokud operator nestiskne „Odeslat ihned“ v appce (endpoint assign-sim).
domain_filter
se do mailing_domain ulozi citelna domena (napr. [("country_id.code", "=", "CZ"), ...]).
Pro SQL segmenty se pre-resolvi na kompaktni [("id", "in", [1, 2, 3, ...])].
Priradi gateway telefon a SIM k SMS v kampani. Pouziva stejnou logiku jako akce „Send via Gateway“ v Odoo.
// Request — jedina SIM (nebo auto-prirazeni bez SIM cisla)
{
"campaign_id": 42,
"mode": "single",
"sim_number": "+420777123456"
}
// Request — rozdeleni mezi vice SIM
{
"campaign_id": 42,
"mode": "split",
"sim_numbers": ["+420777123456", "+420608987654"]
}
// Response
{
"success": true,
"assigned": 200,
"message": "Assigned 200 SMS to phone"
}
outgoing/error (neprirazene) a pending bez SIMsms_provider='gateway', gateway_phone_id, gateway_sim_numbersplit rozdeluje SMS round-robin mezi vsechny SIMstate='sending', paused=FalseSeznam kampani vytvorených z appky pro dany telefon.
// Response
{
"success": true,
"campaigns": [
{
"id": 42,
"name": "Akce tento tyden - 04.04.2026 10:30",
"state": "done",
"date_created": "2026-04-04 10:30:00",
"total": 200,
"sent": 195,
"pending": 0,
"error": 5,
"clicked": 42,
"total_clicks": 67,
"order_count": 8,
"revenue": 12400.0,
"optout": 3
}
]
}
Detail kampane s marketingovymi statistikami.
// Response
{
"success": true,
"id": 42,
"name": "Akce tento tyden - 04.04.2026 10:30",
"state": "done",
"total": 200,
"sent": 195,
"pending": 0,
"error": 5,
"clicked": 42,
"total_clicks": 67,
"order_count": 8,
"revenue": 12400.0,
"optout": 3,
"created_at": "2026-04-04 10:30:00"
}
| Pole | Popis | Zdroj |
|---|---|---|
clicked | Unikatni prijemci co klikli | mailing.trace s links_click_datetime |
total_clicks | Celkovy pocet kliknuti (vcetne opakovanych) | link.tracker.click pres UTM campaign |
order_count | Pocet objednavek z kampane | sale.order s campaign_id = UTM kampan |
revenue | Celkovy prijem z objednavek | Soucet amount_total z matchujicich objednavek |
optout | Pocet odhlasenych (STOP) | mailing.trace ve stavu cancel |
| Problem | Pricina | Reseni |
|---|---|---|
| Telefon je stale Offline | Heartbeat nedochazi na server |
|
| SMS se neodesilaji | Aplikace nema opravneni SEND_SMS | Otevre nastaveni Android > Aplikace > SMS Gateway > Opravneni > povolit SMS |
| SMS ve fronte ale zadny telefon neprijima | Zadny telefon neodpovida domain_filter | Zkontrolujte domain_filter na gateway telefonech. Alespon jeden by mel byt bez filtru. |
| Vsechny SMS maji stav error | Zadny gateway telefon neni online | Ujistete se ze aplikace bezi, je sparovana a posila heartbeaty |
| Daily limit dosazeny prilis brzo | Pocitadlo sent_today | Zvyste daily_limit nebo pridejte dalsi telefony. Reset je o pulnoci (cron). |
| Android blokuje SMS po 30 zpravach | Hardwarovy limit Androidu |
Pouzijte ADB prikaz:
adb shell settings put global sms_outgoing_check_max_count
10000
|
| STOP neprida cislo na blacklist | Aplikace nema opravneni RECEIVE_SMS | Povolte opravneni RECEIVE_SMS v nastaveni Android |
| Odkazy v SMS nefunguji | Spatna konfigurace web.base.url | V Odoo nastavte spravne System Parameters > web.base.url (musi byt verejne dostupne) |
| Kampan se neoznaci jako Done | Nektera SMS stale pending | Zkontrolujte, ze vsechny SMS jsou ve stavu sent nebo error. Mozna je kampan pauzovana. |
| SMS se neodesilaji pri zamknute obrazovce | Android ukonci aplikaci kvuli optimalizaci baterie |
|
| STOP SMS chybi v blacklistu | InboundSmsWorker selhal nebo neni sit |
|
| Prichozi SMS nedochazeji na server | InboundSmsWorker pouzival spatnou autentifikaci (Authorization: Bearer misto X-API-Key) |
|
| FCM push nedochazi | FCM neni spravne nakonfigurovano |
|
# Test heartbeat
curl -X POST https://vas-server.cz/sms-gateway/heartbeat \
-H "Content-Type: application/json" \
-H "X-API-Key: VAS_API_KLIC" \
-d '{"phone_numbers": ["+420777123456"]}'
# Overeni pending SMS
curl -X POST https://vas-server.cz/sms-gateway/pending \
-H "Content-Type: application/json" \
-H "X-API-Key: VAS_API_KLIC" \
-d '{"phone_numbers": ["+420777123456"], "limit": 5}'
# Test inbound STOP
curl -X POST https://vas-server.cz/sms-gateway/inbound \
-H "Content-Type: application/json" \
-H "X-API-Key: VAS_API_KLIC" \
-d '{"from_number": "+420999888777", "message": "STOP", "to_number": "+420777123456"}'
Od verze v18.0.2.0.0 modul podporuje Firebase Cloud Messaging (FCM) pro okamzite probuzeni telefonu pri novych SMS ve fronte. Misto cekani na dalsi polling interval telefon obdrzi push notifikaci a okamzite si vyzvedne cekajici SMS.
| System Parameter | Typ | Popis |
|---|---|---|
sms_gateway.fcm_enabled |
Boolean | Zapne/vypne FCM push notifikace. Vychozi: False |
sms_gateway.fcm_credentials_json |
Text (JSON) | Inline obsah Firebase service account JSON souboru. Ma prednost pred fcm_credentials_path. |
sms_gateway.fcm_credentials_path |
Text (cesta) | Absolutni cesta k Firebase service account JSON souboru na serveru. Pouzije se pokud fcm_credentials_json neni nastaven. |
pip install firebase-admin
Knihovna firebase-admin je automaticky nainstalovana pri instalaci modulu
(deklarovana v external_dependencies manifestu). Pokud instalace selze
(napr. chybi systemove knihovny), FCM funkce se ticha deaktivuje a telefony
pokracuji v polling rezimu.
tools/fcm_service.py
Hlavni funkce send_fcm_wake(phone) odesle FCM data message na registrovany
telefon. Data message (na rozdil od notification message) probudi aplikaci i na pozadi
bez zobrazeni notifikace uzivateli.
# Format FCM data message
{
"type": "sms_pending",
"phone_id": "7",
"timestamp": "1710751200"
}
| Pole | Popis |
|---|---|
type |
Vzdy "sms_pending" — aplikace podle typu rozhodne akci |
phone_id |
ID zaznamu sms.gateway.phone v Odoo |
timestamp |
Unix timestamp odeslani — pro deduplication na strane aplikace |
fcm_token na sms.gateway.phone) pokracuji v polling rezimu
bez jakekoliv zmeny chovani. FCM je ciste aditivni vylepseni — zadny existujici
telefon neprestane fungovat.
Android agresivne omezuje pozadi aplikaci kvuli uspore baterie. Tato sekce dokumentuje strategie pouzite v SMS Gateway aplikaci pro spolehlivy provoz i pri zamknute obrazovce a Doze rezimu.
Pro pravidelny polling (heartbeat + vyzvedavani SMS) aplikace pouziva
AlarmManager s presnym budenim namisto
ScheduledExecutorService nebo Handler.postDelayed().
| Pristup | Chovani v Doze | MIUI/HarmonyOS |
|---|---|---|
ScheduledExecutorService |
Zastaven po ~1 min v Doze | Agresivne ukoncen |
Handler.postDelayed |
Zastaven po ~1 min v Doze | Agresivne ukoncen |
AlarmManager.setExactAndAllowWhileIdle |
Probudi zarizeni z Doze | Funguje i na MIUI (s vyjimkou baterie) |
SCHEDULE_EXACT_ALARM nebo USE_EXACT_ALARM.
Aplikace o nej zada automaticky pri prvnim spusteni.
Zpracovani prichozich SMS (detekce STOP) pouziva WorkManager
(InboundSmsWorker) namisto primych HTTP volani z BroadcastReceiveru.
Duvody:
NetworkType.CONNECTED)
Aplikace pouziva PowerManager.WakeLock na dvou mistech
pro zabraneni uspaní CPU behem kritickych operaci:
| Komponenta | WakeLock tag | Trvani | Ucel |
|---|---|---|---|
FcmMessageHandler |
sms-gateway:fcm-wake |
Max 60 sekund | Drzi CPU vzhuru behem poll + odeslani SMS po FCM wake |
SmsBroadcastReceiver |
sms-gateway:inbound-sms |
Max 30 sekund | Drzi CPU behem zpracovani prichozi SMS a enqueue do WorkManager |
Foreground service notifikace pouziva kanal s IMPORTANCE_HIGH.
To zajistuje, ze Android nezabije sluzbu ani pri nedostatku pameti. Uzivatel
vidi trvalou notifikaci ve stavovem radku (pozadavek Androidu pro foreground
service).
Pri prvnim spusteni aplikace zada uzivatele o vyjimku z optimalizace baterie
(REQUEST_IGNORE_BATTERY_OPTIMIZATIONS). Bez teto vyjimky muze
Android:
Aplikace od v1.2.0 obsahuje nativni metodu SmsModule.rescanInbox(days),
ktera precte SMS inbox za poslednich N dni (vychozi: 30) a vsechny nalezene zpravy
odesle na server pres endpoint /sms-gateway/inbound-batch.
Tato funkce je dostupna uzivateli pres tlacitko Znovu prohledat prijate SMS v Nastaveni > Sluzba. Server provadi deduplikaci, takze je bezpecne spustit rescan opakavane.
// React Native volani
import { NativeModules } from 'react-native';
const messages = await NativeModules.SmsModule.rescanInbox(30);
// messages: Array<{from: string, body: string, date: number}>
// Nasledne se zpravy odeslou pres inbound-batch endpoint
Pro zvyseni nativniho Android limitu na pocet odchozich SMS je potreba udelit
aplikaci opravneni WRITE_SECURE_SETTINGS. Toto opravneni nelze
udelit z GUI telefonu — vyzaduje ADB pripojeni:
# Primo pres ADB
adb shell pm grant com.varyshop.smsgatewayapp android.permission.WRITE_SECURE_SETTINGS
# Nebo pri buildu ze zdrojaku
yarn grant-permission
I s FCM muze dojit k situaci, kdy push notifikace nedorazi (napr. docasny vypadek Google sluzeb). Proto aplikace udrzuje heartbeat safety net:
pending_count pro kazde cislopending_count > 0, aplikace okamzite spusti poll cyklussms.marketing.segment s deklarativnimi i SQL-based domenami (3 vychozi segmenty)sms.marketing.template prirazene ke gateway telefonum('id', 'in', [...])sms.gateway.phone.domain_filter se automaticky kombinuje s doménou segmentu v _get_full_domain()mailing_traceemail_from NOT NULL chyba pri vytvareni SMS kampanegateway_phone_forced_id jako fallback v sms.sms._send()SMS Gateway v18.0.2.2.0 • VaryShop • 2026