úterý 18. září 2012

Jak na hromadné mazání SMS na iPhone

Jak jsem sliboval v minulém příspěvku, dnes budu psát o tom, jak na iphone hromadně smazat vybrané sms.

Proč to potřebuji? Z toho důvodu, že mi chodí od t-mobilu upozornění na příchozí emaily ve formě sms. Bohužel nyní každé upozornění přijde jakoby z jiného čísla, které má sice svá určitá specifika (o tom dále v článku - viz. filtrace čísel), nicméně při 10ti příchozích mailech mám pak i 10 sepárátních sms z 10ti různých čísel a ve schránce to dost překáží. Nedej bože když jich je kupříkladu 40...

Ručně to promazávat sice ze začátku nevadilo. Ale cca po měsíci už mě to začalo dost štvát a chtěl jsem k tomu něco pohodlnějšího.. Na androidu to bylo jednoduché.. Spustil jsem si GoSMS, vyhledal všechny zprávy odpovídající filtru a ty jsem jednoduše hromadně smazal. Operace všeho všudy na 15 vteřin. Super.

Úplný ideál by byl, kdyby všechna upozornění chodila ze stejého čísla, tudíž by se skládaly do jedné konverzace s kontaktem jako jednotlivé bubliny a jejich smazání by bylo otázkou smazání konverzace pouze od tohoto jednoho konkrétního čísla.

A proč vlastně vznikl tento návod? Je to jednoduché. Nativní SMS aplikace pro iOs nemá možnost hromadně označit a smazat sms. Není mi známo proč. Přitom mailová aplikace to umí. Bloudil jsem po fórech atd. ale nikde jsem nenašel ani vysvětlení, ani žádné řešení. Buď jsem slepý a nebo nevím, protože jsem pro iOS zaboha nemohl najít ani žádnou filtrovací aplikaci.. A to ani pro fon bez jailbreaku, ani s ním.

Proto jsem se jal vymyslet nějaké svoje řešení. Postupným hledáním jsem se dobral toho, že všechny sms jsou ukládány do sqLite databáze, ke které mám na Jailbreaknutém telefonu přístup.

Dále jsem se také dobral na stránky, kde byl určitý příklad psaný v pythonu, který právě k databázi se sms přistupuje. Nicméně nepřistupoval uplně korektně a hlavně nedělal uplně to, co jsem potřeboval já, takže jsem stejně musel zapojit svůj mozek a napsat svůj vlastní python zdroják který je ke stažení buď přímo jako PYTHON soubor a nebo v ZAZIPOVANÉ formě :)

Zaprvé jsem si přes Cydii nainstaloval Python..
Zadruhé jsem si definoval co od programu potřebuju:

1. Najít všechny sms které začínají číslem 99109 (protože zbytek čísla zpráv je číslován od 0 do 99 tzn. 9910901, 9910902, atd.) Později jsem zjistil že i třetí číslice se může změnit, takže pravidlo je nakonec že číslo začíná na 9910.. To bohate stačí, protože jiné kontakty těmito čísly nezačínají..

2. K těmto odpovídajícím zprávám se musí v další tabulce smazat příslušné záznamy konverzací (to jsou ty položky které vidíte, když jste v seznamu zpráv od všech kontaktů).
Iphone totiž pracuje se zprávami tak, že pro každé číslo vytvoří tzv. ,,konverzaci" a všechny zprávy které si s daným číslem pošlete se hromadí do téhle konverzace jako jednotlivé bubliny. Tudíž můžete mít v databázi více různých zpráv ze stejného čísla, které ale mají zároveň příslušnost k jedné konverzaci. Pokud smažete z jedné tabulky všechny zprávy (=bubliny), stále vám zůstanou v seznamu prázdné konverzace, protože ty nejsou generovány dynamicky na základě tabulky s bublinami, nýbrž se uchovávají ve vedlejší tabulce zvlášť.

První verze mého programu měla ten neduh, že právě smazala pouze bubliny a potom jsem stejně musel ručně odmazat všechny po nich zbylé konverzace.

3. Smazat ještě další příslušné záznamy k těmto sms ze třetí tabulky, u které si přesně nejsem jistý, k čemu slouží, ale položky je nutné odmazat aby v databázi nevytvařely osiřelé prázdné a zbytečné záznamy.

Pak už stačí jen zdroják nahrát do telefonu (já ho mám ve "/private/var/mobile" kam mě to hodí hned po spuštění terminálu) a napsat ./delmsg.py čímž skript spustíte. A je hotovo.

To je vše co program dělá. Ještě tedy vypíše kolik sms bude mazat a pak při mazání každé z nich její číslo odesílatele a číslo konverzace (to jen pro kontrolu při ladění.. Teď už by to teoreticky nebylo až tak potřeba, ale aspoň je vidět, že program něco dělá).

Ještě musím upozornit na to, že po promazání databáze tímto skriptem je potřeba vypnout a zapnout sms program, aby se změny plně projevily. Ale vypnout tím mínuskem, které se ukáže při přeppínání aplikací.. nemyslím tím jen program dát do pozadí a zase ho přivolat zpět - to většinou nestačí, protože program neví, že se databáze změnila.

Celé je to v podstatě založené na jednoduchých sql dotazech. Díky tomu že dost často pracuji s MySQL, nebyl to pro mě problém, protože SQlite je hodně podobné.

Jediná vychytávka, kterou jsem z výše zmíněného příkladu přebral úplně je jakási implementace funkce READ, která zjišťuje pro SQlite takové rozhraní, nebo spíše prostředníka při čtení a obecné prací s některými záznamy v SMS databázi. Úplně to vysvětlit neumím, protože MySQL nic podobného nemá, ale mohlo by vám stačit to, že bez toho to nepůjde.. :)

Bohužel kvůli nutnosti zaregistrovaní této funce do rozhraní mezi DB a programem, nešlo použít obyčejný bash skript, který přímo komunikuje s programem SQLITE3 (ten zajišťuje určitého zákadního textového prostředníka mezi databází a uživatelem) Moc jsem to nezkoumal, ale myslím že to v bashi jednoduše udělat nejde...  Pokud by někdo z vás věděl jak se to dělá v bash skriptu, určitě mi napište.. V pythonu to bohudík lze velice jednoduše tak jak je to vidět ve zdrojáku..