packwise-skills 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursorrules +23 -23
- package/CLAUDE.md +25 -25
- package/LICENSE +21 -0
- package/README.md +404 -295
- package/audit.md +224 -224
- package/bin/packwise.js +322 -155
- package/install.sh +123 -0
- package/package.json +32 -31
- package/skill.md +944 -719
- package/sub-skills/ai/local-llm.md +183 -183
- package/sub-skills/ai/python-ml.md +164 -164
- package/sub-skills/backend/go-server.md +184 -184
- package/sub-skills/backend/java-spring.md +241 -241
- package/sub-skills/backend/node-server.md +164 -164
- package/sub-skills/backend/php-laravel.md +175 -175
- package/sub-skills/backend/python-server.md +164 -164
- package/sub-skills/backend/rust-backend.md +118 -118
- package/sub-skills/cli/python-cli.md +236 -236
- package/sub-skills/cli/sdk-library.md +497 -497
- package/sub-skills/cloud/ci-cd-pipelines.md +350 -350
- package/sub-skills/cloud/docker.md +191 -191
- package/sub-skills/cloud/kubernetes.md +277 -277
- package/sub-skills/cloud/payment-integration.md +307 -307
- package/sub-skills/cross-platform/multiplatform.md +252 -252
- package/sub-skills/desktop/electron.md +783 -783
- package/sub-skills/desktop/game-dev.md +443 -443
- package/sub-skills/desktop/native-app.md +123 -123
- package/sub-skills/desktop/scenarios.md +443 -443
- package/sub-skills/desktop/smart-platforms.md +324 -324
- package/sub-skills/desktop/tauri.md +428 -428
- package/sub-skills/desktop/vr-ar.md +252 -252
- package/sub-skills/desktop/web-to-desktop.md +153 -153
- package/sub-skills/embedded/car-infotainment.md +129 -129
- package/sub-skills/embedded/esp32.md +184 -184
- package/sub-skills/embedded/ros.md +150 -150
- package/sub-skills/embedded/stm32.md +160 -160
- package/sub-skills/mobile/android.md +322 -322
- package/sub-skills/mobile/capacitor.md +232 -232
- package/sub-skills/mobile/flutter-mobile.md +138 -138
- package/sub-skills/mobile/harmonyos.md +150 -150
- package/sub-skills/mobile/ios.md +245 -245
- package/sub-skills/mobile/react-native.md +443 -443
- package/sub-skills/mobile/wearables.md +230 -230
- package/sub-skills/plugins/browser-extension.md +308 -308
- package/sub-skills/plugins/jetbrains-plugin.md +226 -226
- package/sub-skills/plugins/vscode-extension.md +204 -204
- package/sub-skills/security/security-tools.md +174 -174
- package/sub-skills/web/monorepo.md +274 -274
- package/sub-skills/web/pwa.md +220 -220
- package/sub-skills/web/serverless-edge.md +295 -295
- package/sub-skills/web/spa.md +266 -266
- package/sub-skills/web/ssr.md +228 -228
- package/sub-skills/web/wasm.md +243 -243
package/sub-skills/mobile/ios.md
CHANGED
|
@@ -1,245 +1,245 @@
|
|
|
1
|
-
# iOS / iPadOS Build Sub-Skill
|
|
2
|
-
|
|
3
|
-
Build and publish Swift/ObjC native iOS and iPadOS applications. **Must build on macOS.**
|
|
4
|
-
|
|
5
|
-
**Current version**: iOS 18 / iPadOS 18 / Xcode 16 / Swift 6.0 (2025-2026)
|
|
6
|
-
|
|
7
|
-
## When to Use
|
|
8
|
-
|
|
9
|
-
- Native iOS/iPadOS applications (SwiftUI or UIKit)
|
|
10
|
-
- Apps requiring deep Apple ecosystem integration (HealthKit, CoreML, ARKit)
|
|
11
|
-
- Apps published to the App Store
|
|
12
|
-
- iPad-optimized applications (split view, pencil support, Stage Manager)
|
|
13
|
-
|
|
14
|
-
## Prerequisites
|
|
15
|
-
|
|
16
|
-
- macOS 14+ with Xcode 16 (free from App Store)
|
|
17
|
-
- Apple Developer Program ($99/year, required for App Store distribution)
|
|
18
|
-
- Apple Developer Certificate + Provisioning Profile
|
|
19
|
-
- Physical iOS device for testing (recommended; Simulator available)
|
|
20
|
-
|
|
21
|
-
## Build
|
|
22
|
-
|
|
23
|
-
### Command Line Build
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Archive (production build)
|
|
27
|
-
xcodebuild -workspace MyApp.xcworkspace \
|
|
28
|
-
-scheme MyApp \
|
|
29
|
-
-configuration Release \
|
|
30
|
-
-archivePath build/MyApp.xcarchive \
|
|
31
|
-
-destination "generic/platform=iOS" \
|
|
32
|
-
archive
|
|
33
|
-
|
|
34
|
-
# Export IPA
|
|
35
|
-
xcodebuild -exportArchive \
|
|
36
|
-
-archivePath build/MyApp.xcarchive \
|
|
37
|
-
-exportOptionsPlist ExportOptions.plist \
|
|
38
|
-
-exportPath build/
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
```xml
|
|
42
|
-
<!-- ExportOptions.plist -->
|
|
43
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
44
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
45
|
-
<plist version="1.0">
|
|
46
|
-
<dict>
|
|
47
|
-
<key>method</key>
|
|
48
|
-
<string>app-store</string>
|
|
49
|
-
<key>teamID</key>
|
|
50
|
-
<string>YOUR_TEAM_ID</string>
|
|
51
|
-
<key>uploadBitcode</key>
|
|
52
|
-
<false/>
|
|
53
|
-
<key>uploadSymbols</key>
|
|
54
|
-
<true/>
|
|
55
|
-
</dict>
|
|
56
|
-
</plist>
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Build Targets
|
|
60
|
-
|
|
61
|
-
| Target | Command | Output |
|
|
62
|
-
|--------|---------|--------|
|
|
63
|
-
| Simulator | `xcodebuild -sdk iphonesimulator` | .app (for testing) |
|
|
64
|
-
| Device | `xcodebuild -sdk iphoneos` | .app (unsigned) |
|
|
65
|
-
| Archive | `xcodebuild archive` | .xcarchive |
|
|
66
|
-
| IPA | `xcodebuild -exportArchive` | .ipa (for distribution) |
|
|
67
|
-
| TestFlight | Upload .ipa via Xcode Organizer or `altool` | On App Store Connect |
|
|
68
|
-
| App Store | Submit via App Store Connect | Public release |
|
|
69
|
-
|
|
70
|
-
## Signing & Provisioning
|
|
71
|
-
|
|
72
|
-
### Automatic Signing (Xcode-managed, recommended for small teams)
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
Xcode → Target → Signing & Capabilities:
|
|
76
|
-
✅ Automatically manage signing
|
|
77
|
-
Team: [Select your team]
|
|
78
|
-
Bundle Identifier: com.yourcompany.yourapp
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Manual Signing (CI/CD, enterprise)
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
# Install certificate
|
|
85
|
-
security import certificate.p12 -P password -k ~/Library/Keychains/login.keychain-db
|
|
86
|
-
|
|
87
|
-
# Install provisioning profile
|
|
88
|
-
cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
|
|
89
|
-
|
|
90
|
-
# Verify
|
|
91
|
-
security find-identity -v -p codesigning
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### fastlane (Automated Signing + Build + Upload)
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
# Install
|
|
98
|
-
gem install fastlane
|
|
99
|
-
|
|
100
|
-
# Initialize
|
|
101
|
-
cd ios && fastlane init
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
```ruby
|
|
105
|
-
# ios/fastlane/Fastfile
|
|
106
|
-
default_platform(:ios)
|
|
107
|
-
|
|
108
|
-
platform :ios do
|
|
109
|
-
desc "Push to TestFlight"
|
|
110
|
-
lane :beta do
|
|
111
|
-
increment_build_number(xcodeproj: "MyApp.xcodeproj")
|
|
112
|
-
build_app(
|
|
113
|
-
workspace: "MyApp.xcworkspace",
|
|
114
|
-
scheme: "MyApp",
|
|
115
|
-
export_method: "app-store"
|
|
116
|
-
)
|
|
117
|
-
upload_to_testflight
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
desc "Push to App Store"
|
|
121
|
-
lane :release do
|
|
122
|
-
build_app(
|
|
123
|
-
workspace: "MyApp.xcworkspace",
|
|
124
|
-
scheme: "MyApp",
|
|
125
|
-
export_method: "app-store"
|
|
126
|
-
)
|
|
127
|
-
upload_to_app_store(force: true)
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
# Run
|
|
134
|
-
cd ios && fastlane beta # Upload to TestFlight
|
|
135
|
-
cd ios && fastlane release # Upload to App Store
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## App Store Upload
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
# Method 1: Xcode Organizer (GUI)
|
|
142
|
-
# Product → Archive → Distribute App → App Store Connect → Upload
|
|
143
|
-
|
|
144
|
-
# Method 2: altool (CLI)
|
|
145
|
-
xcrun altool --upload-app \
|
|
146
|
-
-f build/MyApp.ipa \
|
|
147
|
-
--type ios \
|
|
148
|
-
--apiKey YOUR_API_KEY \
|
|
149
|
-
--apiIssuer YOUR_ISSUER_ID
|
|
150
|
-
|
|
151
|
-
# Method 3: Transporter app (Apple's upload tool from App Store)
|
|
152
|
-
|
|
153
|
-
# Method 4: fastlane (automated)
|
|
154
|
-
fastlane deliver --ipa build/MyApp.ipa
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## Publishing Checklist
|
|
158
|
-
|
|
159
|
-
| Step | Description |
|
|
160
|
-
|------|-------------|
|
|
161
|
-
| 1. Apple Developer Program | $99/year at developer.apple.com |
|
|
162
|
-
| 2. Create App ID | Apple Developer Portal → Identifiers |
|
|
163
|
-
| 3. Create Provisioning Profile | Development + Distribution |
|
|
164
|
-
| 4. Build Archive | Xcode → Product → Archive |
|
|
165
|
-
| 5. Upload to App Store Connect | Xcode Organizer or Transporter |
|
|
166
|
-
| 6. Fill app info | Description, screenshots (6.7", 6.5", 5.5"), keywords, privacy policy URL |
|
|
167
|
-
| 7. Set pricing | Free or paid; tier selection |
|
|
168
|
-
| 8. Submit review | Typically 24–48 hours; can be expedited |
|
|
169
|
-
| 9. Release | Automatic after approval, or manual release |
|
|
170
|
-
|
|
171
|
-
## iPadOS Adaptation
|
|
172
|
-
|
|
173
|
-
```swift
|
|
174
|
-
// Info.plist — Universal app (iPhone + iPad)
|
|
175
|
-
<key>UIDeviceFamily</key>
|
|
176
|
-
<array>
|
|
177
|
-
<integer>1</integer> <!-- iPhone -->
|
|
178
|
-
<integer>2</integer> <!-- iPad -->
|
|
179
|
-
</array>
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### iPadOS-Specific Considerations
|
|
183
|
-
|
|
184
|
-
| Feature | Implementation |
|
|
185
|
-
|---------|---------------|
|
|
186
|
-
| Split View / Slide Over | Auto Layout with size classes; handle `traitCollectionDidChange` |
|
|
187
|
-
| Stage Manager (M1+ iPad) | Support multiple window sizes; `UIWindowScene` API |
|
|
188
|
-
| Apple Pencil | `UIPencilInteraction` for double-tap; `UIHoverGestureRecognizer` for hover |
|
|
189
|
-
| Keyboard & Trackpad | `UIKeyCommand` for keyboard shortcuts; pointer interaction |
|
|
190
|
-
| External Display | `UIScreen.screens` for multi-display; `UIWindowScene` per display |
|
|
191
|
-
| Drag & Drop | `UIDragInteraction` / `UIDropInteraction` |
|
|
192
|
-
| Multitasking | Design for any width (compact/regular); test in Simulator |
|
|
193
|
-
|
|
194
|
-
## TestFlight (Beta Distribution)
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
1. Upload build via Xcode or fastlane
|
|
198
|
-
2. App Store Connect → TestFlight → Builds
|
|
199
|
-
3. Internal testing: up to 100 testers (instant, no review)
|
|
200
|
-
4. External testing: up to 10,000 testers (requires Beta App Review, ~24h)
|
|
201
|
-
5. Public link: share TestFlight link for anyone to join
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
## CI/CD — GitHub Actions
|
|
205
|
-
|
|
206
|
-
```yaml
|
|
207
|
-
name: iOS Build
|
|
208
|
-
on:
|
|
209
|
-
push:
|
|
210
|
-
tags: ['v*']
|
|
211
|
-
jobs:
|
|
212
|
-
build:
|
|
213
|
-
runs-on: macos-latest
|
|
214
|
-
steps:
|
|
215
|
-
- uses: actions/checkout@v4
|
|
216
|
-
- uses: ruby/setup-ruby@v1
|
|
217
|
-
with:
|
|
218
|
-
ruby-version: '3.3'
|
|
219
|
-
- run: gem install fastlane
|
|
220
|
-
- uses: apple-actions/import-codesign-certs@v3
|
|
221
|
-
with:
|
|
222
|
-
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
|
|
223
|
-
p12-password: ${{ secrets.CERTIFICATES_PASSWORD }}
|
|
224
|
-
- run: cd ios && fastlane beta
|
|
225
|
-
env:
|
|
226
|
-
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.API_KEY_ID }}
|
|
227
|
-
APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.API_ISSUER_ID }}
|
|
228
|
-
APP_STORE_CONNECT_API_KEY: ${{ secrets.API_KEY }}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## Common Pitfalls
|
|
232
|
-
|
|
233
|
-
| Issue | Fix |
|
|
234
|
-
|-------|-----|
|
|
235
|
-
| Certificate expired | Renew via Apple Developer Portal; re-download provisioning profile |
|
|
236
|
-
| Profile mismatch | Regenerate profile; ensure Bundle ID matches exactly |
|
|
237
|
-
| App Store rejection | Read App Review Guidelines; ensure privacy policy URL is live |
|
|
238
|
-
| Test device limit | Development Profile: max 100 devices per type; Enterprise: unlimited |
|
|
239
|
-
| iPadOS layout broken | Test with all iPad sizes in Simulator; use size classes |
|
|
240
|
-
| "Missing push notification entitlement" | Add Push Notification capability in Xcode; or remove if not needed |
|
|
241
|
-
| "Unsupported Architecture" | Ensure only arm64 in Build Settings (no armv7) |
|
|
242
|
-
| Bitcode warning | Bitcode is deprecated since Xcode 14; disable in build settings |
|
|
243
|
-
| Swift version mismatch | Set Swift Language Version in Build Settings to match your code |
|
|
244
|
-
| Simulator builds failing | Ensure Xcode Command Line Tools installed: `xcode-select --install` |
|
|
245
|
-
| Screenshot requirements | Must include 6.7" (iPhone 15 Pro Max), 6.5" (iPhone 11), 5.5" (iPhone 8 Plus) |
|
|
1
|
+
# iOS / iPadOS Build Sub-Skill
|
|
2
|
+
|
|
3
|
+
Build and publish Swift/ObjC native iOS and iPadOS applications. **Must build on macOS.**
|
|
4
|
+
|
|
5
|
+
**Current version**: iOS 18 / iPadOS 18 / Xcode 16 / Swift 6.0 (2025-2026)
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
- Native iOS/iPadOS applications (SwiftUI or UIKit)
|
|
10
|
+
- Apps requiring deep Apple ecosystem integration (HealthKit, CoreML, ARKit)
|
|
11
|
+
- Apps published to the App Store
|
|
12
|
+
- iPad-optimized applications (split view, pencil support, Stage Manager)
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- macOS 14+ with Xcode 16 (free from App Store)
|
|
17
|
+
- Apple Developer Program ($99/year, required for App Store distribution)
|
|
18
|
+
- Apple Developer Certificate + Provisioning Profile
|
|
19
|
+
- Physical iOS device for testing (recommended; Simulator available)
|
|
20
|
+
|
|
21
|
+
## Build
|
|
22
|
+
|
|
23
|
+
### Command Line Build
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Archive (production build)
|
|
27
|
+
xcodebuild -workspace MyApp.xcworkspace \
|
|
28
|
+
-scheme MyApp \
|
|
29
|
+
-configuration Release \
|
|
30
|
+
-archivePath build/MyApp.xcarchive \
|
|
31
|
+
-destination "generic/platform=iOS" \
|
|
32
|
+
archive
|
|
33
|
+
|
|
34
|
+
# Export IPA
|
|
35
|
+
xcodebuild -exportArchive \
|
|
36
|
+
-archivePath build/MyApp.xcarchive \
|
|
37
|
+
-exportOptionsPlist ExportOptions.plist \
|
|
38
|
+
-exportPath build/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```xml
|
|
42
|
+
<!-- ExportOptions.plist -->
|
|
43
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
44
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
45
|
+
<plist version="1.0">
|
|
46
|
+
<dict>
|
|
47
|
+
<key>method</key>
|
|
48
|
+
<string>app-store</string>
|
|
49
|
+
<key>teamID</key>
|
|
50
|
+
<string>YOUR_TEAM_ID</string>
|
|
51
|
+
<key>uploadBitcode</key>
|
|
52
|
+
<false/>
|
|
53
|
+
<key>uploadSymbols</key>
|
|
54
|
+
<true/>
|
|
55
|
+
</dict>
|
|
56
|
+
</plist>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Build Targets
|
|
60
|
+
|
|
61
|
+
| Target | Command | Output |
|
|
62
|
+
|--------|---------|--------|
|
|
63
|
+
| Simulator | `xcodebuild -sdk iphonesimulator` | .app (for testing) |
|
|
64
|
+
| Device | `xcodebuild -sdk iphoneos` | .app (unsigned) |
|
|
65
|
+
| Archive | `xcodebuild archive` | .xcarchive |
|
|
66
|
+
| IPA | `xcodebuild -exportArchive` | .ipa (for distribution) |
|
|
67
|
+
| TestFlight | Upload .ipa via Xcode Organizer or `altool` | On App Store Connect |
|
|
68
|
+
| App Store | Submit via App Store Connect | Public release |
|
|
69
|
+
|
|
70
|
+
## Signing & Provisioning
|
|
71
|
+
|
|
72
|
+
### Automatic Signing (Xcode-managed, recommended for small teams)
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Xcode → Target → Signing & Capabilities:
|
|
76
|
+
✅ Automatically manage signing
|
|
77
|
+
Team: [Select your team]
|
|
78
|
+
Bundle Identifier: com.yourcompany.yourapp
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Manual Signing (CI/CD, enterprise)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Install certificate
|
|
85
|
+
security import certificate.p12 -P password -k ~/Library/Keychains/login.keychain-db
|
|
86
|
+
|
|
87
|
+
# Install provisioning profile
|
|
88
|
+
cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
|
|
89
|
+
|
|
90
|
+
# Verify
|
|
91
|
+
security find-identity -v -p codesigning
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### fastlane (Automated Signing + Build + Upload)
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Install
|
|
98
|
+
gem install fastlane
|
|
99
|
+
|
|
100
|
+
# Initialize
|
|
101
|
+
cd ios && fastlane init
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```ruby
|
|
105
|
+
# ios/fastlane/Fastfile
|
|
106
|
+
default_platform(:ios)
|
|
107
|
+
|
|
108
|
+
platform :ios do
|
|
109
|
+
desc "Push to TestFlight"
|
|
110
|
+
lane :beta do
|
|
111
|
+
increment_build_number(xcodeproj: "MyApp.xcodeproj")
|
|
112
|
+
build_app(
|
|
113
|
+
workspace: "MyApp.xcworkspace",
|
|
114
|
+
scheme: "MyApp",
|
|
115
|
+
export_method: "app-store"
|
|
116
|
+
)
|
|
117
|
+
upload_to_testflight
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
desc "Push to App Store"
|
|
121
|
+
lane :release do
|
|
122
|
+
build_app(
|
|
123
|
+
workspace: "MyApp.xcworkspace",
|
|
124
|
+
scheme: "MyApp",
|
|
125
|
+
export_method: "app-store"
|
|
126
|
+
)
|
|
127
|
+
upload_to_app_store(force: true)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Run
|
|
134
|
+
cd ios && fastlane beta # Upload to TestFlight
|
|
135
|
+
cd ios && fastlane release # Upload to App Store
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## App Store Upload
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Method 1: Xcode Organizer (GUI)
|
|
142
|
+
# Product → Archive → Distribute App → App Store Connect → Upload
|
|
143
|
+
|
|
144
|
+
# Method 2: altool (CLI)
|
|
145
|
+
xcrun altool --upload-app \
|
|
146
|
+
-f build/MyApp.ipa \
|
|
147
|
+
--type ios \
|
|
148
|
+
--apiKey YOUR_API_KEY \
|
|
149
|
+
--apiIssuer YOUR_ISSUER_ID
|
|
150
|
+
|
|
151
|
+
# Method 3: Transporter app (Apple's upload tool from App Store)
|
|
152
|
+
|
|
153
|
+
# Method 4: fastlane (automated)
|
|
154
|
+
fastlane deliver --ipa build/MyApp.ipa
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Publishing Checklist
|
|
158
|
+
|
|
159
|
+
| Step | Description |
|
|
160
|
+
|------|-------------|
|
|
161
|
+
| 1. Apple Developer Program | $99/year at developer.apple.com |
|
|
162
|
+
| 2. Create App ID | Apple Developer Portal → Identifiers |
|
|
163
|
+
| 3. Create Provisioning Profile | Development + Distribution |
|
|
164
|
+
| 4. Build Archive | Xcode → Product → Archive |
|
|
165
|
+
| 5. Upload to App Store Connect | Xcode Organizer or Transporter |
|
|
166
|
+
| 6. Fill app info | Description, screenshots (6.7", 6.5", 5.5"), keywords, privacy policy URL |
|
|
167
|
+
| 7. Set pricing | Free or paid; tier selection |
|
|
168
|
+
| 8. Submit review | Typically 24–48 hours; can be expedited |
|
|
169
|
+
| 9. Release | Automatic after approval, or manual release |
|
|
170
|
+
|
|
171
|
+
## iPadOS Adaptation
|
|
172
|
+
|
|
173
|
+
```swift
|
|
174
|
+
// Info.plist — Universal app (iPhone + iPad)
|
|
175
|
+
<key>UIDeviceFamily</key>
|
|
176
|
+
<array>
|
|
177
|
+
<integer>1</integer> <!-- iPhone -->
|
|
178
|
+
<integer>2</integer> <!-- iPad -->
|
|
179
|
+
</array>
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### iPadOS-Specific Considerations
|
|
183
|
+
|
|
184
|
+
| Feature | Implementation |
|
|
185
|
+
|---------|---------------|
|
|
186
|
+
| Split View / Slide Over | Auto Layout with size classes; handle `traitCollectionDidChange` |
|
|
187
|
+
| Stage Manager (M1+ iPad) | Support multiple window sizes; `UIWindowScene` API |
|
|
188
|
+
| Apple Pencil | `UIPencilInteraction` for double-tap; `UIHoverGestureRecognizer` for hover |
|
|
189
|
+
| Keyboard & Trackpad | `UIKeyCommand` for keyboard shortcuts; pointer interaction |
|
|
190
|
+
| External Display | `UIScreen.screens` for multi-display; `UIWindowScene` per display |
|
|
191
|
+
| Drag & Drop | `UIDragInteraction` / `UIDropInteraction` |
|
|
192
|
+
| Multitasking | Design for any width (compact/regular); test in Simulator |
|
|
193
|
+
|
|
194
|
+
## TestFlight (Beta Distribution)
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
1. Upload build via Xcode or fastlane
|
|
198
|
+
2. App Store Connect → TestFlight → Builds
|
|
199
|
+
3. Internal testing: up to 100 testers (instant, no review)
|
|
200
|
+
4. External testing: up to 10,000 testers (requires Beta App Review, ~24h)
|
|
201
|
+
5. Public link: share TestFlight link for anyone to join
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## CI/CD — GitHub Actions
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
name: iOS Build
|
|
208
|
+
on:
|
|
209
|
+
push:
|
|
210
|
+
tags: ['v*']
|
|
211
|
+
jobs:
|
|
212
|
+
build:
|
|
213
|
+
runs-on: macos-latest
|
|
214
|
+
steps:
|
|
215
|
+
- uses: actions/checkout@v4
|
|
216
|
+
- uses: ruby/setup-ruby@v1
|
|
217
|
+
with:
|
|
218
|
+
ruby-version: '3.3'
|
|
219
|
+
- run: gem install fastlane
|
|
220
|
+
- uses: apple-actions/import-codesign-certs@v3
|
|
221
|
+
with:
|
|
222
|
+
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
|
|
223
|
+
p12-password: ${{ secrets.CERTIFICATES_PASSWORD }}
|
|
224
|
+
- run: cd ios && fastlane beta
|
|
225
|
+
env:
|
|
226
|
+
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.API_KEY_ID }}
|
|
227
|
+
APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.API_ISSUER_ID }}
|
|
228
|
+
APP_STORE_CONNECT_API_KEY: ${{ secrets.API_KEY }}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Common Pitfalls
|
|
232
|
+
|
|
233
|
+
| Issue | Fix |
|
|
234
|
+
|-------|-----|
|
|
235
|
+
| Certificate expired | Renew via Apple Developer Portal; re-download provisioning profile |
|
|
236
|
+
| Profile mismatch | Regenerate profile; ensure Bundle ID matches exactly |
|
|
237
|
+
| App Store rejection | Read App Review Guidelines; ensure privacy policy URL is live |
|
|
238
|
+
| Test device limit | Development Profile: max 100 devices per type; Enterprise: unlimited |
|
|
239
|
+
| iPadOS layout broken | Test with all iPad sizes in Simulator; use size classes |
|
|
240
|
+
| "Missing push notification entitlement" | Add Push Notification capability in Xcode; or remove if not needed |
|
|
241
|
+
| "Unsupported Architecture" | Ensure only arm64 in Build Settings (no armv7) |
|
|
242
|
+
| Bitcode warning | Bitcode is deprecated since Xcode 14; disable in build settings |
|
|
243
|
+
| Swift version mismatch | Set Swift Language Version in Build Settings to match your code |
|
|
244
|
+
| Simulator builds failing | Ensure Xcode Command Line Tools installed: `xcode-select --install` |
|
|
245
|
+
| Screenshot requirements | Must include 6.7" (iPhone 15 Pro Max), 6.5" (iPhone 11), 5.5" (iPhone 8 Plus) |
|