JRSK´s positionsapp

Skrivet av
Webbredaktör JRSK
Datum
28 december, 2019
Bakåtpil

Våren 2015 tyckte min syster som blivit medlem i JRSK att det var för krångligt att få in positioner till ”Båtar på havet” och tyckte att jag skulle göra en app så att hon kunde göra det på ett smidigare sätt.

Hennes plan såg ut så här:

”En sådan app gör ju du lätt!”

– Det behövs stöd på serversidan.

”Prata med Jacek!”

– Vad har han med detta att göra?

”Jag har pratat med Gunnar Bulukin. Han har hand om allting. Kontakta honom!”

– Vem är det?

”Säg till när jag kan testa!”

– Ja du. Jag har annat att göra också.

Jacek Palka – en f.d. kollega till mig – visade sig vara medlem i JRSK med järnkoll på JRSKs web.

Sagt och gjort, jag gjorde en första version och Jacek rotade runt i JRSKs webapplikation så det fanns någonstans att skicka positionerna och få upp dem på kartan. Syrran fick testa.

”Funkar fint!”

Den versionen var inte vacker men sällsynt som min fru beskriver undertecknad.

 

Det här var förstås bara ett test för att se om det kunde funka i verkligheten. Ett ”proof of concept” som det heter på finspråk. Nu följde en intensiv period då Gunnar och jag bollade idéer och nya versioner av appen tidvis nästan varje dag – och ibland med ganska hårda ord, vi är två envisa gubbar båda två. En kreativ miljö med andra ord. Efter många om och men kände vi att vi kunde låta några utvalda medlemmar testa en version som vi inte behövde skämmas alltför mycket för. Detta var 14 devember 2015. Den 17 december lade jag upp den första officiella versionen på Google Play, version 1.0.

Sedan dess har appen två kärnfunktioner: För det första kan man starta appen och låta den ta reda på var telefonen – båten – är någonstans och så kan man skicka iväg den positionen till JRSK. Man kan också peta in positionen själv om man inte gillar den som GPSen hittat.

För det andra kan appen om man önskar hämta en ungefärlig position en gång per dygn även om appen är död och telefonen är i viloläge, och skicka iväg positionen till JRSK. Det kan vara käckt vid överseglingar exempelvis.

I båda fallen skickas positionerna så fort telefonen är uppkopplad mot internet.

I samma veva som den första officiella app-versionen var klar släppte Google ut Android version 6 som började sippra ut på marknaden. I denna version ska en app be om sina behörigheter inne i själva appen. Förut hade man fått godkänna de behörigheter som appen ville ha innan appen installerades. Det resulterade i en del bök, men var hanterbart.

Men den hade också en mycket obehaglig funktion i bagaget, ”doze mode”, en funktion som slog undan benen för appens möjlighet att automatiskt samla dagliga positioner.

Anledningen till doze mode-funktionen var och är att det finns massvis med appar som drar ström när de inte används, ett oskick som drar ur telefonbatteriet i onödan. JRSKs app drar ingen, upprepar ingen, ström annat än när den aktivt används. Du kan se på telefonen att GPSen dessutom bara är på när appen söker position, inte annars.

Om appen ska skicka en automatisk position per dygn drar den ström under tiden den försöker hitta en position och skicka den – max 10 minuter, sedan ger den upp. Om det saknas uppkoppling slösar den inte ström på att försöka skicka positionen den fått.

Det finns ett sätt att komma runt problemet med doze mode genom att appar kan kräva en extra behörighet som Google varnar för att använda. ”Vi kommer vara mycket restriktiva med att tillåta denna behörighet, den är reserverad för appar med speciella behov, utvecklare ska använda andra lösningar”.

JRSK har speciella behov. Jag publicerade version 2.0 på Google Play. Efter ett tag kom ett mail från Google som resulterade i många vändor av frågor och svar. Sammanfattningsvis:

”Ta bort kravet på behörigheten eller förklara varför ni behöver den”.

– Vi tar automatiska positioner på jordens oceaner en gång per dygn.

”Använd GCM – high priority messages”

– Går inte. Det finns inga mobilnät på oceanerna.

”Öh? Va? Använd GCM – high priority messages”.

– Suck.

