Files
gh-glittercowboy-taches-cc-…/skills/expertise/iphone-apps/references/app-store.md
2025-11-29 18:28:37 +08:00

7.5 KiB

App Store Submission

App Review guidelines, privacy requirements, and submission checklist.

Pre-Submission Checklist

App Completion

  • All features working
  • No crashes or major bugs
  • Performance optimized
  • Memory leaks resolved

Content Requirements

  • App icon (1024x1024)
  • Screenshots for all device sizes
  • App preview videos (optional)
  • Description and keywords
  • Privacy policy URL
  • Support URL

Technical Requirements

  • Minimum iOS version set correctly
  • Privacy manifest (PrivacyInfo.xcprivacy)
  • All permissions have usage descriptions
  • Export compliance answered
  • Content rights declared

Screenshots

Required Sizes

iPhone 6.9" (iPhone 16 Pro Max): 1320 x 2868
iPhone 6.7" (iPhone 15 Plus): 1290 x 2796
iPhone 6.5" (iPhone 11 Pro Max): 1284 x 2778
iPhone 5.5" (iPhone 8 Plus): 1242 x 2208

iPad Pro 13" (6th gen): 2064 x 2752
iPad Pro 12.9" (2nd gen): 2048 x 2732

Automating Screenshots

With fastlane:

# Fastfile
lane :screenshots do
  capture_screenshots(
    scheme: "MyAppUITests",
    devices: [
      "iPhone 16 Pro Max",
      "iPhone 8 Plus",
      "iPad Pro (12.9-inch) (6th generation)"
    ],
    languages: ["en-US", "es-ES"],
    output_directory: "./screenshots"
  )
end

Snapfile:

devices([
  "iPhone 16 Pro Max",
  "iPhone 8 Plus",
  "iPad Pro (12.9-inch) (6th generation)"
])

languages(["en-US"])
scheme("MyAppUITests")
output_directory("./screenshots")
clear_previous_screenshots(true)

UI Test for screenshots:

import XCTest

class ScreenshotTests: XCTestCase {
    override func setUpWithError() throws {
        continueAfterFailure = false
        let app = XCUIApplication()
        setupSnapshot(app)
        app.launch()
    }

    func testScreenshots() {
        snapshot("01-HomeScreen")

        // Navigate to feature
        app.buttons["Feature"].tap()
        snapshot("02-FeatureScreen")

        // Show detail
        app.cells.firstMatch.tap()
        snapshot("03-DetailScreen")
    }
}

Privacy Policy

Required Elements

  1. What data is collected
  2. How it's used
  3. Who it's shared with
  4. How long it's retained
  5. User rights (access, deletion)
  6. Contact information

Template Structure

# Privacy Policy for [App Name]

Last updated: [Date]

## Information We Collect
- Account information (email, name)
- Usage data (features used, session duration)

## How We Use Information
- Provide app functionality
- Improve user experience
- Send notifications (with permission)

## Data Sharing
We do not sell your data. We share with:
- Analytics providers (anonymized)
- Cloud storage providers

## Data Retention
We retain data while your account is active.
Request deletion at [email].

## Your Rights
- Access your data
- Request deletion
- Export your data

## Contact
[email]

App Review Guidelines

Common Rejections

1. Incomplete Information

  • Missing demo account credentials
  • Unclear functionality

2. Bugs and Crashes

  • App crashes on launch
  • Features don't work

3. Placeholder Content

  • Lorem ipsum text
  • Incomplete UI

4. Privacy Issues

  • Missing usage descriptions
  • Accessing data without permission

5. Misleading Metadata

  • Screenshots don't match app
  • Description claims unavailable features

Demo Account

In App Store Connect notes:

Demo Account:
Username: demo@example.com
Password: Demo123!

Notes:
- Subscription features are enabled
- Push notifications require real device

Review Notes

Notes for Review:

1. This app requires camera access for QR scanning (Settings tab > Scan QR).

