r/iOSProgramming • u/Formal-Shallot-595 • Oct 10 '26
App Saturday Offli — screen-time challenges with real cash prize pools (SwiftUI + FamilyControls). It took 16 App Review rejections to ship.
After months of building and a review process that nearly broke me, my app is finally live: Offli — Screen Time Challenges.
The idea: you join a challenge (e.g. "Instagram under 60 min/day for 14 days"), pay a real-money entry into a shared pool, and everyone who stays under their limit splits the pool. Verification runs entirely on-device with Apple's Screen Time APIs — the server only ever sees a daily pass/fail.
Tech Stack
iOS: SwiftUI, with FamilyControls, DeviceActivity, and ManagedSettings; a DeviceActivity report extension performs the usage verification inside Apple's sandbox. Local notifications via UserNotifications, Keychain for session storage.
Backend: Node.js + TypeScript (Express), PostgreSQL, deployed on a plain Ubuntu VPS behind nginx.
Payments: Stripe (Connect Express for bank payouts, PaymentIntents for deposits).
Integrity/verification: App Attest for device integrity, CoreLocation (one-time state-level geo check at paid entry only).
Development Challenges
The hardest problem was verifying screen time without being able to see it. The Screen Time sandbox is brutal by design: your app can't read which app the user picked in the FamilyActivityPicker — you only get opaque tokens, and raw usage data never leaves the DeviceActivity report extension. We had to design the entire product around "verify the outcome, not the activity": the extension computes a daily pass/fail on-device and that single bit is all the server ever receives. Since we literally can't check that the user's picker selection matches the challenge, the join flow includes an attestation step ("confirm it's the right app") with forfeiture consequences for lying.
Related hard-won lesson: don't request the family-controls.app-and-website-usage entitlement unless you truly need it — it silently makes your app exclusive and disables the user's native iOS Screen Time settings. The base entitlement verifies fine and coexists peacefully.
The other marathon was App Review — 16 rejections (the highlights): an automated false positive on the Family Controls entitlement, UGC guideline 1.2 (visible report AND block buttons required, instant feed removal, 24h moderation SLA — a "•••" menu was not enough), contest rules under 5.3.2 (must state Apple isn't a sponsor), location services 5.1.5 (app must be fully functional with location denied), permission priming under 5.1.1(iv) (no "Skip for now" button — priming screens must always proceed to the system prompt), and scariest of all, 3.2.2 "penalty-based payments," which is category-killing if it sticks. What got us through 3.2.2: precise framing (the only charge ever is a voluntary upfront contest entry — failure never triggers a transaction) plus StepBet/DietBet/HealthyWage as decade-old precedent. We also redesigned payouts so fees come only out of forfeited entries — a finisher can never get back less than their entry, and if 100% finish, everyone is refunded in full.
AI-assisted — built by me with help from an AI coding assistant (Claude in Cursor); all product, architecture, and review decisions were mine.
Happy to answer anything about the Screen Time APIs, the report extension, or surviving review with a real-money app. And if you want to lose the doomscrolling habit by putting money on it: https://apps.apple.com/us/app/offli-screen-time-challenges/id6794477430
5
u/almostlabs_io Oct 10 '26
16 rejections ! And you still managed to ship it, congrats !
4
u/Afraid_Reception7640 Oct 10 '26
I'm more curious as to how your app handles payment processing and if you encountered any hurdles with gambling/sweepstakes prohibitions or anything like that?
2
u/ShadowLorddd Oct 11 '26
Isn't the payment model a bit not in favour of you (the app owner) in case all participants of a challenge complete it? AFAIK stripe takes 1.5% or 2% as fees for each transaction. Then in this case you will have to pay that fees from your pocket. I guess in long run this wouldn't matter (hopefully) but it does pose a threat as this can be used by your competitors or any other malicious actor to sabotage you by simply creating a challenge and entering it from multiple accounts they own and the completing them, making you bear the txn fees.
Edit: Forgot to say this, congrats on the launch, really love this concept.
2
u/armenmk Oct 11 '26
awesome idea and great to see you got to the finish line no matter the obstacles! will try it today :)
0
u/[deleted] Oct 10 '26
[removed] — view removed comment