Naar de beurs: twee app stores, twee afwijzingen, nul chill
English Deutsch Español Français Português 中文 Italiano 日本語 한국어 Русский Türkçe Polski Bahasa Indonesia
Moneyflow staat nu in de App Store en in Google Play. We zouden graag vertellen dat het soepel ging. Dat was niet zo. Onderweg verzamelden we twee afwijzingen van Apple, leerden we een buildscript nee zeggen, ontdekten we dat een Lambo de hele tijd een geblokte vlag was, en repareerden we een bug waar Google zijn schouders over ophaalde en Apple niet.
Dit is het hele verhaal, samengesteld uit onze releasenotes, onze runbooks en de commitberichten die we haastig schreven. Het is lang, een beetje brutaal, en als je op het punt staat een eigen app te lanceren, staat er echt advies in. Pak een kop koffie, of een kleine lening tegen je bezittingen.
De korte versie, in data
- Versie 1.2.8 gaat live in Google Play. Het bericht volgt die avond, in zes talen.
- iOS haalt Android in op 1.2.8, nadat we een splash screen hebben gered dat niemand kon lezen.
- Inzending één gaat zonder in-app-aankopen naar Apple. Inzending twee gaat erin met alle 39. Het eerste antwoord van Apple: Information Needed.
- Een schoonmaakbeurt van handelsmerken, en build 31 om een ontbrekende sleutel terug in de app te zetten.
- Afwijzing twee, vanaf een iPad: beide inlogknoppen tonen een fout, en de reviewer kan de Winkel niet vinden.
- De boosdoener is één ontbrekende parameter. Android had het al die tijd stilletjes vergeven.
- Build 34, goed ondertekend. Inloggen met Apple werkt eindelijk.
- Versie 1.2.9 wordt uitgerold in Google Play.
- Spelers vertellen ons dat hun telefoons heet worden. We laten het spel daarmee ophouden.
- Vijf versies in één weekend, van 1.2.10 tot 1.3.1.
- De App Store-link komt op onze homepage. Hier ben je.
Pre-IPO: een browserspel met bindingsangst
Moneyflow begon als browserspel. Je kiest een personage met een echte baan, echte rekeningen en een echt salaris, gooit de dobbelstenen en probeert genoeg passief inkomen op te bouwen om aan de 9-tot-5 te ontsnappen en twee dromen te betalen. Allebei doen is de enige manier om te winnen, in singleplayer en multiplayer. Er is ook een bruiloft, een huwelijkse voorwaarden en een scheiding, en daar komen we nog op.
Toen besloten we dat het op je telefoon thuishoorde en ontdekten we dat een app store een heel ander spel is. Geen dobbelstenen, geen kaarten, alleen formulieren, vragenlijsten en een huis dat altijd wint. Het papierwerk voor Google Play schreven we eerder op in Moneyflow in de Google Play Store zetten. Dit is het vervolg: wat er daarna gebeurde, in beide stores, en wat we tegen onszelf zouden zeggen als we terug konden.
Ronde één: Google Play zegt ja (nadat het om alles heeft gevraagd)
Google Play ging eerst, en gedroeg zich als een bank wanneer je een hypotheek aanvraagt: vriendelijk, grondig en benieuwd naar elk document dat je bezit. Het formulier Gegevensbeveiliging, de contentclassificatie, de pagina voor accountverwijdering, de gesloten testperiode. Het eerdere bericht behandelt dat allemaal, dus hier is wat we veranderden toen de eerste vermelding klaar was.
We hielden op met klikken. Alle 39 in-app-aankopen (18 pionnen, 14 dobbelsteenskins, 4 bordthema's en 3 pakketten, stuk voor stuk cosmetisch) werden met een script aangemaakt in plaats van met de hand, met RevenueCat tussen de app en beide stores zodat de aankooplogica overal hetzelfde is. Releases lopen ook via de Android Publisher API. Eén script opent een edit, uploadt de bundle, wijst het spoor toe en commit, en als een stap mislukt, verwijdert het de edit, zodat een mislukte run niets achterlaat. Het is het netste ding in dit hele verhaal.
Play heeft zijn eigenaardigheden. Het weigert elk buildnummer dat het ooit heeft gezien, ook die je hebt geüpload en nooit hebt uitgebracht, dus buildnummers gedragen zich als contant geld in het spel: geef er een uit en het is weg, of je er nu iets voor terugkreeg of niet. We hebben ook twee serviceaccounts, en slechts één van hen mag publiceren. De ander kan een edit openen, een hele bundle uploaden, hem aan een spoor toewijzen en dan bij de allerlaatste stap een 403 krijgen. Al die moeite, en een rotsvast “nee” terwijl de taart al op tafel staat.
Op 7 september ging versie 1.2.8 live. Die avond publiceerden we het bericht in zes talen, want als je dan toch in het openbaar enthousiast bent, kun je het net zo goed ook in het Duits, Spaans, Frans, Portugees en Chinees doen.
Google Play zei ja. Apple had andere plannen.
Ronde twee: Apple doet moeilijk
Terwijl Android vooruit racete, stond iOS in App Store Connect nog geparkeerd op versie 1.2.1. Op 10 september haalde het in: versie 1.2.8, build 30, tien nieuwe screenshots en promotietekst in acht talen. Voor dat alles was er de kleine kwestie van de Paid Apps-overeenkomst. Apple laat je geen enkele in-app-aankoop aanmaken voordat je die hebt geaccepteerd en je bank- en belastinggegevens hebt ingediend. Tot dan geeft elke poging een 409, Apples manier om te zeggen: “nog niet, en niet voordat ik je papieren heb gezien”.
Daarna scripten we alle 39 aankopen via de App Store Connect API. De eerste run mislukte bij 24 ervan met
UNEXPECTED_ERROR. We draaiden hem opnieuw en hij kwam schoon terug. Het runbook bevat nu de meest zenne zin van de repository: opnieuw draaien in plaats van debuggen.
Het splash screen dat geen splash maakte
Op een echte telefoon was ons startscherm onleesbaar, om twee losse redenen. De storyboard vulde het scherm met vierkante artwork, dus op een lange telefoon schaalde het totdat de hoogte paste en werd ongeveer 54% van de breedte afgesneden. Het woordmerk en het hele decoratieve kader vielen van de rand. Erger nog, de donkere versies waren gewoon de kale figuur op ongeveer 5% van een crèmekleurig canvas, wat een onzichtbaar logo is op elke telefoon die op donker staat.
We schakelden over op het artwork binnen het scherm laten passen op zijn eigen crèmekleurige achtergrond, schrapten de donkere varianten en zetten de logo-lockup erin op 88% van het canvas. De afbeeldingenmap kromp van 55 MB naar 9,1 MB. Een eerste indruk hoort geen 55 MB te wegen.
Hoe je een app indient waarvan de Winkel niets verkoopt
Hier is een valkuil met uitstekende camouflage. In-app-aankopen zijn aparte reviewitems, en Apple beoordeelt er geen die niet bij je inzending zit. De eerste keer dat we indienden, ging de app de review in met alle 39 producten achtergelaten op “Ready to Submit”. Als hij was goedgekeurd, hadden we een spel over kopen en verkopen uitgebracht waarvan de Winkel niets kon verkopen. Hem terugtrekken kostte ons een Remove from Review en onze plek in de rij.
De valkuil is dat Apple je op de pagina In-App Purchases een conceptinzending laat starten die nooit kan worden ingediend. Zonder appversie erop mislukt het toevoegen van elk product met “Unable to Add for Review”, en het indienen van het concept mislukt met “add an app version for the selected platform”. Geen van beide meldingen vertelt je dat de versie eerst moet. We probeerden de oplossing natuurlijk te scripten. De API heeft helemaal geen relatie tussen in-app-aankoop en inzending. We probeerden drie spellingen voordat we accepteerden dat deze deur alleen via de UI gaat, en het runbook zegt dat nu, beleefd, zodat niemand het opnieuw probeert.
Het getal dat ons eindelijk gelukkig maakte was veertig: één appversie, plus negenendertig dingen om ervoor te kopen.
Afwijzing nummer één: Apple wil je beter leren kennen
Op 11 september antwoordde Apple. De onderwerpregel was Guideline 2.1, Information Needed. Het was geen bug, geen crash en geen overtreding. Apple meldde helemaal geen defect. Het was de vragenlijst die Apple stuurt naar accounts met een korte reviewgeschiedenis, en hij kwam met de eis van een schermopname. Zie het minder als een afwijzing en meer als een antecedentenonderzoek.
De lijst had zeven punten: een schermopname, waarvoor de app dient en voor wie, hoe je binnenkomt en alles uitprobeert, welke externe diensten hij gebruikt, of er iets per regio verandert, of hij gereguleerd is of op andermans materiaal is gebouwd, en hoe de aankopen werken. Het waren redelijke vragen, zoals de vragen op een eerste date redelijk zijn. Het Resolution Center begrenst een antwoord op 4.000 tekens en het onze kwam op 3.917, wat het langste is dat we ooit hebben gezegd tegen iemand die we net hadden ontmoet.
Dan de opname. Apple wilde de echte flow op echte snelheid op een echte telefoon: een koude start, een singleplayerspel, de Winkel en het aankoopvenster, registreren, inloggen, een multiplayerlobby en het account weer verwijderen. Vier minuten iPhone-beeld op 60 frames per seconde weegt ongeveer 240 MB, te groot om bij te voegen, dus ffmpeg perste het naar minder dan 10 MB met de interface nog leesbaar. We schreven de hele shotlist op, want als dit project ons één ding heeft geleerd, is het dat we vergeten hoe we iets hebben gedaan.
De antwoorden gingen op twee plekken in: het antwoord in het Resolution Center en de reviewnotes in de vermelding van de app, zodat elke toekomstige inzending de vragen al beantwoord binnenkomt. Reviewers volgen die notes letterlijk. Schrijf ze voor iemand die je app nog nooit heeft gezien, veertig seconden over heeft en een iPad vasthoudt. Alle drie blijken waar te zijn.
Terwijl we oefenden, kwam er nog iets aan het licht. Accountverwijdering bleef één keer hangen op “Deleting...” en werkte toen de tweede keer. We vermoeden dat de server in slaap was gevallen, wat voor een reviewer er precies uitziet als een kapotte knop. Houd je server wakker terwijl de reviewer in de stad is.
De schoonmaakbeurt van handelsmerken
Terwijl Apple onze aandacht had, liepen we door het spel op zoek naar alles wat als een merk klonk. De regels van Apple over contentrechten lieten ons kijken, en we vonden niet alles geweldig. Twee personages hadden een “BMW 3 Series (CPO)” en een “Honda Civic”. De namen voegden niets toe aan het spel en nodigden veel gedoe uit, dus het zijn nu een “Sportwagen (gecertificeerd occasion)” en een “Eenvoudige sedan”. Het woord “monopoly” verliet onze App Store-zoekwoorden.
Dan was er de Lambo. Het bleek dat de Lambo-pion nooit een auto was geweest. Het was al die tijd een emoji van een geblokte vlag, dus de oude naam beloofde een supercar en leverde een racevlag. Financieel gezien is dat gewoon marketing. Het is nu de Geblokte vlag. Het bordthema The Tank werd Haaienbassin.
De ene regel die we niet braken.
We veranderden de weergavenamen en lieten elk product-ID precies waar het was. De geblokte pion is nog steeds
pawn.lambo onder de motorkap en blijft dat altijd. Die ID's zijn live in beide stores, gekoppeld aan prijzen en genoemd in de pakkettoekenningen, en een hernoeming zou het item hebben ingetrokken bij iedereen die het al bezit. Namen zijn tekst. ID's zijn contracten.
Afwijzing nummer twee: het iPad-incident
Op 17 september kwam Apple terug, en dit keer had het echte problemen gevonden. De reviewer gebruikte een iPad Air (11 inch, M3) met iPadOS 27, omdat apps die alleen voor iPhone zijn, in compatibiliteitsmodus op iPad draaien en daar worden gereviewd. Er waren twee bevindingen. Guideline 2.1(a): tikken op Doorgaan met Apple of Doorgaan met Google toonde een fout. Guideline 2.1(b): de reviewer kon onze 39 in-app-aankopen niet vinden.
Beide waren onze schuld, en in zekere zin was het dezelfde schuld.
De bug
De inlogplug-in wil bij elke aanroep een options-object mee. Op iOS weigert de plug-in, als het ontbreekt, met “Missing provider or options” voordat een inlogvenster de kans krijgt te verschijnen. Op Android neemt dezelfde plug-in stilletjes een leeg object aan en gaat door. Dus dezelfde regel code zeilde door de review van Google Play en viel om bij de eerste tik aan de kant van Apple, op elke iPhone en elke iPad.
Eén ontbrekende parameter. Android vergaf het. iOS niet.
De Winkel die niemand kon vinden
De aankopen waren een apart misverstand dat toevallig perfect bij het eerste paste. Onze oude reviewnotes vertelden de reviewer dat voor kopen een login nodig was. De login was kapot. Dus de reviewer kwam nooit in de Winkel, in een gesloten kringloop van onze eigen makelij.
Het werd erger toen we beter keken, want de Winkel had nog drie andere manieren om teleur te stellen. Als de productlijst zonder pakketten laadde, beschouwde de Winkel dat als “niets te koop” en verborg hij elk item dat je nog niet bezat. De drie pakketten (5-pionnen, Thema's en Starter Persona) waren sinds juni verborgen. En een gast die het 5-pionnenpakket kocht, zou hebben betaald en niets hebben ontgrendeld, omdat onze server pakketten alleen in hun items uitsplitste voor ingelogde spelers. Een gast is natuurlijk precies wat een reviewer is. Iemands geld aannemen en een lege doos overhandigen is een prima financiële les. Het is alleen niet een die we wilden geven.
De lijst met oplossingen, voor de goede orde. Geef de parameter mee. Laat beide inlogvensters op iPad aan het actieve venster van de app hechten, omdat de plug-in zich verankerde aan het eerste venster en dat op iPadOS niet altijd het zichtbare is. Leer de Winkel dat nul geladen producten “nog niet geladen” betekent in plaats van “leeg”. Breng de pakketten terug. Leer de app pakketten uit te splitsen voor gasten. En herschrijf de reviewnotes om in gewone woorden te zeggen dat er voor kopen geen login nodig is en hier is het exacte pad naar de Winkel.
Het resultaat was 1.2.9. De releasenote opent met de twee zinnen die ons het meest kostten: “Inlogfixes: Doorgaan met Google toont de accountkiezer bij een bewuste tik en native inloggen geeft geen fout meer. De Winkel toont altijd zijn items, ook voordat de prijzen zijn geladen.” Twee zinnen, tien dagen van ons leven.
Build 32 en 33: de builds waar we het niet over hebben
Je zou denken dat we de fix gewoon konden uitbrengen. Dat deden we, twee keer, en beide keren was het fout. In
TestFlight-builds 32 en 33 werkte inloggen met Google, maar Inloggen met Apple, de eigen knop van Apple in het
eigen testprogramma van Apple, mislukte met AuthorizationError 1000.
De oorzaak is achteraf voor de hand liggend en vooraf onzichtbaar. Entitlements reizen mee in de codehandtekening. Ons uploadscript archiveerde de app met ondertekenen uitgeschakeld en liet het ondertekenen over aan de exportstap, die een app kan ondertekenen maar hem geen entitlements kan geven die hij nooit had. De entitlement voor Inloggen met Apple haalde de build nooit. In ontwikkelaarstermen was de app het huis uitgegaan zonder broek.
Het uploadscript ondertekent nu bij het archiveren en weigert elk archief te uploaden waarvan de handtekening de entitlement mist. We bouwden een uitsmijter. Hij controleert ID's. Build 32 en 33 zijn dood, en build 34, die netjes gekleed, is de build die we terugstuurden naar Apple.
Toen zei Apple ja.
Wat een hitte
Op 24 september hadden spelers ons verteld dat hun telefoons heet werden. iPhone 15's, iPhone 16 Pro Max'en, en de webversie ook een beetje warm. We zouden graag zeggen dat dit de pure sexappeal van samengestelde rente was. Het was een timer.
Het spel tikte een teller elke seconde, in elke modus, en elke tik rendeerde het hele spel opnieuw: het bord, elk vakje, elk paneel. Eindeloos. Intussen werden de geanimeerde pionnen op telefoons met snelle schermen tot 120 keer per seconde opnieuw getekend om een animatie van 30 beelden per seconde te tekenen. De blur op volledig scherm achter elke kaart werd bij elk beeld opnieuw berekend omdat de pion eronder bleef bewegen. En de gloed die het bord levend liet lijken, animeerde box shadows, wat bij elk beeld een hertekening afdwingt.
We repareerden alle vier. De teller werd één enkele timeout. De pionnen tekenen alleen hele frames en pauzeren als ze buiten beeld zijn, bij verminderde beweging of bedekt door een kaart. De gloed en ringen animeren dekking en positie in plaats van schaduwen, en ze pulseren drie keer en rusten dan. Inactief werk op het bord daalde van 624 ms naar 15 ms over tien seconden headless testen. Met een open kaart en de drakenpion op het bord daalde het van 1.188 ms naar 11 ms. Onze animaties tonen nu meer zelfbeheersing dan wij ergens anders in dit project hebben getoond.
Het verscheen als 1.2.10, kop “Koelere telefoons”, naast een eerlijkere ontslagregel. Alleen je salaris stopt als je wordt ontslagen. Je bijinkomsten blijven betalen, en de rekeningen zijn nog steeds verschuldigd. Ontslagen worden hoort pijn te doen. Het hoort je bijverdienste niet te wissen.
Het grootboek: elke releasenote, achter elkaar gelezen
We bewaren onze releasenotes in één bestand, hetzelfde bestand dat beide stores voedt. In volgorde gelezen vormen ze een vreemd soort dagboek, dus hier is het met de ondertoon erbij. Data zijn commitdata. Het bestand springt van 1.0.1 direct naar 1.2.6, dus wat er ertussen gebeurde, gebeurde zonder dagboek. Elk versienummer hieronder linkt naar zijn eigen bericht.
1.0.0
Eerste release van Moneyflow. Bouw je financiële imperium met vastgoed, aandelen en bedrijven. Ontsnap aan de 9-tot-5-cyclus, haal de Fast Track en ga voor je dromen.
Oprecht, kort en een beetje doodsbang. Kijk hoe klein het was.
1.0.1
Google Play Webaankopen zijn nu beschikbaar op playmoneyflow.com. Verbeteringen aan stabiliteit en UX overal.
App Store Verbeteringen aan stabiliteit en prestaties. Diverse bugfixes in het paneel met het financieel overzicht en de dobbelsteenanimaties.
Dezelfde versie, twee sets notes. De stores hebben verschillende ideeën over wat je mensen mag vertellen, dus we houden voor elke een set bij en proberen ze niet door elkaar te halen.
1.2.6
Belastingen zijn er: inkomstenbelasting op je salaris, 15% op bijinkomsten, 15% vermogenswinstbelasting op winstgevende verkopen. Personages verdienen nu echte Amerikaanse salarissen van 2025. Huren en bedrijfsrendementen volgen de economie — mager in een crisis, royaal in een hoogconjunctuur.
De belastingman komt eraan. Niemand vroeg erom en iedereen had het nodig. Elk rendement in het spel wordt nu na belasting beoordeeld, want dat is het enige rendement dat telt.
1.2.7
Onderhandel over deals, aanbiedingen en leningoffertes: één muntworp van 50/50, 20% beter of 20% slechter. Kies welk pand je verkoopt in een Biedingsoorlog en welke bezittingen bij een scheiding gaan — of teken Huwelijkse voorwaarden.
Onderhandelen in zijn onschuldige eerste vorm. Ook de eerste verschijning van de Huwelijkse voorwaarden, wat veel zegt over wat ons bezighield.
1.2.8 7 sep
Onderhandel twee keer: onderhandel en heronderhandel — maar de andere kant kan weglopen (10%, dan 15%). Kaarten passen nu bij je leven: geen scheiding vóór een bruiloft, geen aandelenverkoop zonder aandelen. Een scheiding verdeelt je nettovermogen en je ex kan leningen overnemen.
De romantische. Vraag twee keer en ze worden prikkelbaar. Tot deze versie kon het deck je een scheiding geven voordat je getrouwd was, wat chaotischer is dan een kapel in Vegas. Het is ook de versie die ons naar de voordeur van Apple bracht.
1.2.9 22 sep
Inlogfixes: Doorgaan met Google toont de accountkiezer bij een bewuste tik en native inloggen geeft geen fout meer. De Winkel toont altijd zijn items, ook voordat de prijzen zijn geladen.
Geschreven onder dwang, door twee afwijzingen en één ontbrekende parameter.
1.2.10 26 sep
Koelere telefoons: het spel houdt je apparaat niet langer hard aan het werk terwijl je speelt. Inactieve animaties pulseren een paar keer en rusten dan, en het bord wordt niet meer elke seconde opnieuw getekend. Ontslagen zijn eerlijker: alleen je salaris stopt, bijinkomsten blijven betalen en uitgaven zijn nog steeds verschuldigd op overgeslagen betaaldagen.
Die waarin we ophielden je telefoon koorts te geven.
1.2.11 26 sep
Nieuw in het menu Kopen: een stadsappartement, een stomerij en een motel langs de weg. … Elke kaart heeft eigen artwork en je keuzes staan direct onder de kaart. Nodig vrienden uit voor een privé-multiplayerkamer.
De drukste release en een van de kortst levende, want 1.2.12 kwam diezelfde avond. Privékamers zijn de kop voor iedereen met vrienden: een host, twee tot vier plekken en een code van zes tekens.
1.2.12 26 sep
Geld tekort? Je kiest nu hoe je het dekt en ziet hoe dicht je bij faillissement bent: noodleningen op rij, resterende leenruimte en betaaldagen te gaan. Noodleningen kosten nu minder dan een creditcard.
Faillissement komt nu met een aftelling, de vriendelijkste manier die wij kennen om angst te leren. Noodleningen kosten nu minder dan de creditcard, wat meer is dan het echte leven voor je doet. Ook gerepareerd: de dobbelstenen gooiden zichzelf nadat je een kaart had gesloten, wat een bug was of onze meest passief-agressieve functie.
1.3.0 27 sep
24 nieuwe kaarten, van een motel langs de snelweg en een SaaS-bedrijf tot The Big Short, plus zeldzaamheid: ongewone en zeldzame kaarten komen nu voor. Verberg een kaart om het bord te bekijken en tik dan op Terug naar kaart. Ontslagen en noodgevallen kun je niet meer wegklikken.
Vierentwintig nieuwe kaarten, een zeldzaamheidssysteem en stilletjes de belangrijkste verandering van de maand: kaarten komen nu van de server. Daarover hieronder meer.
1.3.1 27 sep
Leen tegen je bezittingen: elk pand, bedrijf of aandeel zonder lening erop kan nu een goedkopere lening met alleen rente zekerstellen, tegen de marktrente plus 0,5%.
Hefboom, alweer. Het is een financieel spel en we kunnen er niets aan doen. Het volgde later dezelfde dag op 1.3.0.
1.4.0 1 okt
Nieuwe Pro-bots plannen elke zet en lezen de economie, en elke bot kan nu dromen kopen, winnen en lenen tegen zijn bezittingen. De economie telt zwaarder: rentes volgen de hoogtij-crisiscyclus, recessies verlagen je belastingen, en de huur van je bezittingen stijgt in een hoogtij en daalt in een recessie.
Die waarin de bots leerden winnen. Tot nu toe kon geen van hen dat, omdat geen van hen ooit een droom kocht. Er kwamen Pro-bots, de economie begon rentes, belastingen en huren mee te laten bewegen met haar stemming, en de app leerde acht talen erbij.
1.4.1 1 okt
… Hypotheken los je nu af over 25 jaar, zakelijke leningen over 15 en autoleningen over 6; bankleningen zijn aflossingsvrij en je kunt lenen tot je maandlasten 67% van je inkomen zijn. …
Hypotheken hebben eindelijk een einddatum. Het leningwerk landde nadat 1.4.0 al was afgesneden, dus het verscheen diezelfde avond als 1.4.1, samen met een nieuwskaart op het startscherm.
1.4.2 1 okt
Eén bug, minder dan twintig minuten na 1.4.1 gerepareerd: de knop Overbruggingslening biedt nu het bedrag dat de bank echt goedkeurt. Hij heeft geen eigen notes voor de stores.
Het weekend van vijf versies.
Zaterdag 26 september
- 14:241.2.10Koelere telefoons, eerlijkere ontslagen
- 16:271.2.11Aanbod, leningvoorwaarden, kaartartwork
- 19:401.2.12De aftelling naar faillissement
Zondag 27 september
- 09:311.3.024 nieuwe kaarten, zeldzaamheid, content op afstand
- 13:191.3.1Lenen tegen je bezittingen
Commit-tijden, Sofia-tijd. Niet elke versie bereikte elke store als zichzelf: in Google Play ging 1.2.12 naar productie in plaats van 1.2.11, en op iOS werd hij in zijn plaats ingediend. In datzelfde weekend kreeg het deck 130 illustraties, in code getekend.
De beste update is er een die niemand hoeft goed te keuren
Aan het eind van dat weekend hadden we iets nuttigs geleerd. Het langzaamste deel van een update uitbrengen is niet het bouwen. Het is wachten tot een store ernaar kijkt. Dus 1.3.0 deed iets anders: hij leerde de app leveringen accepteren.
Nieuwe kaarten komen nu van onze servers, dus de meeste nieuwe content heeft geen app-update meer nodig. Het kostte één app-release om de machinerie te installeren. Daarna zijn nieuwe kaarten een deploy verwijderd, vertalingen en illustraties inbegrepen.
De Winkel werkt op dezelfde manier. Apple beoordeelt een nieuwe in-app-aankoop afzonderlijk, zonder nieuwe build, dus een nieuwe pion heeft ook geen nieuwe versie meer nodig.
Het slimme deel is het vangnet. Niemand krijgt ooit een kaart die zijn app niet kan spelen, dus oude en nieuwe versies kunnen zonder problemen aan één tafel zitten. Als we een echt nieuwe mechaniek bedenken, gaan we nog steeds terug in de rij zoals iedereen.
Dezelfde release bracht zeldzaamheid, wat betekent dat sommige kaarten veel minder vaak voorkomen dan andere. Hoeveel minder vaak is ons geheim, maar de zeldzaamste komen ongeveer zo vaak voor als een App Review die in één keer slaagt. We trokken een gewone.
Het scorebord
Voor de spreadsheetmensen.
- 10buildnummers gebruikt in 20 dagen, van 30 tot 40
- 39in-app-aankopen, stuk voor stuk cosmetisch
- 2afwijzingen van Apple, plus één inzending die we zelf terugtrokken
- 3.917tekens in ons antwoord, van de 4.000 toegestane
- 24 van 39aankopen die bij de eerste run van het script niet werden aangemaakt. De tweede run was schoon
- 2dode builds, 32 en 33, verstuurd zonder hun entitlements
- 5versies gecommit in één weekend
- 624 → 15milliseconden inactief werk per tien seconden, voor en na het afkoelen van het spel
Wat we onszelf aan het begin zouden vertellen
Wat vroeger een avond klikken was, is nu een bump, een notitie en een handvol commando's per store. Het wachten is het enige wat we niet kunnen automatiseren. Al het andere kwam in deze lijst.
- Zet de versie op de inzending vóór de in-app-aankopen. Apple laat je het andersom doen en weigert dan te zeggen waarom.
- Schrijf je reviewnotes voor een reviewer die de app nog nooit heeft gezien. Ze hebben veertig seconden en een iPad, en ze volgen de notes letterlijk. Geef ze het exacte pad naar alles.
- Zet nooit een login voor je Winkel. Gasten hebben ook een portemonnee, en reviewers zijn gasten.
- Onderteken je archief, en laat het script weigeren er een te uploaden dat zijn entitlements niet draagt. Bouw jezelf een uitsmijter.
- Laat ontbrekende sleutels schreeuwen. Build 30 ging uit zonder zijn betalingssleutel en niets klaagde luid, dus de Winkel was gewoon leeg. Een stille fout is een afwijzing met vertraging.
- Test op beide platforms, ook als de code gedeeld is. Android vergaf wat iOS weigerde, en één regel code had twee persoonlijkheden.
- Hernoem producten, nooit hun ID's. Namen zijn tekst. ID's zijn contracten.
- Script het, maak het herhaalbaar, schrijf het op. De API van Apple heeft soms gewoon een moment, dus draai opnieuw voordat je gaat debuggen. Onze runbooks bestaan omdat we alles twee keer vergaten.
- Houd aparte releasenotes bij als de stores aparte regels hebben. Dezelfde versie, andere zinnen.
- Lever content vanaf de server en bewaar de storewachtrij voor nieuwe mechanieken. De beste update is er een die niemand hoeft goed te keuren.
- Test op de hete hardware die je spelers echt bezitten. De simulator bloosde nooit. Een iPhone 16 Pro Max wel.
- Houd de server wakker terwijl de reviewer in de stad is. Een slapende server ziet er precies uit als een kapotte knop.
Maak een proefrit met ons
Moneyflow is gratis in de App Store, gratis in Google Play en gratis in elke browser. Er zijn geen advertenties en je hebt geen account nodig om te beginnen. Alles in de Winkel is cosmetisch. Niets ervan helpt je winnen, wat in een spel over geld ofwel heel principieel is ofwel heel slechte zaken.
Wat is de volgende stap? Meer kaarten, die nu van de server komen, meer manieren om met vrienden te spelen en, als het universum vriendelijk is, een hele week zonder versienummer.
Tot ziens op het bord.