In native iOS app ûntwikkelje

Skriuwen · 11 maaie 2024

In native iOS app ûntwikkelje

In fyts- en hurdrintracker meitsje

As lyts sydprojekt, tusken myn normale wurk troch, haw ik wurke oan wat my persoanlik ynteressearret: in native app foar it folgjen fan trainingen op iOS. Ik woe myn smartwatch oerstallich meitsje en myn tillefoan brûke om trainingen by te hâlden. Hoe dreech koe it wêze om detaillearre sensorgegevens te sammeljen mei de native Swift API's?

Eftergrûn

As do myn blog folge hast, is dit miskien gjin ferrassing, mar ik hâld fan fytsen en bin koartlyn begûn mei in bytsje hurdrinnen. Ik haw aardich wat ûnderfining mei it byhâlden fan myn trainingen, mei Garmin, Strava, Omata, Wahoo, Biostrap, Whoop en ferskate apps en sensors. Ik fyn sûnens- en fitnessgegevens nuttich om te learen oer dyn fysike prestaasje en om in soarte fan ferantwurding oan dysels te hawwen (bygelyks om dy te motivearjen om de trainingen te bliuwen dwaan).

Neat jout dy it gefoel dat do libbest sa as nei bûten gean foar wat fysike aksje - ik hâld fan trainen!
Neat jout dy it gefoel dat do libbest sa as nei bûten gean foar wat fysike aksje - ik hâld fan trainen!

De nerd yn my hâldt fan de grutte dataset, de protte ferskillende beskikbere sensortypen binne in feest foar myn nijsgjirrigens - mar it stiet yn striid mei myn winsk nei minimalisme en ienfâld. Hasto echt al dy trainingsgegevens nedich? Is gewoan harkje nei dyn lichem net genôch? Ik wit it net, mar ik wurdearje wol it fermogen fan in smartwatch om (hast) sûnder muoite trainingen yn detail by te hâlden. Ik fyn it moai dat in Apple Watch brûkt wurde kin om trainingssesjes by te hâlden, njonken syn mooglikheden as moderne toolwatch en ferfanging fan de smartphone. Hoewol ik begryp dat de measte minsken har smartwatch drage en dêrmei klear binne, hâld ik fan âlderwetske meganyske horloazjes lykas in Rolex, Tudor, Grand Seiko, of sels wat op maat makke. Al wurdearje ik beide, haw ik in foarkar foar meganyske horloazjes as ik moat kieze tusken smartwatches en meganyske horloazjes.

Idee foar de app: Gran Fondo

Wat as der in smartphone-app wie dy't alle trainingsgegevens sammelet dy't do wolst, sûnder gedoch en rommel? Ik stelde my foar dat it wêze soe:

  • Ienfâldich: it moat dy 'net yn de wei sitte', ûntworpen om 'gewoan te wurkjen', sûnder dat do mei einleaze ynstellingen of opsjes oan it knoeien moatst. Druk gewoan op 'start' en begjin mei dyn training.
  • Fleksibel: Brûk de app op ferskate manieren: monteer of draach dyn tillefoan sichtber foar realtime gegevens, of stek dyn tillefoan yn dyn bûse en lit him op de eftergrûn wurkje.
  • Krêftich: Ferbine mei sensors foar hertslach, trapfrekwinsje, fermogen en snelheid fia Bluetooth; stipet meardere sensors, ideaal as do ferskillende fytsen hast.
  • Apple Health-freonlik: Bewarje alle gegevens yn Apple Health yn maksimaal detail, ynklusyf trainingsrûtes en yndividuele mjittingen fan fermogen, trapfrekwinsje en snelheid. Sa kinst opnames analysearje yn elke app dy't Apple Health stipet, lykas Strava, WHOOP, HealthFit en in protte oaren.
  • Earlik: Gjin reklame en gjin ferkeap fan gegevens. Gjin accounts of registraasje. Dyn gegevens moatte privee, feilich en op dyn apparaat bliuwe.

Gjin inkelde fan de besteande sport- en fitnessapps foar smartphones docht alles hjirboppe. De measten binne sûnder need kompleks of op ien of oare manier ûntworpen om dyn gegevens te brûken foar de app-bouwer of syn platfoarm. Koe ik it better dwaan?

De app bouwe

