@daemux/store-automator 0.10.2 → 0.10.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daemux/store-automator",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "Full App Store & Google Play automation for Flutter apps with Claude Code agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "store-automator",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "App Store & Google Play automation agents for Flutter app publishing",
5
5
  "author": {
6
6
  "name": "Daemux"
@@ -98,6 +98,12 @@ Read fastlane/app_rating_config.json and verify:
98
98
  - Minimum OS version reasonable (iOS 16+, Android API 24+)
99
99
  - All declared permissions documented and justified
100
100
  - Bundle ID / package name follows reverse-domain convention
101
+ - **Info.plist purpose strings (ITMS-90683 prevention)**: Read `ios/Runner/Info.plist` and verify it contains
102
+ NS*UsageDescription keys for all privacy-sensitive frameworks used by the app and its dependencies.
103
+ Check `ios/Podfile.lock` for pods that commonly require purpose strings
104
+ (e.g. image_picker, camera, geolocator, contacts_service, health, speech_to_text).
105
+ Each key must have a meaningful, user-facing description -- not placeholder text.
106
+ Missing keys cause automatic rejection at submission.
101
107
 
102
108
  ### 7. Live App UI Review (MANDATORY)
103
109
 
@@ -210,6 +216,7 @@ Before running the full review, verify these mandatory items. Include checkbox r
210
216
  - [ ] All primary user flows complete successfully on iOS
211
217
  - [ ] App UI matches store screenshots on iOS
212
218
  - [ ] No placeholder text in live app on iOS
219
+ - [ ] Info.plist contains NS*UsageDescription keys for all linked privacy-sensitive frameworks (prevents ITMS-90683)
213
220
 
214
221
  ### Google Play Mandatory Items
215
222
  - [ ] Title (title.txt) present and <= 30 characters
@@ -34,7 +34,44 @@ Run these in order. Stop and report on first failure:
34
34
  1. **Static analysis**: `flutter analyze` - must pass with zero issues
35
35
  2. **Unit and widget tests**: `flutter test -v` - all tests must pass
36
36
  3. **iOS build**: `flutter build ios --no-codesign` - must succeed
37
- 4. **Android build**: `flutter build appbundle` - must succeed
37
+ 4. **Info.plist purpose strings**: After iOS build succeeds, verify all required purpose strings are present.
38
+
39
+ **Detect linked frameworks:**
40
+ ```bash
41
+ APP_BUNDLE=$(find build/ios/Release-iphoneos -name "*.app" -type d | head -1)
42
+ BINARY="$APP_BUNDLE/$(defaults read "$APP_BUNDLE/Info.plist" CFBundleExecutable)"
43
+ otool -L "$BINARY" | grep -oE '/[^ ]+\.framework/' | sed 's|.*/||; s|\.framework/||' | sort -u
44
+ ```
45
+
46
+ **Cross-reference linked frameworks against required keys:**
47
+
48
+ | Framework | Required Info.plist Key | Condition |
49
+ |-----------|----------------------|-----------|
50
+ | Photos / PhotosUI | NSPhotoLibraryUsageDescription | Always |
51
+ | AVFoundation | NSCameraUsageDescription | Binary contains `AVCapture*` symbols |
52
+ | AVFoundation | NSMicrophoneUsageDescription | Binary contains `AVAudioRecorder` |
53
+ | CoreLocation | NSLocationWhenInUseUsageDescription | Always |
54
+ | Contacts / ContactsUI | NSContactsUsageDescription | Always |
55
+ | CoreBluetooth | NSBluetoothAlwaysUsageDescription | Always |
56
+ | Speech | NSSpeechRecognitionUsageDescription | Always |
57
+ | CoreMotion | NSMotionUsageDescription | Always |
58
+ | LocalAuthentication | NSFaceIDUsageDescription | Always |
59
+ | CoreNFC | NFCReaderUsageDescription | Always |
60
+ | EventKit | NSCalendarsUsageDescription | Calendar access |
61
+ | EventKit | NSRemindersUsageDescription | Reminders access |
62
+ | MediaPlayer | NSAppleMusicUsageDescription | Apple Music / media library |
63
+ | HealthKit | NSHealthShareUsageDescription | Health data read |
64
+ | HealthKit | NSHealthUpdateUsageDescription | Health data write |
65
+ | UserNotifications | (no key needed) | -- |
66
+
67
+ **Verify AVFoundation conditions** (only if AVFoundation is linked):
68
+ ```bash
69
+ strings "$BINARY" | grep -E "AVCapture|AVAudioRecorder"
70
+ ```
71
+
72
+ Read `ios/Runner/Info.plist` and confirm every required key is present with a non-empty, user-facing string.
73
+ **Missing keys = FAILURE** (Apple rejects with ITMS-90683).
74
+ 5. **Android build**: `flutter build appbundle` - must succeed
38
75
 
39
76
  ### Before Testing
40
77
  ```bash