README is a short front page (about 120 lines) with one real visual per section; every former section moved unchanged into docs/*.md with a docs/README.md index (journey, rejections, getting-started, commands, growth, studios, store-art, listing-languages, api, skills, mcp, safety, faq, project). The site tells the same story on one page: the teaser in the hero, real CLI output as text, the desktop app as a section with light/dark captures of eight screens and the per-system downloads (desktop/latest.json); /desktop/ redirects to /#download. New capture tools: tools/site-desktop-shots.ts (fixture-mode desktop frames) and tools/site-term-shots.ts (real CLI output as text and WebP). tests/docs-links.test.ts checks README, docs and site links resolve.
37 lines
3.7 KiB
Text
37 lines
3.7 KiB
Text
$ storebound scan
|
|
storebound scan · storebound.config.ts
|
|
stack: iOS (native) · targets: iOS · 11 files
|
|
|
|
SDKs
|
|
Google AdMob ads, tracking-capable · CocoaPods Google-Mobile-Ads-SDK 11.10.0 (Podfile.lock:2)
|
|
Google Sign-In auth · CocoaPods GoogleSignIn 7.1.0 (Podfile.lock:3)
|
|
|
|
Rejection risks: 2 blocker, 3 high, 0 medium, 0 low
|
|
1. BLOCKER 2.1(a) · App Store · Sign-in is required but there is no demo account for App Review
|
|
at storebound.config.ts:12 reviewAccess: { signInRequired: true, instructions: 'Sign in with the demo account.' },
|
|
at storebound.config.ts:11 accounts: { enabled: true },
|
|
at Podfile.lock:3 Google Sign-In: GoogleSignIn 7.1.0
|
|
fix: Create a demo account that sees every feature (not a sign-up the reviewer must do), put it in .storebound/credentials.json as reviewDemoAccount (never in the repo), then `storebound apple review-details`.
|
|
skill: review-access · https://developer.apple.com/app-store/review/guidelines/
|
|
2. BLOCKER 5.1.1(v) · App Store · Accounts can be created but no in-app account deletion was found
|
|
at storebound.config.ts:11 accounts: { enabled: true },
|
|
at Planner/LoginView.swift:11 Button("Create account") { Task { try await AccountApi.signUp() } }
|
|
at Planner/LoginView.swift:17 static func signUp() async throws {
|
|
fix: Add "Delete account" in the app (it deletes the account and its data, not only signs out; with Sign in with Apple also revoke the token), then set accounts.inApp to where it starts, e.g. "Settings > Account > Delete account".
|
|
skill: account-deletion · https://developer.apple.com/app-store/review/guidelines/
|
|
3. HIGH 4.8 · App Store · Third-party login (Google / Facebook / ...) without Sign in with Apple or another equivalent login option
|
|
at Podfile.lock:3 Google Sign-In: GoogleSignIn 7.1.0
|
|
at Planner/LoginView.swift:9 GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController()) { _, _ in }
|
|
fix: Offer Sign in with Apple (Signing & Capabilities > Sign in with Apple, ASAuthorizationAppleIDProvider) or another login that limits data to name and email, lets people hide their email and does not track. Not needed when the app only uses your own account system, or for the exemptions in 4.8 (education / enterprise accounts, government ID, a client for that one service).
|
|
skill: review-rejections · https://developer.apple.com/app-store/review/guidelines/
|
|
4. HIGH 3.1.1 · App Store · Restorable purchases (non-consumables or subscriptions) but no Restore Purchases path was found
|
|
at storebound.config.ts:16 com.example.planner.pro (non_consumable)
|
|
fix: Add a visible "Restore Purchases" button (StoreKit 2: AppStore.sync(); StoreKit 1: restoreCompletedTransactions; RevenueCat: restorePurchases) on the store / paywall screen or in Settings.
|
|
skill: store-iap-setup · https://developer.apple.com/app-store/review/guidelines/
|
|
5. HIGH 5.1.2(i) · App Store · Tracking-capable code without App Tracking Transparency (Google AdMob, IDFA)
|
|
at Podfile.lock:2 Google AdMob: Google-Mobile-Ads-SDK 11.10.0
|
|
at Planner/Ads.swift:7 print(ASIdentifierManager.shared().advertisingIdentifier)
|
|
fix: If any SDK tracks (personalized ads, attribution, IDFA): add NSUserTrackingUsageDescription and request ATT before the SDKs start, and answer App Privacy "used for tracking". If nothing tracks: configure the ad SDKs for non-personalized ads and answer "no tracking".
|
|
skill: ads-mediation-checks · https://developer.apple.com/app-store/review/guidelines/
|
|
|
|
… 52 more lines: the declarations proposal (Data safety, App Privacy, ATT, privacy manifest) and the config diff
|