Ik wist wêrom en wat ik woe, dus gie ik de metoade kieze dy't ik it leafst brûke woe om de app te bouwen.

Native tsjin hybride/web-apps

Foar it measte wurk dat ik doch, brûk ik leaver iepen en frije (as yn libre) webtechnologyen, lykas HTML, JavaScript en CSS - of serversoftware dy't útbrocht is ûnder in frije softwarelisinsje, lykas GPL. Foar dit bepaalde gebrûksgefal moast ik ekstreem enerzjysunich wêze en djip yntegrearje kinne mei it bestjoeringssysteem fan myn smartphone. De bêste wei dêrfoar op in iPhone is om de software development kit fan Apple folslein te omearmjen: de app native meitsje yn Swift mei SwiftUI en de technyske en ûntwerprjochtlinen sa nau mooglik folgje.

AI-stipe programmearjen

Hoewol ik myn foarbehâlden haw, kriget it brûken fan AI foar programmearjen de lêste tiid alle omtinken. Guon beweare sels dat technologyen lykas Copilot of ChatGPT programmeurs oerstallich meitsje sille. Ik wit myn wei yn AI, want ik haw it brûkt om koade te generearjen, en ik leare minsken hoe se it brûke kinne, mar ik haw it noch nea brûkt om in folsleine iOS app te bouwen. Ik tocht dat dit in perfekte kâns wie om te sjen hoe geskikt AI is foar wat kompleksers as in ienfâldich skriptfragmint. Litte wy ûntdekke hoe oerstallich ik as programmeur bin yn dit moderne AI-tiidrek...

GPS en Bluetooth Low Energy Sensors

Nei't ik myn Xcode-omjouwing ynsteld hie, gong ik ChatGPT fan OpenAI freegje om my wat koade te jaan om GPS-lokaasjegegevens te lêzen en de nedige Swift-klassen te generearjen om Bluetooth-sensors te finen en dêrmei te ferbinen. Man, wat bin ik dêr yn it sprekwurdlike knynehoal telâne kommen!

Myn fyts mei Bluetooth-sensors ferbûn oan myn MacBook dêr't Xcode op draait
Myn fyts mei Bluetooth-sensors ferbûn oan myn MacBook dêr't Xcode op draait

It ding mei AI-stipe programmearjen is dat it JA wurket; mar allinnich FOAR IN PART. It jout dy wurkjende stikken, mar dy passe net perfekt op inoar en wurkje net per se tegearre. De koade dy't it generearret sjen is as echo's fan in geweldich liet hearre; do werkenst dat it op wat liket - mar it is net itselde as de band live muzyk hearre spylje, lit stean sels sjonge!

Ik naam de stikken fan de AI en gong sels de relevante dokumintaasje lêze, dat die bliken folle effektiver te wêzen, om't ik sa echt begripe koe wat it meganisme dwaan moast. De AI holp my te finen wat ik leare moast. It folgjen fan GPS-lokaasjegegevens wie ferrassend maklik mei Apple's CoreLocation. De Bluetooth-sensor ferbine litte mei de app die bliken folle dreger te wêzen, om't der in soad aparte stappen by komme:

  • Bluetooth-apparaten ûntdekke: sykje yn de omjouwing nei alle apparaten dy't beskikber binne en útstjoere
  • Ferbine mei in Bluetooth-apparaat: in ferbining tusken de app en it apparaat meitsje en hâlde
  • Eigenskippen fan Bluetooth-apparaten ûntdekke: der bestiet gjin ienfâldich Bluetooth-apparaat, do moatst sels de mooglikheden en funksjes fan in apparaat 'ûntdekke'; in protte apparaten stjoere meardere ferskillende sinjalen út, sawol foar sensorgegevens, kontrôlemeganismen as wurkingsparameters lykas it batterijnivo.
  • Op eigenskippen abonnearje: Úteinlik meldst dy oan op in gegevensstream troch de Bluetooth-radio ôf te stimmen op in bepaalde Bluetooth-eigenskip.
  • Gegevens dekodearje: Troch de enerzjysunige aard krigest do minimale gegevens yn rauwe bits; do moatst de gegevenspakketten sels dekodearje; it lestige is dat elke sensor, fan hokker fabrikant dan ek, syn eigen manier hat om gegevens te kodearjen.

