Segno
En lydbokspiller for iPhone med vekt på pålitelig gjenopptakelse, eget lydbibliotek og detaljert lyttestatistikk – bygget i SwiftUI.

Segno er en lydbokspiller for iPhone, bygget for lange lydfiler brukeren selv har. Jeg har utviklet appen i Swift og SwiftUI, med særlig vekt på avspillingsposisjon, håndtering av avbrudd og en forståelig oversikt over lyttingen.
En lydbok kan vare i mange timer. Da blir det å komme tilbake til riktig sted en sentral del av produktet. Det behovet har styrt både lagringen, avspillingen og testarbeidet i Segno.
Utfordringen: å ta vare på stedet der lytteren stoppet
Det er enkelt å se om en avspillingsknapp starter en lydfil. Det er mer krevende å vite hva som skjer når appen går i bakgrunnen, telefonen avbryter lyden eller prosessen blir avsluttet.
For lytteren er dette én sammenhengende opplevelse: boken skal kunne fortsette der den slapp. For appen er det flere hendelser som må håndteres og lagres riktig. Det som vises på skjermen, må stemme med både avspilleren og den lagrede fremdriften.
Jeg ville også gi lytteren mer informasjon om egen bruk. Et samlet antall minutter er lite forklarende hvis man vil forstå hvilke bøker man har hørt på, når øktene fant sted og hvordan fremdriften utvikler seg.
Løsningen: Segno som personlig lydbokspiller
Et bibliotek bygget rundt egne lydfiler
Brukeren importerer lydfiler og mapper til et lokalt bibliotek. Appen håndterer egne kopier av filene, slik at avspillingen kan bygge på innhold som finnes på enheten.
Dette passer lydbøker, forelesninger og annet langt lydinnhold brukeren har rett til å bruke. Filene trenger ikke å komme fra én bestemt innholdstjeneste. Biblioteket, fremdriften og spilleren hører sammen i appen.
Importen er også en del av brukeropplevelsen. En mappe med flere filer må bli forståelig som innhold man kan finne igjen og fortsette med. Det krever arbeid med filhåndtering og organisering, utover selve lydavspillingen.
Avspilling som tar høyde for avbrudd
Segno har en avspillingsmodell med lagrede kontrollpunkter og logikk for å gjenopprette posisjon. Et kontrollpunkt er informasjon om hvor avspillingen var da appen sist lagret en kjent tilstand.
Målet er at fremdriften skal tåle situasjoner som oppstår uten at brukeren trykker på pause: avbrudd, bakgrunnskjøring og avslutning av appen. Derfor er gjenopptakelse behandlet som en egen teknisk oppgave, med automatiske tester av logikken.
Appen er også koblet til iOS-funksjoner for bakgrunnslyd og betjening fra låseskjermen. Spilleren må håndtere handlinger som kommer fra flere steder enn knappene inne i appen.
Lyttehistorikk som kan forklares
Statistikken bygger på økter og hendelser. Systemet registrerer hva som skjer underveis, fremfor bare å øke en samlet teller.
Det gir et grunnlag for å vise sammenhengen mellom lyttingen og fremdriften. Avspillingshastighet og varighet er for eksempel forskjellige størrelser: tiden man lytter, trenger ikke å være lik lengden på innholdet man kommer gjennom.
En hendelsesbasert modell gjør det mulig å arbeide med slike forskjeller på en tydelig måte. Den gjør også beregningene til noe som kan undersøkes og testes, i stedet for at grensesnittet bare viser et tall uten forklaring.
Mål knyttet til faktisk lytting
Segno har funksjoner for daglige og ukentlige lyttemål og planer om å fullføre innen en bestemt dato. Målene bruker opplysninger om lytting og fremdrift til å gjøre planen konkret.
En slik funksjon avhenger av at de underliggende dataene er pålitelige. Hvis en økt telles feil, påvirker det også fremstillingen av målet. Arbeidet med mål er derfor tett knyttet til modellen for historikk og beregninger.
Under panseret
Jeg har bygget Segno med Apples egne rammeverk:
- Swift og SwiftUI for applikasjonslogikk og grensesnitt.
- SwiftData for lagring av appens data.
- AVFoundation for lydavspilling.
- MediaPlayer for samspillet med systemets avspillingskontroller.
En viktig del av arkitekturen er å skille avspilling, lagring og beregninger. Spilleren må kunne reagere på systemhendelser, mens historikk og statistikk må ha tydelige regler for hva en hendelse betyr.
Lagring av posisjon trenger også en definert rekkefølge. Appen må vite hvilken tilstand som er gyldig når en fil lastes, avspilling starter eller brukeren hopper i innholdet. Ellers kan en senere hendelse komme til å lagre feil sted.
Testarbeidet omfatter blant annet avspillingslogikk, gjenoppretting og beregninger. Prosjektet har dokumenterte kjøringer av automatiske tester på iOS-simulator. Det er et grunnlag for å kontrollere logikken, mens lyd, avbrudd og samspill med en fysisk telefon også krever egne praktiske prøver.
Resultat og status
Resultatet er en fungerende app med lokalt lydbibliotek, avspilling, posisjonsgjenoppretting, historikk og mål. Prosjektet viser arbeid med et produkt der pålitelig tilstand er like viktig som det synlige grensesnittet.
Segno er ikke publisert i App Store. Full praktisk godkjenning på fysiske enheter og de resterende lanseringskontrollene gjenstår. Jeg skiller derfor mellom funksjoner som er implementert og det som må være kontrollert før en offentlig utgivelse.
Erfaringen er særlig relevant når en handling må kunne fortsette etter et avbrudd. Det krever tydelige regler for hva som er lagret, hva som pågår og hva brukeren får vite når vedkommende kommer tilbake.
Relevant for dere hvis …
Dere trenger et digitalt verktøy der fremdrift, historikk eller avbrutte arbeidsoppgaver må håndteres grundig. Segno viser hvordan jeg arbeider med lagret tilstand, beregninger og testing rundt en konkret brukeroppgave.
Jeg tar med meg denne erfaringen inn i webapplikasjoner for bedrifter. Beskriv arbeidsflyten dere vil forbedre, så kan jeg vurdere hva løsningen skal huske og hvilke handlinger den skal støtte.
Bilder fra prosjektet