Det slutade med att Google tog bort appen från Google Play eftersom den stred mot deras uppförandekod. JRSKs lilla app ”bannad” från Google Play, det får nog ses som en merit. Återstod att ordna så att användaren själv fick en chans att säga till telefonen att appen får lov att väcka telefonen en gång per dygn för att ta sin position. Detta kan bara göras i en avlägsen avkrok i telefonens systeminställningar, så appen ser nu till att öppna den inställningssidan. Sidan är halvt obegriplig, men det är det bästa vi kan åstadkomma.

Version 2.1 kom ut 1 februari 2016 och den bara tuffade på. Inga kraschrapporter på Play, inga rapporter från användare, ingenting, ingenting, ingenting…

Tiden gick, jag ägnade inte en tanke åt appen förrän syrran meddelade att något var skumt. Hon hade fått positioner från Portugal när hon befann sig mitt ute på havet.

Hoppsan!

Under de tidiga testerna av appen hade en användare tyckt att det tog lång tid att få en position medan Google Maps visar var man är nästan direkt. Vi beslutade då att använda samma funktion som exempelvis Google Maps använder och det funkade bra när vi testade. Men jag hade missat en liten men viktig detalj. Båtar flyttar sig.

Eftersom det kan ta många minuter att få snurr på GPSen – särskilt när det saknas datanät och den måste tanka ner satellitalmanackan från himlen istället för internet – så är den här funktionen så smart att den använder masttriangulering – funkar inte på havet, inget mobilnät – och den luktar sig till om det finns något WiFi-nät i närheten som den redan känner till eller som den kan fråga Google om. Fråga Google går inte – inget mobilnät, men den har en lista på nät den redan känner till. Telefonen behöver inte vara uppkopplad på nätet, det räcker att den kan upptäcka det. Den ”vet” var dessa nät finns från tidigare frågor till Google. Så när appen ber att få position så får den positionen för båtens WiFi-nät, som enligt trovärdig källa finns i Portugal. Det är först om appen är igång tillräckligt länge för att GPSen börjar leverera positioner som det här beteendet upphör. För den gången. Detta borde fixas, men det var ju inte precis folkstorm kring detta, det var bara syrran som klagat.

Så en dag tidig höst 2019 uppgraderades min surfplatta till Android 9. Jag kollade att appen funkade.

Det gjorde den inte.

Nu skickade jag ett mail till de funktionärer jag hittade på JRSKs hemsida och undrade om appen fortfarande användes, det hade ju gått tre och ett halvt år och jag hade inte hört ett ljud från någon annan än syrran. Under tiden hade Android förändrats mycket från en utvecklares synvinkel och det var alltså så illa att om en medlem hade en telefon eller surfplatta med Android version 9 eller nyare så fanns det risk att kärnfunktionen, att skicka positioner, faktiskt inte fungerade. Fanns det något intresse att uppdatera den så den funkade? Om inte så var min åsikt att den borde tas bort från Google Play.

Gunnar, ständigt denne Gunnar, svarade att jo, den används och det var viktigt att utveckla den så den fungerade – om jag hade tid.

Så, det första som måste göras var att få appen att fungera i de senaste Android-versionerna. Och att bara använda GPS som positionsgivare, det får ta den tid det tar att få första position, men det är bättre än att den är käpprätt fel.

Dessutom har det kommit nya käcka funktioner i Android för att köra bakgrundsjobb och de ville jag utnyttja eftersom jag kunde kasta bort ganska komplex kod i appen och utnyttja dessa nya funktioner istället. Alla positionsrapporter som skickas är bakgrundsjobb, vare sig du skickar positionen själv eller det är automatiska dagliga positioner. I detta ligger sådant som att bara försöka skicka om det finns ett datanät, att försöka igen om en sändning misslyckas och det finns skäl att tro att det kan gå bättre nästa gång, med mera.

Det handlar också om schemaläggning av de dagliga positionsrapporterna. Genom att delegera allt detta och mer därtill till Android-systemet blir appen mindre och koden lättare att förstå för den som ska underhålla den i framtiden.

Version 2.2.0 kom ut den 10 november 2019 efter att Gunnar övertalat några luttrade medlemmar att testa under någon vecka. Då var den viktigaste uppryckningen för användare av Android 9 klar, fixen med positionerna och även storstädningen i koden var klar.