Nim bygelyks in relatyf 'ienfâldige' sensor lykas in trapfrekwinsjesensor dy't do op de pedaal fan dyn fyts sette, dy kin brûkt wurde om it oantal omwentelingen per minút te bepalen dat do ûnder in fytssesje makkest. Hoe dreech kin dit wêze? Ik tocht dat de offisjele Bluetooth-spesifikaasje my alle nedige details jaan soe... NET! In ienfâldige trapfrekwinsjesensor is ferrassend kompleks:

  • Kombinearre Bluetooth-profyl foar snelheid en trapfrekwinsje by it fytsen: elke trapfrekwinsjesensor identifisearret him altyd as sawol snelheids- as trapfrekwinsjesensor, do moatst syn mooglikheden 'ûnderweis' ûntdekke.
  • Unlykmjittige gegevenspakketten: De ynhâld fan de eigentlike gegevens hinget ôf fan wat de sensor op dat stuit kin (bygelyks dat er wat detektearre hat), do moatst it gegevenspakket bit foar bit ynterpretearje troch te kontrolearjen op mooglike flaggen dy't oanjouwe wat de folgjende gegevensbit foarstelt.
  • Net-triviale gegevens: Ferwachtsje gjin dúdlike wearde foar "trapfrekwinsje", de sensor jout dy in kumulatyf oantal omwentelingen en in rudimentêre tiidstempel fan de lêst ûntdutsen feroaring; mei dizze wearden moatst do sels de mjitting útrekkenje dy't do mjitte wolst.

De AI joech my wat foarbyldkoade, mar dy die bliken net te wurkjen mei myn sensor. Mei in Bluetooth-debuggingapp, Bluefy, koe ik better begripe hokker gegevens de sensor útstjoerde. Ik fûn in stikje Java-koade op de offisjele Bluetooth-blog dat my wat oanwizings joech oer hoe't ik gegevens fan de sensors ynterpretearje koe. Ik paste dit stikje koade oan op ferskate sensorprofilen en oersette it nei Swift-koade. Dat levere my in iere wurkjende prototype op.

Iere prototype fan de app dy't wurket mei in Bluetooth-hertslachsensor en de iere dataset dy't toand wurdt yn in oare app dy't moaie grafiken makket (HealthFit)
Iere prototype fan de app dy't wurket mei in Bluetooth-hertslachsensor en de iere dataset dy't toand wurdt yn in oare app dy't moaie grafiken makket (HealthFit)

UI/UX-ûntwerp

Ien fan de wichtichste redenen wêrom't ik de Apple Watch-trainingsapp moai fyn, is hoe't de brûkersinterface (UI) ûntworpen is foar in noflike brûkersûnderfining (UX). De app op it horloazje hat frij grutte knoppen dy't do yndrukst om in opname te starten - en dat is sa'n bytsje alles. De app sels hat in pear opsjes, it ûntwerp is eigenwiis mar trochtocht. It is in skerp kontrast mei apparaten lykas Garmin dy't in soad opsjes foar oanpassing bieden. De keunst is om in goed lykwicht te finen tusken fleksibiliteit yn gebrûksgefallen en in standertynstelling dy't goed wurket.

De Apple Watch-trainingsapp toant grutte knoppen om in training te starten - gjin ekstra konfiguraasje nedich
De Apple Watch-trainingsapp toant grutte knoppen om in training te starten - gjin ekstra konfiguraasje nedich

Mei in montagesysteem lykas QuadLock kinst dyn smartphone stevich oan it stjoer fan dyn fyts befêstigje. Dat betsjut dat de iPhone dyn Garmin as fytskompjûter ferfange kin. Moderne iPhones hawwe in altyd-oan-display dat ynformaasje op in enerzjysunige manier sjen litte kin, as do de software development kit fan Apple brûkst, dy't ferskate optimalisaasjes ynboud hat. Nei in protte, protte, kilometers mei myn Garmin-fytskompjûter, kaam ik út op in oersjoch mei realtime gegevensfjilden foar snelheid, fermogen en hertslach. Wat ik moai fyn oan de fierder ûntwikkele Garmin Edge-apparaten is dat se in grafyk tekenje kinne. Dat lit dy dyn eagen op de dyk hâlde as it der om docht, en op in (wat) letter momint nei histoaryske gegevens sjen.

