@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1

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.
Files changed (284) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +285 -285
  5. package/package.json +3 -3
  6. package/pipeline/lib/redact.mjs +3 -2
  7. package/pipeline/scripts/_notices.mjs +1 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +13 -1
  9. package/pipeline/scripts/pre-commit-check.sh +4 -0
  10. package/pipeline/skills/.skill-manifest.json +69 -69
  11. package/pipeline/skills/shared/README.md +70 -70
  12. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  13. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  14. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  15. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  16. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  17. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  18. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  19. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  20. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  21. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  22. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  23. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
  24. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  25. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
  26. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
  27. package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
  28. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  29. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  30. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  31. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
  32. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  34. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  35. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  37. package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
  38. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  39. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
  40. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  41. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  42. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  43. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  44. package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
  45. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  46. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
  47. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  48. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  49. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  50. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  51. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  52. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  53. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  54. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  55. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  56. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
  57. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  58. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  59. package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
  60. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  61. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  62. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  63. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  64. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  65. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  66. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  67. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  68. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  69. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  70. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  71. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  72. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  73. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  74. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  75. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  76. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  77. package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
  78. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  79. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  80. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  81. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  82. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  83. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  84. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  85. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  86. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  87. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  88. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  89. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  90. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  91. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  92. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  93. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  94. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  95. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  96. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  97. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  98. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  99. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  100. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  101. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  102. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  103. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  104. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  105. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  106. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  107. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  108. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  109. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  111. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  112. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  113. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  114. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
  115. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
  117. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
  118. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
  129. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
  130. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
  131. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  132. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  133. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  134. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  135. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  136. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  137. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  138. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  139. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  140. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  141. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  142. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  143. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  144. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  145. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  146. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  147. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  148. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  149. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  150. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  151. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  152. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  153. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  154. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  155. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  156. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  157. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  158. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  159. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  160. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  161. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  162. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  163. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  164. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  165. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  166. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  167. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  168. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  169. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  170. package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
  171. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  172. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  173. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  174. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  175. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  176. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  177. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
  178. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  179. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  180. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  181. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  182. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  183. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  184. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  185. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  186. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  187. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  188. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  189. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  190. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  191. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  192. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
  193. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  194. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  195. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  196. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  197. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  198. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  199. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  200. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  201. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  202. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  203. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  204. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  205. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  206. package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
  207. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  208. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  209. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
  210. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  211. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  212. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  213. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  214. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  215. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  216. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
  217. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  218. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  219. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  220. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
  221. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  222. package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
  223. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  224. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
  225. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  226. package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
  227. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  228. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  229. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  230. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  231. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  232. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  233. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  234. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  235. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  236. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  237. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  238. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  239. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  240. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  241. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  242. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  243. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  244. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  245. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  246. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  247. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  248. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  249. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  250. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  251. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
  252. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  253. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
  254. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  255. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
  256. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  257. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  258. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  259. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  260. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  261. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  262. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  263. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  264. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  265. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  266. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  267. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  268. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  269. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  270. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  271. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  272. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  273. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  274. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  275. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  276. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  277. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  278. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  279. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  280. package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
  281. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  282. package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
  283. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
  284. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,363 +1,343 @@
1
1
  ---
2
2
  name: app-store-review
3
- description: "Prepare for App Store review and prevent rejections. Covers App Store review guidelines, app rejection reasons, PrivacyInfo.xcprivacy privacy manifest requirements, required API reason codes, in-app purchase IAP and StoreKit rules, App Store Guidelines compliance, ATT App Tracking Transparency, EU DMA Digital Markets Act, HIG compliance checklist, app submission preparation, review preparation, metadata requirements, entitlements, widgets, and Live Activities review rules. Use when preparing for App Store submission, fixing rejection reasons, auditing privacy manifests, implementing ATT consent flow, configuring StoreKit IAP, or checking HIG compliance."
3
+ description: "App Store submission readiness and rejection prevention: Review Guidelines 2.1, 2.3, 2.5.1, 3.1.1, 4.2 and 5.1.2, PrivacyInfo.xcprivacy manifests and required-reason codes, IAP and StoreKit rules, ATT consent, EU DMA distribution, entitlements and usage strings, metadata limits, screenshots, TestFlight, phased release, Resolution Center appeals, HIG review items, widget and Live Activity review rules. Use when preparing a submission, fixing a rejection, auditing a privacy manifest, implementing the ATT prompt or checking IAP compliance. Not for keyword research, ranking, conversion copy, screenshot order or A/B tests (app-store-optimization)."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
- # App Store Review Preparation
8
+ # App Store Review Readiness
9
9
 
10
- Guidance for catching App Store rejection risks before submission. Apple's May 2026 fraud-prevention update says App Review evaluated more than 9.1 million submissions in 2025 and rejected more than 2 million, so treat rejection prevention as a normal release-readiness step and re-check official Apple sources before quoting annual statistics.
10
+ Most rejections are predictable. They come from a missing demo account, a
11
+ privacy declaration that disagrees with what the binary actually sends, a
12
+ purchase path that skips StoreKit, or metadata that promises something the app
13
+ does not do. This skill finds those before App Review does.
11
14
 
12
- ## Contents
15
+ Apple publishes a yearly App Store fraud-prevention report with the number of
16
+ submissions App Review looked at and turned down. Quote those figures only from
17
+ the current report, never from memory.
13
18
 