2. Push notifications are used for:
   - Order status updates
   - New message alerts

3. Background location is used for:
   - Delivery tracking only when order is active

4. Demo account has pre-populated data for testing.

5. In-app purchases can be tested with sandbox account.

Export Compliance

Quick Check

Answer YES to export compliance if your app:

  • Only uses HTTPS for network requests
  • Only uses Apple's standard encryption APIs
  • Only uses encryption for authentication/DRM

Most apps using HTTPS only can answer YES and select that encryption is exempt.

Full Compliance

If using custom encryption, you need:

  • Encryption Registration Number (ERN) from BIS
  • Or exemption documentation

App Privacy Labels

In App Store Connect, declare:

Data Types

  • Contact Info (name, email, phone)
  • Health & Fitness
  • Financial Info
  • Location
  • Browsing History
  • Search History
  • Identifiers (user ID, device ID)
  • Usage Data
  • Diagnostics

Data Use

For each data type:

  • Linked to User: Can identify the user
  • Used for Tracking: Cross-app/web advertising

Example Declaration

Contact Info - Email Address:
- Used for: App Functionality (account creation)
- Linked to User: Yes
- Used for Tracking: No

Usage Data:
- Used for: Analytics
- Linked to User: No
- Used for Tracking: No

In-App Purchases

Configuration

  1. App Store Connect > Features > In-App Purchases
  2. Create products with:
    • Reference name
    • Product ID (com.app.product)
    • Price
    • Localized display name/description

Review Screenshots

Provide screenshots showing:

  • Purchase screen
  • Content being purchased
  • Restore purchases option

Subscription Guidelines

  • Clear pricing shown before purchase
  • Easy cancellation instructions
  • Terms of service link
  • Restore purchases available

TestFlight

Internal Testing

  • Up to 100 internal testers
  • No review required
  • Immediate availability

External Testing

  • Up to 10,000 testers
  • Beta App Review required
  • Public link option

Test Notes

What to Test:
- New feature: Cloud sync
- Bug fix: Login issues on iOS 18
- Performance improvements

Known Issues:
- Widget may not update immediately
- Dark mode icon pending

Submission Process

1. Archive

xcodebuild archive \
    -project MyApp.xcodeproj \
    -scheme MyApp \
    -archivePath build/MyApp.xcarchive

2. Export

xcodebuild -exportArchive \
    -archivePath build/MyApp.xcarchive \
    -exportOptionsPlist ExportOptions.plist \
    -exportPath build/

3. Upload

xcrun altool --upload-app \
    --type ios \
    --file build/MyApp.ipa \
    --apiKey YOUR_KEY_ID \
    --apiIssuer YOUR_ISSUER_ID

4. Submit

  1. App Store Connect > Select build
  2. Complete all metadata
  3. Submit for Review

Post-Submission

Review Timeline

  • Average: 24-48 hours
  • First submission: May take longer
  • Complex apps: May need more review

Responding to Rejection

  1. Read rejection carefully
  2. Address ALL issues
  3. Reply in Resolution Center
  4. Resubmit

Expedited Review

Request for:

  • Critical bug fixes
  • Time-sensitive events
  • Security issues

Submit request at: https://developer.apple.com/contact/app-store/?topic=expedite

Phased Release

After approval, choose:

  • Immediate: Available to everyone
  • Phased: 7 days gradual rollout
    • Day 1: 1%
    • Day 2: 2%
    • Day 3: 5%
    • Day 4: 10%
    • Day 5: 20%
    • Day 6: 50%
    • Day 7: 100%

Can pause or accelerate at any time.

Version Updates

What's New

Version 2.1

New:
• Cloud sync across devices
• Dark mode support
• Widget for home screen

Improved:
• Faster app launch
• Better search results

Fixed:
• Login issues on iOS 18
• Notification sound not playing

Maintaining Multiple Versions

  • Keep previous version available during review
  • Test backward compatibility
  • Consider forced updates for critical fixes