Ik brûkte de yndieling fan myn Garmin Edge as ynspiraasje foar de yndieling fan myn app as monteare fytskompjûter
Ik brûkte de yndieling fan myn Garmin Edge as ynspiraasje foar de yndieling fan myn app as monteare fytskompjûter
Ûntwerpskets dy't de winske yndieling beskriuwt
Ûntwerpskets dy't de winske yndieling beskriuwt
De app op myn fyts testen mei in QuadLock-hoes en -houder
De app op myn fyts testen mei in QuadLock-hoes en -houder

Om de enerzjy-effisjinsje te maksimalisearjen besleat ik de eigen biblioteken fan Apple foar grafiken te brûken: Swift Charts. In probleem dat ik tsjinkaam by it ûntwikkeljen is dat mjittingen fan sensors op ferskillende yntervallen en tiden binnenkomme. Do moatst in soarte fan syngronisaasjemeganisme meitsje om gegevenspunten op mienskiplike tiidstempels te pearjen, om wearden te fergelykjen en oan inoar te relatearjen. Ik ûntwurp dit meganisme ek om UI-fernijingen te syngronisearjen: sa kinne alle grafiken en gegevenspunten yn ien kear ferfarske wurde; optimalisearre foar CPU- en grafyske prestaasje (en dus batterijkrêft). As bonus boude ik stipe yn foar ferskillende tiidsomfangen, sadat de grafiken gegevens fan de lêste minút, 5 minuten, 15 minuten, it lêste oere of de hiele training sjen litte kinne.

Ferskillende konfiguraasjes fan realtime gegevens
Ferskillende konfiguraasjes fan realtime gegevens

De app toant automatysk de beskikbere grafiken op grûn fan de ferbûne sensors, sadat der gjin ferskillende ynstellingen nedich binne as do mear as ien fyts hast. As do op in grafyk tikest, wurdt dy grutter of lytser. As do op it gegevensomfang tikest (bygelyks "lêste 5 minuten"), kinst tusken omfangen wikselje. De app ûnthâldt dyn konfiguraasje en stelt dy automatysk goed yn foar de folgjende training. Om't alle oanrekdoelen en knoppen frij grut binne, wurkje se goed as dyn hannen fol swit sitte of as do handskoenen draachst.

Yn de bûse: optimalisearje foar gebrûk op de eftergrûn en enerzjyferbrûk

In alternative manier dy't ik my foarstelde om de app te brûken, wie fan út myn bûse, as eftergrûnapp. Dat soe ûnopfallende gegevenssammeling mooglik meitsje, wêrby't do de app starte en dyn tillefoan yn dyn bûse stekst. Ik fyn it in prachtich idee om in 'folsleine dataset' te hawwen fan al myn fytstochten en hurdrinrûnten, sûnder dat de app hieltyd yn it sintrum fan it omtinken stean hoecht. In protte trainingsrûnen en fytstochten binne net sa ynteressant.

Ik haw wat magy yn myn bûse: de app folget trainingen fan de eftergrûn - ûnder opnames toant er allinnich in widget op it thússkerm
Ik haw wat magy yn myn bûse: de app folget trainingen fan de eftergrûn - ûnder opnames toant er allinnich in widget op it thússkerm

Standert beheint it iOS-bestjoeringssysteem fan Apple de mooglikheden fan apps om op de eftergrûn te draaien sterk. Dat maksimalisearret de batterijlibben en de privacy fan de brûker. As do de rjochtlinen fan Apple folgest en de brûker korrekt om de nedige tastimmingen freegest, kinst dyn app ommers perfekt op de eftergrûn litte wurkje. Ik gie de ynspanningen fan Apple om de hiele stack te optimalisearjen echt wurdearje, wêrtroch dyn app enerzjysuniger wurdt. Mei oare wurden docht it bestjoeringssysteem "bel ús net, wy belje dy": it nimt de kontrôle oer wannear dyn app syn ding docht - sadat it OS ferskillende taken kin syngronisearje, kombinearje en yn batches ferwurkje op de beskikbere (enerzjysunige) kearnen yn de Apple Silicon-chips.