14
- - [Overview](#overview)
15
- - [Top Rejection Reasons and How to Avoid Them](#top-rejection-reasons-and-how-to-avoid-them)
16
- - [PrivacyInfo.xcprivacy -- Privacy Manifest Requirements](#privacyinfoxcprivacy-privacy-manifest-requirements)
17
- - [Data Use, Sharing, and Privacy Policy (Guideline 5.1.2)](#data-use-sharing-and-privacy-policy-guideline-512)
18
- - [In-App Purchase and StoreKit Rules (Guideline 3.1.1)](#in-app-purchase-and-storekit-rules-guideline-311)
19
- - [HIG Compliance Checklist](#hig-compliance-checklist)
20
- - [App Tracking Transparency (ATT)](#app-tracking-transparency-att)
21
- - [EU Digital Markets Act (DMA) Considerations](#eu-digital-markets-act-dma-considerations)
22
- - [Entitlements and Capabilities](#entitlements-and-capabilities)
23
- - [Submission Workflow](#submission-workflow)
24
- - [Metadata Best Practices](#metadata-best-practices)
25
- - [Appeal Process](#appeal-process)
26
- - [Common Mistakes](#common-mistakes)
27
- - [Review Checklist](#review-checklist)
28
- - [References](#references)
19
+ ## Scope and boundaries
29
20
 
30
- ## Overview
21
+ - Metadata questions (name, subtitle, keywords, captions, product page) are
22
+ answered here only from the compliance side: accuracy, field limits,
23
+ misleading content and screenshot rules.
24
+ - Keyword research, ranking strategy, conversion copy, screenshot order and
25
+ A/B tests belong to `app-store-optimization`.
26
+ - Clean Swift 6 concurrency or a tidy StoreKit wrapper is not evidence of
27
+ compliance. Check the guideline, not the code quality.
31
28
 
32
- Use this SKILL.md for quick guidance on common rejection reasons and key policies. Use the references for detailed checklists and privacy manifest specifics.
29
+ Limits to state on every metadata answer:
33
30
 
34
- For prompts about keywords, screenshot captions, product-page metadata, or metadata rejection risk, answer from a compliance angle and explicitly defer keyword research, ranking strategy, conversion optimization, screenshot ordering, and A/B testing to `app-store-optimization`. Keep App Review metadata guidance limited to accuracy, field limits, misleading-content risk, and screenshot compliance. Always surface the rejection-prone format checks: app name 30 characters, subtitle 30 characters, keyword field 100 characters with comma-separated keywords and no spaces after commas, screenshots showing actual app UI, 6.9-inch iPhone screenshots as the primary current iPhone set, and 13-inch iPad screenshots when the app runs on iPad.
35
-
36
- For full submission readiness audits, separate blocking upload/review issues from ordinary cleanup. Treat Xcode 26+ with the relevant platform SDK 26+ as a blocking App Store Connect upload requirement after April 28, 2026. Cross-check privacy manifests, App Store privacy nutrition labels, privacy policy, ATT state, runtime network behavior, and SDK behavior against each other; the declarations and observed behavior must align.
37
-
38
- ### Blocking Submission Checks
39
-
40
- Escalate these as blockers before ordinary cleanup:
41
-
42
- - Uploads after April 28, 2026 that are not built with Xcode 26+ and the relevant platform SDK 26+
43
- - Privacy manifest, privacy label, privacy policy, ATT state, SDK transmissions, or audited runtime network behavior mismatches
44
- - Digital goods and subscriptions that bypass StoreKit IAP, or external purchase paths/links/buttons/CTAs for digital goods, unless current rules or approved entitlements allow them
45
- - Missing required screenshot sets: 6.9-inch iPhone screenshots, and 13-inch iPad screenshots when the app runs on iPad
46
- - Login-gated or non-obvious features without demo credentials, demo mode, and clear App Review notes
47
-
48
- ## Top Rejection Reasons and How to Avoid Them
49
-
50
- ### Guideline 2.1 -- App Completeness
51
-
52
- The app must be fully functional when reviewed. Apple rejects for:
53
-
54
- - Placeholder content, lorem ipsum, or test data visible anywhere
55
- - Broken links or empty screens
56
- - Features behind logins without demo credentials provided in App Review notes
57
- - Features that require hardware Apple does not have access to
58
-
59
- **Prevention:**
60
- - Provide demo account credentials in the App Review Information notes field in App Store Connect
61
- - Walk through every screen and verify real content is present
62
- - Test all flows end-to-end, including edge cases like empty states and error conditions
63
-
64
- ### Guideline 2.3 -- Accurate Metadata
65
-
66
- - App name must match what the app actually does
67
- - Screenshots must show the actual app UI, not marketing renders or mockups
68
- - Description must not contain prices (they vary by region)
69
- - No references to other platforms ("Also available on Android")
70
- - Keywords must be relevant -- no competitor names or unrelated terms
71
- - Category must match the app's primary function
72
-
73
- ### Guideline 4.2 -- Minimum Functionality
74
-
75
- Apple rejects apps that are too simple or are just websites in a wrapper:
76
-
77
- - WKWebView-only apps are rejected unless they add meaningful native functionality
78
- - Single-feature apps may be rejected if the feature is better suited as part of another app
79
- - Apps that duplicate built-in iOS functionality without significant improvement are rejected
80
-
81
- ### Guideline 2.5.1 -- Software Requirements
82
-
83
- - Must use public APIs only -- private API usage is an instant rejection
84
- - As of April 28, 2026, uploads to App Store Connect must be built with Xcode 26 or later using the relevant platform SDK 26 or later
85
- - Deployment target support is a product and compatibility decision, not an App Review rule
86
- - Must not download or execute code that introduces or changes app features or functionality after review, except where Apple guidelines and agreements explicitly allow interpreted code
87
-
88
- ## PrivacyInfo.xcprivacy -- Privacy Manifest Requirements
89
-
90
- A privacy manifest is required when your app code, an executable, a dynamic library, or a third-party SDK uses Apple's required-reason API categories or declares collected data/tracking behavior.
91
-
92
- **See:** [references/privacy-manifest.md](references/privacy-manifest.md) for the full structure, reason codes, and checklists.
93
-
94
- ### Summary
95
-
96
- - Required-reason API categories are file timestamps, system boot time, disk space, active keyboards, and UserDefaults; each requires an approved reason code when used.
97
- - Before final submission, re-check Apple's current required-reason API documentation and do not choose broad, convenient, or invented reason codes.
98
- - Required-reason API declarations belong in the bundle that contains the code using the API; every app target, executable, dynamic library, framework, or SDK bundle containing manifest-relevant code needs the matching manifest declarations.
99
- - Each SDK, executable, or dynamic library that collects data, uses required-reason APIs, enables data collection/tracking, or contacts tracking domains needs manifest attention in the bundle containing that code; SDK code cannot rely on the host app's manifest to report the SDK's own usage.
100
- - Manifest declarations must match App Store privacy nutrition labels, SDK behavior, and the app's presented functionality.
101
-
102
- ## Data Use, Sharing, and Privacy Policy (Guideline 5.1.2)
103
-
104
- - A privacy policy URL must be set in App Store Connect AND accessible within the app
105
- - The privacy policy must accurately describe what data you collect, how you use it, and who you share it with
106
- - App Store privacy nutrition labels must match your actual data collection practices
107
- - Privacy labels, privacy manifests, SDK disclosures, and runtime behavior should tell the same story
108
-
109
- ## In-App Purchase and StoreKit Rules (Guideline 3.1.1)
110
-
111
- IAP rules are strict and heavily enforced.
112
-
113
- ### What Generally Requires Apple IAP
114
-
115
- Digital content, features, subscriptions, and services unlocked in the app generally must use Apple's In-App Purchase system unless a specific App Review guideline exception, regional rule, or approved entitlement applies. Remove external purchase paths unless the current rules or an approved entitlement allow them:
116
-
117
- - Premium features or content unlocks
118
- - Subscriptions to app functionality
119
- - Virtual currency, coins, gems
120
- - Ad removal
121
- - Digital tips or donations
122
-
123
- ### What Does NOT Require IAP
124
-
125
- - Physical products (e-commerce)
126
- - Ride-sharing, food delivery, real-world services
127
- - One-to-one services (tutoring, consulting booked through the app)
128
- - Enterprise/B2B apps distributed through Apple Business Manager
129
-
130
- ### Subscription Display Requirements
131
-
132
- - Price, duration, and auto-renewal terms must be clearly displayed before purchase
133
- - Free trials must clearly show trial duration, post-trial price, billing frequency, auto-renewal, and cancellation terms before purchase
134
- - Remove external purchase links, buttons, calls to action, or purchase paths for digital goods unless the current storefront rules or an approved entitlement explicitly allow them
135
- - "Reader" apps (Netflix, Spotify) may link to external sign-up but cannot offer IAP bypass
136
-
137
- ### StoreKit Implementation Checklist
138
-
139
- - Consumables, non-consumables, and subscriptions must be correctly categorized in App Store Connect
140
- - Restore purchases functionality must be present and working
141
- - Transaction verification should use StoreKit 2 `Transaction.currentEntitlements` or server-side validation
142
- - Handle interrupted purchases, deferred transactions, and ask-to-buy gracefully
143
-
144
- ## HIG Compliance Checklist
145
-
146
- See [references/review-checklists.md](references/review-checklists.md) for the full HIG checklist (navigation, modals, widgets, system feature support, launch screen, empty states). This section stays intentionally brief to keep SKILL.md concise.
147
-
148
- ## App Tracking Transparency (ATT)
149
-
150
- ### When ATT Is Required
151
-
152
- If your app tracks users across other companies' apps or websites, you must:
153
-
154
- 1. Request permission via `ATTrackingManager.requestTrackingAuthorization` before any cross-app or cross-website tracking occurs, including tracking-capable SDK behavior
155
- 2. Respect the user's choice -- disable cross-app and cross-website tracking if the user denies permission
156
- 3. Not gate app functionality behind tracking consent ("Accept tracking or you cannot use this app" is rejected)
157
- 4. Provide a clear purpose string in `NSUserTrackingUsageDescription` explaining what tracking is used for
158
-
159
- ### When ATT Is NOT Required
160
-
161
- If you do not track users across apps or websites, do not show the ATT prompt. Apple rejects unnecessary ATT prompts.
162
-
163
- ### ATT Implementation
31
+ | Field | Rule |
32
+ |---|---|
33
+ | App name | 30 characters |
34
+ | Subtitle | 30 characters |
35
+ | Keyword field | 100 characters, comma-separated, no space after a comma |
36
+ | iPhone screenshots | 6.9-inch set is the primary set |
37
+ | iPad screenshots | 13-inch set for any app that supports iPad |
38
+ | Screenshot content | the real app UI |
39
+
40
+ ## Triage: blockers first
41
+
42
+ A full audit reports two lists: things that stop upload or review, and cleanup.
43
+ Treat these as blockers:
44
+
45
+ 1. The build is uploaded after April 28, 2026 and was not produced with Xcode 26
46
+ or later against the platform's 26 SDK or later.
47
+ 2. The privacy manifest, the nutrition label, the privacy policy, the ATT state,
48
+ what bundled SDKs transmit and what the app does on the network (audited at
49
+ runtime) do not tell the same story.
50
+ 3. Digital goods or subscriptions are sold outside StoreKit IAP, or the app shows
51
+ an outside checkout (link, button, call to action or any other route) for
52
+ them, without a storefront rule or granted entitlement that allows it.
53
+ 4. The 6.9-inch iPhone screenshot set is missing, or the 13-inch iPad set is
54
+ missing for an app that runs on iPad.
55
+ 5. Features behind a login, or features a reviewer would not find alone, ship
56
+ with no demo credentials, no demo mode and no App Review notes.
57
+
58
+ Everything else (copy polish, an optional screenshot, a HIG nit) is cleanup.
59
+
60
+ ## Guidelines that cause most rejections
61
+
62
+ ### 2.1 App Completeness
63
+
64
+ Rejected: placeholder text, lorem ipsum or visible test records; broken links and
65
+ empty screens; login-gated features with no demo credentials in the review notes;
66
+ features that need hardware Apple does not have.
67
+
68
+ Prevent it: put working demo credentials in the notes field under App Review
69
+ Information in App Store Connect, walk every screen to confirm real content, and
70
+ run every flow from start to finish including its empty and error states.
71
+
72
+ ### 2.3 Accurate Metadata
73
+
74
+ - The name reflects what the app does. Screenshots show the running app, not a
75
+ marketing render or device mockup of screens that do not exist.
76
+ - Leave prices out of the description; they differ per storefront.
77
+ - Do not mention other platforms (for example, "also on Android").
78
+ - Keywords describe the app itself; competitor names and off-topic terms do not
79
+ belong. The primary
80
+ category must match the main function.
81
+
82
+ ### 4.2 Minimum Functionality
83
+
84
+ - A shell around `WKWebView` is rejected unless it adds meaningful native
85
+ features.
86
+ - A single-feature app can be rejected when it would fit better inside another
87
+ app.
88
+ - Recreating a built-in iOS feature without a significant improvement is
89
+ rejected.
90
+
91
+ ### 2.5.1 Software Requirements
92
+
93
+ - Public APIs only. Private API use is rejected outright.
94
+ - From April 28, 2026, uploads need Xcode 26+ and the matching 26+ platform SDK.
95
+ - The minimum deployment target is a product and compatibility choice; App
96
+ Review does not set it.
97
+ - The app may not download or run code that adds or changes features after
98
+ review. The exception is interpreted code that Apple's guidelines and
99
+ agreements explicitly allow.
100
+
101
+ ## Privacy manifest in brief
102
+
103
+ `PrivacyInfo.xcprivacy` is needed whenever code in the app, in an executable, in
104
+ a dylib or in a vendor SDK calls a required-reason API, or when that code
105
+ collects data or tracks. Five API categories carry this requirement (boot time,
106
+ `UserDefaults`, file timestamps, free disk space and the list of active
107
+ keyboards), and every use needs an approved reason code.
108
+
109
+ - Pick the code that describes the actual use. Never pick a broad or convenient
110
+ one, and never make one up. Re-read Apple's current list before each release.
111
+ - Declare the use inside whichever bundle ships the calling code: app target,
112
+ executable, dylib, framework or SDK bundle. An SDK cannot lean on the host
113
+ app's manifest for its own calls.
114
+ - The manifest has to agree with the nutrition label, with SDK behaviour and with
115
+ the features the app presents.
116
+
117
+ Codes, plist layout and SDK rules: [privacy manifest reference](references/privacy-manifest.md).
118
+
119
+ ## 5.1.2 Privacy policy and data disclosure
120
+
121
+ - The policy URL appears in App Store Connect, and the app links to the same
122
+ policy from its own UI.
123
+ - The policy describes what is collected, why, and who receives it.
124
+ - Nutrition labels reflect real collection. Labels, manifests, SDK disclosures
125
+ and runtime behaviour must all agree.
126
+
127
+ ## 3.1.1 Paying for digital things
128
+
129
+ When the app unlocks digital content, a feature, a subscription or a digital
130
+ service, the sale normally runs through Apple IAP, unless a guideline exception, a regional rule or
131
+ an approved entitlement says otherwise.
132
+
133
+ | Needs IAP | Does not need IAP |
134
+ |---|---|
135
+ | Unlocking premium features | Physical goods |
136
+ | Subscriptions to app functionality | Real-world services such as rides or food delivery |
137
+ | Virtual currency | Person-to-person services, for example a live tutor or consultant |
138
+ | Removing ads | Business apps for organizations, distributed as custom apps via Apple Business Manager |
139
+ | Digital tips to creators | Donations to approved nonprofits (see 3.2.1 and 3.2.2) |
140
+
141
+ Rules around the purchase:
142
+
143
+ - Before a subscription is bought, the paywall states what it costs, how long a
144
+ period lasts and that it renews on its own.
145
+ - For a free trial, show the trial length, the price after it, how often billing
146
+ happens, that it renews automatically, and how to cancel, all before purchase.
147
+ - Strip any route to an outside checkout for digital goods, whether a link, a
148
+ button or a nudge in copy, unless the storefront's current rule or a granted
149
+ entitlement permits it. These rules differ by region and have changed recently; read the
150
+ current 3.1.1(a) and 3.1.3 text for the target storefront.
151
+ - Reader apps may link out to account sign-up with the matching entitlement, but
152
+ may not offer a way around IAP for in-app purchases.
153
+
154
+ StoreKit checks:
155
+
156
+ - Products are typed correctly in App Store Connect (consumable, non-consumable,
157
+ subscription).
158
+ - A Restore Purchases control exists and works.
159
+ - Entitlements are verified with StoreKit 2 `Transaction.currentEntitlements` or
160
+ on the server.
161
+ - A purchase that is interrupted, or deferred while a parent approves it through
162
+ Ask to Buy, leaves the UI in a sane state.
163
+
164
+ ## HIG items App Review looks at
165
+
166
+ Navigation, modals, system features and widgets are listed in the
167
+ [HIG section of the checklists](references/review-checklists.md#hig-compliance-checklist);
168
+ launch screen and empty-state rules sit in the Design block of the
169
+ [pre-submission list](references/review-checklists.md#pre-submission-checklist).
170
+
171
+ ## App Tracking Transparency
172
+
173
+ - Tracking a user across other companies' apps or sites, SDK tracking included,
174
+ needs `ATTrackingManager.requestTrackingAuthorization` to return authorized
175
+ first.
176
+ - If the user says no, turn that tracking off.
177
+ - Never lock a feature behind tracking consent; that is rejected.
178
+ - Add an `NSUserTrackingUsageDescription` string.
179
+ - An app that does not track must not show the prompt. Apple rejects needless
180
+ prompts.
164
181
 
165
182
  ```swift
166
183
  import AppTrackingTransparency
167
184
 
185
+ protocol AdServing {
186
+ func configure(personalized: Bool)
187
+ }
188
+
168
189
  @MainActor
169
- func requestTrackingPermission() async {
190
+ func resolveAdPersonalization(using ads: AdServing) async {
170
191
  let status = await ATTrackingManager.requestTrackingAuthorization()
171
192
  switch status {
172
193
  case .authorized:
173
- // Enable tracking, initialize ad SDKs with tracking
174
- break
194
+ ads.configure(personalized: true)
175
195
  case .denied, .restricted:
176
- // Use non-personalized ads and disable cross-app/cross-website tracking
177
- break
196
+ ads.configure(personalized: false)
178
197
  case .notDetermined:
179
- // Should not happen after request, handle gracefully
180
- break
198
+ ads.configure(personalized: false)
181
199
  @unknown default:
182
- break
200
+ ads.configure(personalized: false)
183
201
  }
184
202
  }
185
203
  ```
186
204
 
187
- **Timing:** Request ATT permission after the app is active and the user has context for why tracking is being requested. Do not show the prompt immediately on first launch or stack it with another system permission prompt.
188
-
189
- ## EU Digital Markets Act (DMA) Considerations
205
+ `.notDetermined` can come back when the app was not active; keep the safe
206
+ default and ask again later. Ask only when the app is in the foreground
207
+ and the user can see why, never as the first thing on first launch, and never right
208
+ behind another system permission alert.
190
209
 
191
- For apps distributed in the EU, and for other region-specific distribution models as Apple updates them:
210
+ ## EU Digital Markets Act
192
211
 
193
- - Alternative browser engines are permitted on iOS in the EU
194
- - Alternative app marketplaces exist -- apps may be distributed outside the App Store
195
- - External payment links may be allowed under specific conditions, with Apple's commission structure adjusted
196
- - Notarization is required even for sideloaded apps distributed outside the App Store
197
- - Apps using alternative distribution must still meet Apple's notarization requirements for security
212
+ - Alternative browser engines are allowed on iOS in the EU.
213
+ - Alternative app marketplaces and web distribution exist, so an app can ship
214
+ outside the App Store there.
215
+ - External payment links can be allowed, under conditions and with a different
216
+ commission.
217
+ - An app shipped through a marketplace or the web still goes through Apple's iOS
218
+ notarization and must meet its security requirements.
198
219
 
199
- ## Entitlements and Capabilities
220
+ ## Entitlements and usage strings
200
221
 
201
- Every entitlement must be justified. Apple reviews these closely:
222
+ Every entitlement needs a reason App Review can see in the product.
202
223
 
203
- | Entitlement | Apple Scrutiny |
224
+ | Capability | What review expects |
204
225
  |---|---|
205
- | Camera | Must explain purpose in `NSCameraUsageDescription` |
206
- | Location (Always) | Must have clear, user-visible reason for background location |
207
- | Push Notifications | Must not be used for marketing without user opt-in |
208
- | HealthKit | Must actually use health data in a meaningful way |
209
- | Background Modes | Each mode (audio, location, VoIP, fetch) must be justified and actively used |
210
- | App Groups | Must explain what shared data is needed |
211
- | Associated Domains | Universal links must actually resolve and function |
212
-
213
- ### Usage Description Strings
214
-
215
- Usage descriptions in Info.plist must be specific about what data is accessed and why:
216
-
217
- ```xml
218
- // REJECTED -- too vague
219
-
220
- // APPROVED -- specific purpose
221
- "Your location is used to show nearby restaurants on the map."
222
-
223
- // REJECTED -- too vague
224
- "This app needs access to your camera."
225
-
226
- // APPROVED -- specific purpose
227
- "The camera is used to scan barcodes for price comparison."
228
- ```
229
-
230
- Apple rejects vague usage descriptions. Always state what the data is used for in user-facing terms.
231
-
232
- ## Submission Workflow
233
-
234
- ### Pre-Submission Steps
235
-
236
- 1. **Archive in Xcode.** Product > Archive (requires a Distribution signing identity). Verify the archive builds clean with zero warnings in Release configuration.
237
- 2. **Upload to App Store Connect.** Use the Organizer window (Distribute App > App Store Connect) or `xcodebuild -exportArchive`. Automated uploads via `altool` or Transporter also work.
238
- 3. **TestFlight internal testing.** The build is available to internal testers (your team) within minutes of processing. Walk through every screen and flow on at least two device sizes.
239
- 4. **TestFlight external testing.** External groups require Beta App Review before first external distribution. Use this to validate with real users before full submission.
240
- 5. **Submit for App Review.** In App Store Connect, select the build, fill in all metadata fields, attach screenshots, and click Submit for Review. Review timing varies; allow buffer for rejections, appeals, and metadata fixes.
241
-
242
- ### Expedited Review Requests
243
-
244
- Apple grants expedited reviews for critical situations only:
245
-
246
- - Critical bug fix affecting existing users
247
- - Time-sensitive event (holiday launch, legal compliance deadline)
248
- - Security vulnerability patch
249
-
250
- Request via the Contact Us form in App Store Connect (App Review > Expedite Request). Provide a specific, factual justification. Do not request expedited review for initial launches or feature updates.
251
-
252
- ### Phased Release
253
-
254
- After approval, you can enable phased release to gradually roll out the update:
255
-
256
- | Day | Percentage of Users |
257
- |-----|---------------------|
258
- | 1 | 1% |
259
- | 2 | 2% |
260
- | 3 | 5% |
261
- | 4 | 10% |
262
- | 5 | 20% |
263
- | 6 | 50% |
264
- | 7 | 100% |
265
-
266
- Users who manually check for updates in the App Store will receive the update immediately regardless of phased release stage. You can pause, resume, or complete the rollout at any time from App Store Connect.
267
-
268
- ## Metadata Best Practices
226
+ | Camera | a clear `NSCameraUsageDescription` |
227
+ | Location (Always) | a visible reason the user benefits from background location |
228
+ | Push notifications | no marketing pushes without the user's opt-in |
229
+ | HealthKit | health data used in a meaningful feature |
230
+ | Background Modes | every declared mode (audio, location, VoIP, fetch) has a feature that uses it |
231
+ | App Groups | the shared data is explained |
232
+ | Associated Domains | universal links resolve and open the app |
269
233
 
270
- ### App Name and Subtitle
234
+ A usage string names the data and the user-facing reason:
271
235
 
272
- - **30 characters max** for the app name. Keep it memorable and unique.
273
- - **30 characters max** for the subtitle. Use it for a concise value proposition.
274
- - No generic terms that describe a category ("Photo Editor" alone is likely rejected).
275
- - No competitor names or trademarked terms you do not own.
276
- - No pricing information in the name or subtitle.
277
- - Name must be unique on the App Store -- Apple rejects duplicates.
278
-
279
- ### Screenshot Requirements
280
-
281
- - Provide 1-10 screenshots per required platform and localization.
282
- - For iPhone, use the current App Store Connect screenshot specifications. As of May 2026, 6.9-inch iPhone screenshots are the primary accepted iPhone set; 6.5-inch screenshots are required only when 6.9-inch screenshots are not provided, and smaller iPhone displays can use scaled screenshots from larger sets.
283
- - For iPad apps, 13-inch iPad screenshots are required; smaller iPad displays can use scaled screenshots from larger sets.
284
- - Screenshots must show the **actual app UI** -- no misleading content, no features that do not exist.
285
- - Text overlays and marketing frames are allowed but must not obscure or misrepresent the actual interface.
286
- - Up to 10 screenshots per localization.
287
- - Screenshots for different localizations should show localized UI.
288
-
289
- ### Keyword Field Compliance
290
-
291
- - 100-character limit, comma-separated, no spaces after commas.
292
- - Do not duplicate words already in your app name or subtitle (Apple indexes those automatically).
293
- - Use singular or plural, not both ("game" not "game,games").
294
- - No competitor names, trademarked terms, or irrelevant words.
295
-
296
- ### App Preview Videos
297
-
298
- - **30 seconds max** per preview video.
299
- - Up to 3 preview videos per localization.
300
- - Must show the actual app running on device -- no pre-rendered animations of features that look different in practice.
301
- - App audio is captured; narration and background music are optional.
302
- - Avoid any framing, hand footage, or visual treatment that makes the preview misleading about the actual app experience.
303
- - First frame is used as the poster frame on the product page (choose carefully).
304
-
305
- ## Appeal Process
306
-
307
- ### Replying to Rejections
308
-
309
- All rejections appear in the **Resolution Center** in App Store Connect. To respond:
310
-
311
- 1. Read the rejection message carefully -- it cites the specific guideline violated.
312
- 2. Reply directly in the Resolution Center thread with a clear, factual explanation.
313
- 3. If you made a fix, describe exactly what changed and resubmit the binary.
314
- 4. If you believe the rejection is incorrect, explain why your app complies, with references to the specific guideline text.
315
-
316
- **Tone matters.** Be professional, specific, and concise. Provide demo credentials, screenshots, or screen recordings that demonstrate compliance. Avoid emotional language or threats.
317
-
318
- ### Escalation to App Review Board
319
-
320
- If the Resolution Center exchange does not resolve the issue:
321
-
322
- 1. Request an appeal to the **App Review Board** via the Resolution Center or the App Store Contact form (App Review > Appeal).
323
- 2. The Board is a separate team from the original reviewer. Provide all context -- they review the full history.
324
- 3. Board decisions are final for that submission, but you can always modify the app and resubmit.
325
-
326
- ### Common Successful Appeal Strategies
327
-
328
- - **Provide a video walkthrough** showing the feature the reviewer could not find or access.
329
- - **Cite the specific guideline** and explain how the app satisfies each requirement.
330
- - **Include demo credentials** if the reviewer could not log in (the most common 2.1 rejection cause).
331
- - **Reference precedent** -- if similar apps exist on the App Store with the same pattern, note them (respectfully).
332
- - **Offer a compromise** -- if Apple objects to a specific implementation, propose an alternative that satisfies both sides.
333
-
334
- ## Common Mistakes
335
-
336
- 1. **Missing demo credentials.** Provide App Review login credentials in App Store Connect notes. Most Guideline 2.1 rejections are from reviewers unable to test behind a login.
337
- 2. **Privacy manifest mismatch.** Declared data collection in PrivacyInfo.xcprivacy must match App Store privacy nutrition labels, SDK behavior, and app functionality.
338
- 3. **Unnecessary ATT prompt.** Do not show the App Tracking Transparency prompt unless you actually track users across apps or websites. Apple rejects unnecessary prompts.
339
- 4. **Vague usage descriptions.** "This app needs your location" is rejected. State the specific feature that uses the data.
340
- 5. **Unapproved external purchase paths.** External payment links for digital goods are region- and entitlement-sensitive; do not add them without checking current Guideline 3.1.1(a) rules.
341
- 6. **Treating code quality as review compliance.** Swift 6 concurrency annotations and StoreKit transaction handling matter, but they do not replace privacy, payment, metadata, and entitlement compliance checks.
342
-
343
- ## Review Checklist
344
-
345
- Quick-check before every submission (full version in [references/review-checklists.md](references/review-checklists.md)):
346
-
347
- - [ ] No placeholder/test content; all features functional; demo credentials provided
348
- - [ ] App name matches functionality; screenshots are real; no prices in description; 6.9-inch iPhone and 13-inch iPad screenshots supplied when applicable
349
- - [ ] PrivacyInfo.xcprivacy present when required-reason APIs, tracking, collected data declarations, or SDK tracking domains apply; nutrition labels match reality
350
- - [ ] Privacy policy URL set and accessible in-app
351
- - [ ] Digital content uses IAP; subscription terms visible; restore purchases works; external purchase links/buttons/CTAs removed unless current rules or approved entitlements allow them
352
- - [ ] Dark Mode and Dynamic Type supported; standard navigation patterns
353
- - [ ] Built with Xcode 26+ and platform SDK 26+ for uploads after April 28, 2026; no private APIs; entitlements justified
354
- - [ ] ATT prompt only if cross-app or cross-website tracking occurs
236
+ | Verdict | String |
237
+ |---|---|
238
+ | Approved | "We use where you are to place the closest charging stations on the map." |
239
+ | Approved | "The camera scans a book's barcode so you can add it to your shelf." |
240
+ | Rejected | "This app requires camera access." |
241
+ | Rejected | "We use your photo library to improve your experience." |
242
+ | Fixed | "Pick a photo from your library to use as your profile picture. Only the photo you choose is uploaded." |
243
+
244
+ The second rejected string names a data type but gives no concrete purpose;
245
+ "improve your experience" is the phrase review flags. The fixed version says
246
+ which feature uses the data and what leaves the device.
247
+
248
+ ## Submission workflow
249
+
250
+ 1. Archive: Product > Archive with a Distribution signing identity, from a clean
251
+ Release build. Aim for zero warnings; it is good hygiene, not a review rule.
252
+ 2. Upload: in Organizer choose Distribute App, then App Store Connect; or run
253
+ `xcodebuild -exportArchive`. `altool` and Transporter also work.
254
+ 3. Internal TestFlight: internal testers see the build minutes after processing.
255
+ Try every flow on two or more screen sizes.
256
+ 4. External TestFlight: the first build sent to an external group goes through
257
+ Beta App Review.
258
+ 5. Submit: pick the build, complete metadata, attach screenshots, press Submit
259
+ for Review. Review time varies, so keep slack before a deadline.
260
+
261
+ Expedited review is for a critical fix for existing users, a date-bound event
262
+ (a holiday launch, a legal deadline) or a security patch. Ask through Contact
263
+ Us > App Review > Expedite Request with a specific, factual reason. It is not for
264
+ first launches or new features.
265
+
266
+ Phased release for automatic updates: day 1 1%, day 2 2%, day 3 5%, day 4 10%,
267
+ day 5 20%, day 6 50%, day 7 100%. Users who check for updates by hand get the
268
+ build immediately. The rollout can be paused, resumed or finished early at any
269
+ time.
270
+
271
+ ## Metadata rules
272
+
273
+ - Name and subtitle: 30 characters each. The subtitle is a short value statement.
274
+ A bare category word such as "Photo Editor" is likely rejected; so are
275
+ competitor or trademarked terms and prices. The name must be unique.
276
+ - Screenshots: 1 to 10 per required platform and localization. As of May 2026,
277
+ the 6.9-inch iPhone set is the primary one; the 6.5-inch set is required only
278
+ when there is no 6.9-inch set, and smaller iPhones get scaled images. Apps that
279
+ run on iPad need 13-inch iPad screenshots; smaller iPads are scaled.
280
+ - Screenshot content: the real UI; never show a feature the build lacks. Captions and
281
+ frames are fine if they neither hide nor misstate the UI. Localized sets show
282
+ the localized UI.
283
+ - Keywords: 100 characters, comma-separated with no spaces. Words already in the
284
+ name or subtitle are indexed, so do not repeat them. Use singular or plural,
285
+ not both. No competitor, trademark or unrelated terms.
286
+ - App previews: up to 30 seconds, up to 3 per localization, captured from the app
287
+ on a device with the app's own audio (narration or music optional). No
288
+ misleading framing and no footage of hands holding a device. The first frame
289
+ is the poster frame.
290
+
291
+ ## Rejections and appeals
292
+
293
+ - A rejection arrives in the Resolution Center with the guideline number.
294
+ - Reply in that thread with facts. If you fixed the issue, say what changed and
295
+ upload a new binary. If you disagree, show how the app complies, quoting the
296
+ guideline.
297
+ - Keep it professional, specific and short. Attach demo credentials, screenshots
298
+ or a screen recording. No emotional language, no threats.
299
+ - For a formal appeal, go to the App Review Board through the Resolution Center or
300
+ Contact Us > App Review > Appeal. A separate team reads the whole history. The
301
+ ruling is final for that build; a changed build can still be submitted.
302
+
303
+ What tends to work: a video walkthrough of the flagged feature, a point-by-point
304
+ answer against the guideline text, fresh demo credentials (the usual 2.1 cause),
305
+ a polite reference to comparable approved behaviour, and offering an alternative
306
+ implementation.
307
+
308
+ ## Common mistakes
309
+
310
+ 1. No demo credentials; this drives most 2.1 rejections.
311
+ 2. The manifest disagrees with the nutrition label, an SDK, or the features.
312
+ 3. An ATT prompt in an app that does not track.
313
+ 4. Vague usage descriptions.
314
+ 5. External purchase routes without an approved path. This depends on region and
315
+ entitlement, so read the current 3.1.1(a).
316
+ 6. Treating good code (Swift 6 concurrency, careful StoreKit handling) as proof
317
+ of compliance.
318
+
319
+ ## Review checklist
320
+
321
+ - [ ] No placeholder or test content; every feature works; demo credentials given
322
+ - [ ] Name matches function; real screenshots; no prices in the description;
323
+ 6.9-inch iPhone set, plus 13-inch iPad set for iPad-capable apps
324
+ - [ ] Privacy manifest present wherever required-reason APIs, tracking, collected
325
+ data or SDK tracking domains apply; labels agree with it
326
+ - [ ] Privacy policy URL in App Store Connect and inside the app
327
+ - [ ] IAP for digital content; terms shown before purchase; restore works; no
328
+ external purchase CTAs unless allowed
329
+ - [ ] Standard navigation; the UI holds up in Dark Mode and at large Dynamic Type
330
+ - [ ] Toolchain is Xcode 26+ with a 26+ SDK (required from April 28, 2026); no
331
+ private APIs; every entitlement justified
332
+ - [ ] ATT prompt only if the app tracks
333
+
334
+ Full lists: [review checklists](references/review-checklists.md).
355
335
 
356
336
  ## References
357
337
 
358
- - Review checklists: [references/review-checklists.md](references/review-checklists.md)
359
- - Privacy manifest guide: [references/privacy-manifest.md](references/privacy-manifest.md)
360
- - Apple App Review Guidelines: https://developer.apple.com/app-store/review/guidelines/
361
- - Apple upcoming SDK requirements: https://developer.apple.com/news/upcoming-requirements/
362
- - App Store Connect screenshot specifications: https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/
363
- - Sosumi required-reason API docs: https://sosumi.ai/documentation/bundleresources/describing-use-of-required-reason-api
338
+ - Guidelines text: https://developer.apple.com/app-store/review/guidelines/
339
+ - SDK and Xcode deadlines: https://developer.apple.com/news/upcoming-requirements/
340
+ - Screenshot sizes: https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications/
341
+ - Reason-code documentation: https://developer.apple.com/documentation/bundleresources/describing-use-of-required-reason-api
342
+ - [Privacy manifest reference](references/privacy-manifest.md)
343
+ - [Review checklists](references/review-checklists.md)