Nu fick jag för första gången tillgång till iPhone-appens källkod och där fanns anrop till en funktion i web-applikationen där man kan verifiera att användarnamn och lösenord är korrekta innan man börjar skicka positioner. Käckt. Gunnar och jag beslutade att peta in motsvarande funktion i Android-appen också när nu möjligheten finns. Så efter lite mer kodande och testande kom version 2.3.0 ut den 25 november 2019.

Anledningen till att vi levde farligt när telefoner uppgraderades eller medlemmar köpte nya telefoner med Android 9 eller10 var att Google under flera års tid sagt att de ”snart” kommer kräva att all internet-trafik till och från Android-enheter ska vara krypterad och använda TLS. TLS är förenklat en teknik som gör det mycket osannolikt att trafiken kan avlyssnas och mycket sannolikt att man skickar trafik till och från den man tror och inte till någon skummis som nästlat sig in ”på tråden”. Används när du kopplar upp dig mot banken till exempel.

En app med okrypterad trafik i Android 9 måste säga till Android-systemet ungefär att ”Jag vet att jag kör okrypterat. Det är inget misstag”. Det är alltså detta som appen version 2.2.0 och senare gör. Men man kan ju räkna ut med knäna att i Android 11 eller 12 så kommer det bli tvärstopp.

Nuläge och framtid

När appen föddes hade JRSKs web inte stöd för krypterad trafik, men någon gång under appens livstid – jag vet inte när – har den fått det. Så nu finns alltså förutsättningarna för att alltid använda TLS när vi skickar positioner. Därför jobbar jag nu på version 2.4 med krypterad trafik. Med den ändringen borde appen kunna fungera som tänkt under ytterligare några Android-versioner framåt.

Versionen med kryptering kommer förhoppningsvis någon gång i början av 2020. Jag har som sagt annat att göra också. Dessutom måste detta testas ganska ordentligt.

Saker kompliceras nämligen något av att JRSKs servercertifikat – tänk id-kort – kommer från en i sammanhanget väldigt ny utgivare av certifikat, Let’s Encrypt.

Denna organisations s.k. CA – ”Certificate Authority”,  en annan organisation som går i god för att certifikatet som JRSK har fått av Let’s Encrypt är äkta, krångligt? – är okänd för äldre Android-enheter som då sätter sig på bakhasorna när appen försöker prata med JRSK. Det går att lösa, men resultatet är tveksamt och den nödvändiga insatsen är ganska stor från min sida.

Det blir nog så att appar som körs på äldre telefoner får fortsätta att köra i klartext medan appar som kör på nyare telefoner kör krypterat. Det är inte så många äldre telefoner kvar som har appen installerad, närmare bestämt två av sextioen senast jag kollade. Äldre telefoner är de som har en Androidversion som är äldre än 5.0. Telefoner med Android 5.0 och senare är ”nyare”.

Så här fördelades apparna mellan olika Android-versioner den 16 december 2019 – totalt 61 aktiva installationer:

Android 4.2 1
Android 4.4 1
Android 5.0 3
Android 5.1 5
Android 6.0 5
Android 6.0 5
Android 7.1 1
Android 8.0 8
Android 8.1 5
Android 9 21

Så här fördelades de aktiva app-versionerna samma datum:

1.0 Beta 1 1
2.1 16
2.2.0 10
2.3.0 34

Vad som ska hända med appen i framtiden är JRSKs medlemmars beslut. Även en så här liten app behöver som synes pysslas om då och då för att fortsätta att fungera i en föränderlig värld. Fel måste rättas, någon kan få en snilleblixt som anses värd att ta in, koden måste moderniseras.

Appen är skriven med rena Android-funktioner så som de såg ut 2015 i huvudsak. Eftersom allt är standardkod utan några konstigheter bör det vara ganska lätt att komma in i koden och förstå hur det hela hänger ihop. Det vore bra om någon annan kan vara med och ta sig an appen.

Googles rekommendationer för hur appar ska se ut under skalet har förändrats sedan starten, men den gamla visdomen ”laga inte det som inte är trasigt” gäller än. Samtidigt är det bra om appen kan utvecklas så att den följer med förändringar i Android.

Jag är gärna med och hjälper till, men i slutändan är detta er app och det är Gunnars engagemang som gjort att appen är där den är i dag. Både han och jag är gråhåriga gubbar som någon gång måste backa ur och då måste det finnas någon som kan och vill ta över. Om ni vill ha en positionsapp vill säga.

Tom Bakken