7.5 KiB
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
- What data is collected
- How it's used
- Who it's shared with
- How long it's retained
- User rights (access, deletion)
- 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
- App Store Connect > Features > In-App Purchases
- 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
- App Store Connect > Select build
- Complete all metadata
- 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
- Read rejection carefully
- Address ALL issues
- Reply in Resolution Center
- 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