By ien fan myn testen mei in prototypeferzje fan de app koe ik oer in lange-ôfstânsrit fan 8 oeren op ien iPhone-batterijlading mear as 127 tûzen (!!) gegevenspunten sammelje, mei it skerm de hiele tiid oan. As do spilest neffens de regels fan Apple, hast do wier de krêft (as men it sa sizze mei). Dizze app ûntwikkelje hat my echt earne brocht, ha!

"Goin' the extra mile": 8 oeren op myn fyts om it batterijgebrûk te testen (let op: der is noch 23% krêft oer!)
"Goin' the extra mile": 8 oeren op myn fyts om it batterijgebrûk te testen (let op: der is noch 23% krêft oer!)

Echte keunstners bringe it út

De wei nei de hel is fol goede foarnimmens, sizze se... Om dy reden meitsje ik myn projekten graach ôf. Foar in app betsjut dat dat ik him publisearre hawwe wol yn de AppStore. De app klear krije foar de kontrôle fan Apple, en him goedkarre litte troch de AppStore-beoardielers, is in ekstra mylpeal. It is wichtich, want it makket dat do neitinkst oer de onboarding (fan nije brûkers) en it fertsjinmodel.

Onboarding

Ien bysûnder útdaagjende taak by it bouwen fan in app is minsken dy't nij binne yn dyn app te begelieden by it brûken dêrfan. In geweldige brûkersinterface kin helpe, mar sjoen de djippe yntegraasje fan de app mei Apple Health, lokaasjegegevens en Bluetooth-sensors, is der ek noch de needsaak om freonlik om tastimmingen te freegjen.

Skermôfbyldings fan it onboardingproses fan de app: tastimmingen freegje en nije brûkers begelieden
Skermôfbyldings fan it onboardingproses fan de app: tastimmingen freegje en nije brûkers begelieden

Do moatst it proses sa ûntwerpe dat it net mislearret as minsken bepaalde tastimmingen wegerje. Apple is hjir tige strang yn: minsken hawwe it rjocht om te wegerjen. It is dyn taak om de app te litten wurkjen mei gjin of foar in part tastimmingen. Dat is in ekstra útdaging.

Fertsjinmodel om de ûntwikkeling te finansjearjen

Hoewol ik it belang fan frije software, as yn libre, net heech genôch ynskatte kin, kin ik net negearje dat ik in famylje te fieden haw. Mar foaral kin it fine fan minsken dy't sa'n produkt betelje wolle tsjinje as in ekstra befêstiging fan dyn idee. Wês iepen en earlik oer dyn fertsjinmodel en it helpt dy dyn eigen projekt te finansjearjen; ferlit dy net op ynvestearders of risikokapitaal, bootstrap dyn eigen ûntwikkeling!

In betelmuorre foar myn app ûntwerpe: net myn favorite fraach oan brûkers, mar wol in tige wichtige.
In betelmuorre foar myn app ûntwerpe: net myn favorite fraach oan brûkers, mar wol in tige wichtige.

Do hoechst net te beteljen om de app út te probearjen. It betellingsskerm ferskynt allinnich as minsken de app echt brûke (en it kin altyd fuortklikt wurde). Wêrom besykje it net sels, do kinst de app hjir fine.

Takomst

Yt dyn eigen hûnekost, sizze se - ik sil de app bliuwe ûntwikkeljen troch him sels echt te brûken. Ik ferwachtsje net dat dit projekt in rappe (finansjele) winst wurdt, mar as it foar mysels praktysk nut hat, is de kâns grut dat immen oars it ek nuttich fynt.

Gjin gewoane debugsesje: Fietselfstedentocht 2024
Gjin gewoane debugsesje: Fietselfstedentocht 2024

Wat ik moai fyn oan dit projekt is dat it my in bytsje muoite kostet om it gaande te hâlden, om't ik graach oan de training bin. Nije útjeften fan dizze app debugge betsjut faak dat ik in hurdrin- of fytsrûntsje meitsje gean moat. Wa seit der dat software-ûntwikkeling sittend wurk is?!

Konklúzje

In soad minsken hawwe 'geweldige ideeën' - mar in pear gean der echt op út om se te realisearjen. Dat ûnderskiedt de makkers fan de rest. Ik meitsje graach dingen, want it proses freget dat do dy echt yn de saak ferdjipest. Do leerst in protte en dochst ûnderfining op dy't oaren net hawwe. Kom op, bou it sels, meitsje it dyn eigen!

← Mear ferhalen