Initial commit
This commit is contained in:
408
skills/expertise/iphone-apps/references/app-store.md
Normal file
408
skills/expertise/iphone-apps/references/app-store.md
Normal file
@@ -0,0 +1,408 @@
|
||||
# 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:
|
||||
|
||||
```ruby
|
||||
# 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:
|
||||
```ruby
|
||||
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:
|
||||
```swift
|
||||
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
|
||||
|
||||
```markdown
|
||||
# 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
|
||||
|
||||
```bash
|
||||
xcodebuild archive \
|
||||
-project MyApp.xcodeproj \
|
||||
-scheme MyApp \
|
||||
-archivePath build/MyApp.xcarchive
|
||||
```
|
||||
|
||||
### 2. Export
|
||||
|
||||
```bash
|
||||
xcodebuild -exportArchive \
|
||||
-archivePath build/MyApp.xcarchive \
|
||||
-exportOptionsPlist ExportOptions.plist \
|
||||
-exportPath build/
|
||||
```
|
||||
|
||||
### 3. Upload
|
||||
|
||||
```bash
|
||||
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
|
||||
Reference in New Issue
Block a user