A native iOS app for crypto and blockchain readers — articles, live market prices, listen-mode audio, highlights, and reading stats — built with SwiftUI.
- Name: EtherWorld
- Bundle ID: co.etherworld.app
- Version: 1.0 (build number must be bumped before re-archive)
- Platform: iOS 16.0+, iPadOS 16.0+
Apple rejected v1.0 build 1 on March 18, 2026 under Guideline 4.2.2 — Minimum Functionality (Submission ID
03a3f4d3-c263-4dc2-aef3-04006428179b), citing "limited or no native functionality" beyond aggregated web content. This release adds substantial native iOS-only capabilities that fundamentally cannot be reproduced by a mobile browser.
| Feature | Files | Why it satisfies 4.2.2 |
|---|---|---|
| Markets tab — live crypto watchlist (CoinGecko) with sparkline charts, add/remove/reorder, 60-second auto-refresh, search-to-add, coin detail with stats | CryptoModels.swift, CryptoMarketService.swift, CryptoMarketViewModel.swift, CryptoWatchlistView.swift |
A native financial tracker not present on etherworld.co; data persisted on-device. |
Listen Mode — AVSpeechSynthesizer-driven audio reader on every article with play/pause/stop, speed control (0.75×–1.5×), progress bar, and background audio |
AudioReaderManager.swift (+ inline AudioPlayerControls), IOS-App-Info.plist (UIBackgroundModes) |
On-device speech synthesis and background-locked playback are device-only capabilities. |
| Highlights & Notes — five-color highlights with personal notes per article, on-device JSON store, dedicated browse hub with search and color filtering | HighlightsManager.swift (+ AddHighlightSheet, HighlightsView) |
A personal reading journal stored locally; meaningless without the app. |
| Reading Stats & Streak — daily streak (current + longest), total articles, total minutes, 14-day reading chart, top topics leaderboard | ReadingStatsManager.swift (+ ReadingStatsView) |
All computed and persisted on-device. |
| Siri Shortcuts via App Intents — "Read me the latest EtherWorld article", "Show my crypto watchlist in EtherWorld", "Open the latest article in EtherWorld" | EtherworldAppIntents.swift |
Native voice control wired to in-app navigation and audio playback. |
IOS_App/AdaptiveContentView.swift— added 5th Markets tab on iPhone, sidebar entry on iPad, and observers for the three App Intent notifications.IOS_App/ArticleDetailView.swift— inlineAudioPlayerControlsbelow the title, "highlighter" toolbar button, and reading-stats logging on appear.IOS_App/ProfileSettingsView.swift— new "Reading" section linking to Reading Stats & Streak and Highlights & Notes.IOS_App/IOS-App-Info.plist— addedUIBackgroundModes(audio,fetch,processing,remote-notification).APP_REVIEW_NOTES.md— rewritten with a 12-step reviewer test path tied to the new features.APP_STORE_METADATA.md— updated subtitle, description, keywords, and reviewer notes for resubmission.memory/PRD.md— full product record of the remediation work.
- Xcode → target IOS_App → Signing & Capabilities → + Capability → Background Modes → check Audio, AirPlay, and Picture in Picture + Background fetch. (The Info.plist key is already set; Xcode also needs the capability checkbox enabled.)
- Bump the build number (
CURRENT_PROJECT_VERSION) before archiving. - Walk through the reviewer test path in
APP_REVIEW_NOTES.mdon a physical device. - Paste the new "Notes for Review" text from
APP_REVIEW_NOTES.mdinto App Store Connect when resubmitting. - Update the App Store Connect listing copy from
APP_STORE_METADATA.md.
cd /app
git status # all touched files
git diff --stat # per-file additions/deletions summary
git diff IOS_App/AdaptiveContentView.swift # one specific fileIn Xcode: open IOS_App.xcodeproj → Source Control navigator (⌥⌘2) for line-level diffs.
The Xcode project uses synchronized folders (
PBXFileSystemSynchronizedRootGroup,objectVersion 77), so all new Swift files are picked up automatically. Noproject.pbxprojedits are required.
- ✅ Apple Sign In
- ✅ Google Sign In
- ✅ OTP via Email (6-digit verification code)
- ✅ Firebase Authentication
- ✅ Markets tab — live crypto watchlist with sparkline charts (CoinGecko)
- ✅ Listen Mode — TTS audio playback per article with speed control + background audio
- ✅ Highlights & Notes — 5 colors, personal notes, on-device search
- ✅ Reading Stats & Streak — daily streak, 14-day chart, top topics
- ✅ Siri Shortcuts via App Intents (latest article / listen aloud / watchlist)
- ✅ Browse articles from Ghost CMS
- ✅ For You feed with topic personalization (and Latest mode)
- ✅ Search with language filtering
- ✅ Bookmark/Save articles for offline reading
- ✅ Mark articles as read
- ✅ Offline mode with local caching
- ✅ Background refresh
- ✅ Push notifications
- ✅ Multi-language support (EN, ES, FR, DE, etc.)
- ✅ Dark/Light/System theme
- ✅ iPad optimized with sidebar
- ✅ Author profiles
- ✅ Share articles
- ✅ Spotlight indexing of articles
- ✅ Privacy Policy view
- ✅ Data export capability
- ✅ Session details (active session UI)
- ✅ Analytics (opt-in)
- ✅ Account deletion
- ✅ Supabase integration for preferences sync
Config.xcconfig- API keys and configurationGoogleService-Info.plist- Firebase configurationIOS-App-Info.plist- App configuration and permissions
- Ghost CMS API Key
- Ghost Base URL
- Supabase URL
- Supabase Anon Key
- Firebase (configured via GoogleService-Info.plist)
The app requests the following permissions:
- Background fetch: Article updates
- Background audio: Listen Mode (text-to-speech) keeps playing when the screen is locked or the app is backgrounded
- Bundle ID configured:
co.etherworld.app - Version numbers set: 1.0 (Build 1)
- App icon configured (1024x1024)
- Launch screen with logo
- Privacy descriptions added
- App Transport Security configured
- Firebase Bundle ID updated
- Remove dev/demo login path before production
- Test on physical device
- Test Apple Sign In
- Test Google Sign In
- Test Magic Link authentication
- Test offline mode (airplane mode)
- Test bookmarking and read status
- Test background refresh
- Test on iPad
- Test theme switching
- Test language switching
- Test push notifications
- Create app listing
- Upload screenshots (6.7" iPhone, 12.9" iPad Pro)
- Add app description
- Add keywords
- Set support URL: https://etherworld.co
- Set privacy policy URL: https://etherworld.co/privacy
- Configure in-app purchases (if any)
- Submit for review
- Finalized listing copy: see
APP_STORE_METADATA.md
- Native functionality remediation implemented (in-app navigation policy, in-app privacy access, personalization onboarding)
- NEW Markets tab: native crypto watchlist (CoinGecko) with sparklines, add/remove/reorder, auto-refresh
- NEW Listen Mode: native AVSpeechSynthesizer audio playback with background audio + speed control
- NEW Highlights & Notes: 5 colors, personal notes, search, on-device persistence
- NEW Reading Stats & Streak: streak card, 14-day chart, top topics
- NEW Siri Shortcuts via App Intents (open latest, listen aloud, open watchlist)
- Reviewer notes prepared: see
APP_REVIEW_NOTES.md - In Xcode → Target → Signing & Capabilities, ensure "Background Modes" is added with Audio, AirPlay, and Picture in Picture + Background fetch checked
- Validate reviewer test path on physical device before submission
- Login screen with logo
- Home feed with articles
- Article detail view
- Search results
- Saved articles
- Settings screen
- iPad sidebar view
- ArticleService: Protocol for fetching articles
- GhostArticleService: Implementation for Ghost CMS
- MockArticleService: For testing/previews
- AuthenticationManager: Handles all auth flows
- AnalyticsManager: Firebase Analytics
- NotificationManager: Push notifications
- OfflineManager: Local caching and offline support
- BackgroundRefreshManager: Background updates
- SpotlightIndexer: iOS Spotlight integration
- CryptoMarketService (new): CoinGecko public market data client
- CryptoMarketViewModel (new): Watchlist state, ordering, auto-refresh
- AudioReaderManager (new): AVSpeechSynthesizer-backed Listen Mode (background audio)
- HighlightsManager (new): On-device highlights and notes store
- ReadingStatsManager (new): Streaks, totals, top topics, 14-day history
- LoginView: Authentication screen
- HomeFeedView: Main article feed
- ArticleDetailView: Full article view (now with inline
AudioPlayerControlsand a highlight toolbar button) - DiscoverView: Search and explore
- SavedArticlesView: Bookmarked articles
- SettingsView: App settings
- ProfileSettingsView: User profile (now links to Reading Stats and Highlights)
- AuthorProfileView: Author details
- AdaptiveContentView: 5-tab iPhone layout / iPad sidebar (Home, Markets, Search, Saved, Profile)
- CryptoWatchlistView (new): Markets tab — list, add, reorder, swipe-to-remove
- AddCoinSearchView (new): Search any coin to add to watchlist
- CoinDetailView (new): Coin detail with sparkline and stat grid
- AudioPlayerControls (new): Inline article audio bar
- AddHighlightSheet (new): Save passage + note + color
- HighlightsView (new): Browse, filter and search highlights
- ReadingStatsView (new): Streak card, 14-day chart, top topics
OpenLatestArticleIntentOpenCryptoWatchlistIntentReadLatestArticleIntent- Wired in
EtherworldShortcutsProviderand observed byAdaptiveContentView.
- Article: Main content model
- Author: Writer information
- User: Account data
- Coin / SparklineData / CoinSearchResult (new): CoinGecko market models
- ArticleHighlight / HighlightColor (new): User highlights
- ReadingDayLog (new): Per-day reading totals
- Content delivery
- Article management
- Tag/category filtering
- Multi-language support
- Email logging (
emailstable) - User preferences sync (
user_preferencestable) - Backup/restore data
- Authentication (Apple, Google, Email)
- Analytics
- Cloud Messaging (push notifications)
- Crashlytics (optional)
- Live cryptocurrency price + sparkline data via the public
/coins/marketsand/searchendpoints - No API key required
- 60-second auto-refresh; pull-to-refresh supported
- Rate limit: ~10–30 req/min on the free public tier — well within app usage
- Open
IOS_App.xcodeprojin Xcode - Select your development team
- Ensure all config files are present
- Build and run on simulator or device
- Select "Any iOS Device" as destination
- Product → Archive
- Validate the archive
- Distribute to App Store Connect
- Submit for review
- Test all auth flows on physical device before submission
- Verify Firebase and Supabase are properly configured
- Check that all API keys are valid and not expired
- Ensure offline mode works correctly
- Test on both iPhone and iPad
- Website: https://etherworld.co
- Twitter: https://twitter.com/AayushS20298601
- Privacy Policy: https://etherworld.co/privacy
Proprietary - All rights reserved