app_store_dev_api 0.1.9 → 0.3.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 (317) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.claude/settings.local.json +23 -0
  4. data/CHANGELOG.md +59 -2
  5. data/CLAUDE.md +256 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +35 -20
  8. data/README.md +212 -20
  9. data/Rakefile +99 -1
  10. data/SCRIPTS_ANALYSIS.md +261 -0
  11. data/docs/bundle_id_capabilities.md +382 -0
  12. data/docs/bundle_ids.md +417 -0
  13. data/docs/creating_api_keys.md +137 -0
  14. data/docs/generating_tokens.md +189 -0
  15. data/docs/openapi.oas4.2.json +231546 -0
  16. data/docs/openapi.oas4.3.json +230597 -0
  17. data/docs/pindo_usage_reference.md +234 -0
  18. data/docs/revoking_api_keys.md +118 -0
  19. data/install_local.bat +166 -0
  20. data/install_local.sh +95 -0
  21. data/install_local_fixed.sh +84 -0
  22. data/lib/.DS_Store +0 -0
  23. data/lib/app_store_dev_api/client/authorization.rb +7 -2
  24. data/lib/app_store_dev_api/client/builder.rb +43 -38
  25. data/lib/app_store_dev_api/client/options.rb +1 -1
  26. data/lib/app_store_dev_api/client.rb +31 -60
  27. data/lib/app_store_dev_api/object/attributes.rb +1 -1
  28. data/lib/app_store_dev_api/object/data.rb +6 -2
  29. data/lib/app_store_dev_api/object/relationships.rb +47 -0
  30. data/lib/app_store_dev_api/requests/v1/accessibility_declaration/create.rb +28 -0
  31. data/lib/app_store_dev_api/requests/v1/accessibility_declaration/update.rb +26 -0
  32. data/lib/app_store_dev_api/requests/v1/age_rating_declaration/update.rb +43 -0
  33. data/lib/app_store_dev_api/requests/v1/alternative_distribution_domain/create.rb +22 -0
  34. data/lib/app_store_dev_api/requests/v1/alternative_distribution_key/create.rb +25 -0
  35. data/lib/app_store_dev_api/requests/v1/alternative_distribution_package/create.rb +22 -0
  36. data/lib/app_store_dev_api/requests/v1/analytics_report_request/create.rb +25 -0
  37. data/lib/app_store_dev_api/requests/v1/android_to_ios_app_mapping_detail/create.rb +26 -0
  38. data/lib/app_store_dev_api/requests/v1/android_to_ios_app_mapping_detail/update.rb +22 -0
  39. data/lib/app_store_dev_api/requests/v1/app/update.rb +18 -20
  40. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience/create.rb +32 -0
  41. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience/update.rb +32 -0
  42. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience_image/create.rb +22 -0
  43. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience_image/update.rb +22 -0
  44. data/lib/app_store_dev_api/requests/v1/app_clip_app_store_review_detail/create.rb +19 -0
  45. data/lib/app_store_dev_api/requests/v1/{builds → app_clip_app_store_review_detail}/update.rb +4 -5
  46. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience/create.rb +27 -0
  47. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience/update.rb +25 -0
  48. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience_localization/create.rb +26 -0
  49. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience_localization/update.rb +21 -0
  50. data/lib/app_store_dev_api/requests/v1/app_clip_header_image/create.rb +26 -0
  51. data/lib/app_store_dev_api/requests/v1/app_clip_header_image/update.rb +22 -0
  52. data/lib/app_store_dev_api/requests/v1/app_custom_product_page/create.rb +28 -0
  53. data/lib/app_store_dev_api/requests/v1/app_custom_product_page/update.rb +22 -0
  54. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_localization/create.rb +26 -0
  55. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_localization/update.rb +21 -0
  56. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_version/create.rb +26 -0
  57. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_version/update.rb +21 -0
  58. data/lib/app_store_dev_api/requests/v1/app_encryption_declaration/create.rb +22 -0
  59. data/lib/app_store_dev_api/requests/v1/app_encryption_declaration_document/create.rb +24 -0
  60. data/lib/app_store_dev_api/requests/v1/app_encryption_declaration_document/update.rb +21 -0
  61. data/lib/app_store_dev_api/requests/v1/app_event/create.rb +26 -0
  62. data/lib/app_store_dev_api/requests/v1/app_event/update.rb +24 -0
  63. data/lib/app_store_dev_api/requests/v1/app_event_localization/create.rb +28 -0
  64. data/lib/app_store_dev_api/requests/v1/app_event_localization/update.rb +23 -0
  65. data/lib/app_store_dev_api/requests/v1/app_event_screenshot/create.rb +27 -0
  66. data/lib/app_store_dev_api/requests/v1/app_event_screenshot/update.rb +21 -0
  67. data/lib/app_store_dev_api/requests/v1/app_event_video_clip/create.rb +22 -0
  68. data/lib/app_store_dev_api/requests/v1/{promoted_purchases_image → app_event_video_clip}/update.rb +4 -4
  69. data/lib/app_store_dev_api/requests/v1/app_info/update.rb +15 -18
  70. data/lib/app_store_dev_api/requests/v1/app_info_localization/create.rb +17 -17
  71. data/lib/app_store_dev_api/requests/v1/app_info_localization/update.rb +14 -18
  72. data/lib/app_store_dev_api/requests/v1/app_preview/create.rb +22 -0
  73. data/lib/app_store_dev_api/requests/v1/app_preview/update.rb +22 -0
  74. data/lib/app_store_dev_api/requests/v1/app_preview_set/create.rb +25 -0
  75. data/lib/app_store_dev_api/requests/v1/app_preview_set/replace_app_previews_linkage.rb +19 -0
  76. data/lib/app_store_dev_api/requests/v1/app_price_schedule/create.rb +24 -0
  77. data/lib/app_store_dev_api/requests/v1/app_screenshot/create.rb +24 -0
  78. data/lib/app_store_dev_api/requests/v1/app_screenshot/update.rb +21 -0
  79. data/lib/app_store_dev_api/requests/v1/app_screenshot_set/create.rb +25 -0
  80. data/lib/app_store_dev_api/requests/v1/app_screenshot_set/replace_app_screenshots_linkage.rb +19 -0
  81. data/lib/app_store_dev_api/requests/v1/app_store_review_attachment/create.rb +20 -0
  82. data/lib/app_store_dev_api/requests/v1/app_store_review_attachment/update.rb +21 -0
  83. data/lib/app_store_dev_api/requests/v1/app_store_review_detail/create.rb +19 -20
  84. data/lib/app_store_dev_api/requests/v1/app_store_review_detail/update.rb +17 -18
  85. data/lib/app_store_dev_api/requests/v1/app_store_version/create.rb +20 -16
  86. data/lib/app_store_dev_api/requests/v1/app_store_version/update.rb +20 -18
  87. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment/create.rb +26 -0
  88. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment/update.rb +23 -0
  89. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment/create.rb +27 -0
  90. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment/update.rb +22 -0
  91. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment_localization/create.rb +25 -0
  92. data/lib/app_store_dev_api/requests/v1/app_store_version_localization/create.rb +18 -18
  93. data/lib/app_store_dev_api/requests/v1/app_store_version_localization/update.rb +15 -18
  94. data/lib/app_store_dev_api/requests/v1/{app_store_version_phased_releases → app_store_version_phased_release}/create.rb +7 -2
  95. data/lib/app_store_dev_api/requests/v1/{app_store_version_phased_releases → app_store_version_phased_release}/update.rb +2 -2
  96. data/lib/app_store_dev_api/requests/v1/app_store_version_promotion/create.rb +10 -13
  97. data/lib/app_store_dev_api/requests/v1/{app_store_version_releases_request → app_store_version_release_request}/create.rb +5 -3
  98. data/lib/app_store_dev_api/requests/v1/app_tag/update.rb +21 -0
  99. data/lib/app_store_dev_api/requests/v1/background_asset/create.rb +19 -0
  100. data/lib/app_store_dev_api/requests/v1/background_asset/update.rb +21 -0
  101. data/lib/app_store_dev_api/requests/v1/background_asset_upload_file/create.rb +27 -0
  102. data/lib/app_store_dev_api/requests/v1/background_asset_upload_file/update.rb +23 -0
  103. data/lib/app_store_dev_api/requests/v1/background_asset_version/create.rb +16 -0
  104. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation/create.rb +26 -0
  105. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation/update.rb +21 -0
  106. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation_localization/create.rb +26 -0
  107. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation_localization/update.rb +21 -0
  108. data/lib/app_store_dev_api/requests/v1/beta_app_localization/create.rb +30 -0
  109. data/lib/app_store_dev_api/requests/v1/beta_app_localization/update.rb +25 -0
  110. data/lib/app_store_dev_api/requests/v1/beta_app_review_detail/update.rb +28 -0
  111. data/lib/app_store_dev_api/requests/v1/beta_app_review_submission/create.rb +22 -0
  112. data/lib/app_store_dev_api/requests/v1/beta_build_localization/create.rb +18 -18
  113. data/lib/app_store_dev_api/requests/v1/beta_build_localization/update.rb +15 -20
  114. data/lib/app_store_dev_api/requests/v1/beta_group/create.rb +33 -0
  115. data/lib/app_store_dev_api/requests/v1/beta_group/update.rb +27 -0
  116. data/lib/app_store_dev_api/requests/v1/beta_license_agreement/update.rb +21 -0
  117. data/lib/app_store_dev_api/requests/v1/beta_recruitment_criterion/create.rb +25 -0
  118. data/lib/app_store_dev_api/requests/v1/beta_recruitment_criterion/update.rb +21 -0
  119. data/lib/app_store_dev_api/requests/v1/beta_tester/create.rb +28 -0
  120. data/lib/app_store_dev_api/requests/v1/beta_tester_invitation/create.rb +23 -0
  121. data/lib/app_store_dev_api/requests/v1/build_beta_detail/update.rb +10 -13
  122. data/lib/app_store_dev_api/requests/v1/{subscription_price_change_consent_reason → build_beta_notification}/create.rb +8 -2
  123. data/lib/app_store_dev_api/requests/v1/build_upload/create.rb +27 -0
  124. data/lib/app_store_dev_api/requests/v1/build_upload_file/create.rb +28 -0
  125. data/lib/app_store_dev_api/requests/v1/build_upload_file/update.rb +22 -0
  126. data/lib/app_store_dev_api/requests/v1/bundle_id/create.rb +12 -15
  127. data/lib/app_store_dev_api/requests/v1/bundle_id/update.rb +20 -0
  128. data/lib/app_store_dev_api/requests/v1/bundle_id_capability/create.rb +13 -16
  129. data/lib/app_store_dev_api/requests/v1/bundle_id_capability/update.rb +18 -0
  130. data/lib/app_store_dev_api/requests/v1/certificate/create.rb +14 -15
  131. data/lib/app_store_dev_api/requests/v1/certificate/update.rb +17 -0
  132. data/lib/app_store_dev_api/requests/v1/ci_build_run/create.rb +28 -0
  133. data/lib/app_store_dev_api/requests/v1/ci_workflow/create.rb +41 -0
  134. data/lib/app_store_dev_api/requests/v1/ci_workflow/update.rb +39 -0
  135. data/lib/app_store_dev_api/requests/v1/customer_review_response_v1/create.rb +25 -0
  136. data/lib/app_store_dev_api/requests/v1/device/update.rb +18 -0
  137. data/lib/app_store_dev_api/requests/v1/end_app_availability_pre_order/create.rb +16 -0
  138. data/lib/app_store_dev_api/requests/v1/end_user_license_agreement/create.rb +24 -0
  139. data/lib/app_store_dev_api/requests/v1/end_user_license_agreement/update.rb +24 -0
  140. data/lib/app_store_dev_api/requests/v1/game_center_achievement/create.rb +31 -0
  141. data/lib/app_store_dev_api/requests/v1/game_center_achievement/update.rb +26 -0
  142. data/lib/app_store_dev_api/requests/v1/game_center_achievement_image/create.rb +26 -0
  143. data/lib/app_store_dev_api/requests/v1/game_center_achievement_image/update.rb +21 -0
  144. data/lib/app_store_dev_api/requests/v1/game_center_achievement_localization/create.rb +28 -0
  145. data/lib/app_store_dev_api/requests/v1/game_center_achievement_localization/update.rb +23 -0
  146. data/lib/app_store_dev_api/requests/v1/game_center_achievement_release/create.rb +23 -0
  147. data/lib/app_store_dev_api/requests/v1/game_center_activity/create.rb +32 -0
  148. data/lib/app_store_dev_api/requests/v1/game_center_activity/update.rb +27 -0
  149. data/lib/app_store_dev_api/requests/v1/game_center_activity_image/create.rb +27 -0
  150. data/lib/app_store_dev_api/requests/v1/game_center_activity_image/update.rb +21 -0
  151. data/lib/app_store_dev_api/requests/v1/game_center_activity_localization/create.rb +27 -0
  152. data/lib/app_store_dev_api/requests/v1/game_center_activity_localization/update.rb +22 -0
  153. data/lib/app_store_dev_api/requests/v1/game_center_activity_version/create.rb +25 -0
  154. data/lib/app_store_dev_api/requests/v1/game_center_activity_version/update.rb +21 -0
  155. data/lib/app_store_dev_api/requests/v1/game_center_activity_version_release/create.rb +23 -0
  156. data/lib/app_store_dev_api/requests/v1/game_center_app_version/create.rb +22 -0
  157. data/lib/app_store_dev_api/requests/v1/game_center_app_version/update.rb +21 -0
  158. data/lib/app_store_dev_api/requests/v1/game_center_challenge/create.rb +31 -0
  159. data/lib/app_store_dev_api/requests/v1/game_center_challenge/update.rb +28 -0
  160. data/lib/app_store_dev_api/requests/v1/game_center_challenge_image/create.rb +27 -0
  161. data/lib/app_store_dev_api/requests/v1/game_center_challenge_image/update.rb +21 -0
  162. data/lib/app_store_dev_api/requests/v1/game_center_challenge_localization/create.rb +27 -0
  163. data/lib/app_store_dev_api/requests/v1/game_center_challenge_localization/update.rb +22 -0
  164. data/lib/app_store_dev_api/requests/v1/game_center_challenge_version/create.rb +22 -0
  165. data/lib/app_store_dev_api/requests/v1/game_center_challenge_version_release/create.rb +23 -0
  166. data/lib/app_store_dev_api/requests/v1/{subscription_review_screenshot → game_center_detail}/create.rb +9 -4
  167. data/lib/app_store_dev_api/requests/v1/game_center_detail/update.rb +29 -0
  168. data/lib/app_store_dev_api/requests/v1/{customer_review_response → game_center_group}/create.rb +6 -4
  169. data/lib/app_store_dev_api/requests/v1/game_center_group/update.rb +21 -0
  170. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard/create.rb +38 -0
  171. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard/update.rb +32 -0
  172. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_entry_submission/create.rb +27 -0
  173. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_image/create.rb +26 -0
  174. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_image/update.rb +21 -0
  175. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_localization/create.rb +30 -0
  176. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_localization/update.rb +25 -0
  177. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_release/create.rb +23 -0
  178. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set/create.rb +28 -0
  179. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set/update.rb +21 -0
  180. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_image/create.rb +26 -0
  181. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_image/update.rb +21 -0
  182. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_localization/create.rb +26 -0
  183. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_localization/update.rb +21 -0
  184. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_member_localization/create.rb +27 -0
  185. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_member_localization/update.rb +21 -0
  186. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_release/create.rb +23 -0
  187. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_queue/create.rb +27 -0
  188. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_queue/update.rb +26 -0
  189. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule/create.rb +29 -0
  190. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule/update.rb +23 -0
  191. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set/create.rb +24 -0
  192. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set/update.rb +22 -0
  193. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set_test/create.rb +23 -0
  194. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_team/create.rb +27 -0
  195. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_team/update.rb +22 -0
  196. data/lib/app_store_dev_api/requests/v1/game_center_player_achievement_submission/create.rb +26 -0
  197. data/lib/app_store_dev_api/requests/v1/{in_app_purchase_review_screenshot → in_app_purchase_app_store_review_screenshot}/create.rb +9 -3
  198. data/lib/app_store_dev_api/requests/v1/{in_app_purchase_review_screenshot → in_app_purchase_app_store_review_screenshot}/update.rb +4 -3
  199. data/lib/app_store_dev_api/requests/v1/in_app_purchase_availability/create.rb +13 -12
  200. data/lib/app_store_dev_api/requests/v1/in_app_purchase_image/create.rb +24 -0
  201. data/lib/app_store_dev_api/requests/v1/in_app_purchase_image/update.rb +18 -0
  202. data/lib/app_store_dev_api/requests/v1/in_app_purchase_localization/create.rb +14 -14
  203. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code/create.rb +27 -0
  204. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code/update.rb +21 -0
  205. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_custom_code/create.rb +27 -0
  206. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_custom_code/update.rb +21 -0
  207. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_one_time_use_code/create.rb +27 -0
  208. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_one_time_use_code/update.rb +21 -0
  209. data/lib/app_store_dev_api/requests/v1/in_app_purchase_price_schedule/create.rb +11 -10
  210. data/lib/app_store_dev_api/requests/v1/in_app_purchase_submission/create.rb +9 -10
  211. data/lib/app_store_dev_api/requests/v1/marketplace_search_detail/create.rb +25 -0
  212. data/lib/app_store_dev_api/requests/v1/marketplace_search_detail/update.rb +21 -0
  213. data/lib/app_store_dev_api/requests/v1/{promoted_purchases → marketplace_webhook}/create.rb +7 -5
  214. data/lib/app_store_dev_api/requests/v1/marketplace_webhook/update.rb +22 -0
  215. data/lib/app_store_dev_api/requests/v1/merchant_id/create.rb +22 -0
  216. data/lib/app_store_dev_api/requests/v1/{app_price_schedule → merchant_id}/update.rb +7 -3
  217. data/lib/app_store_dev_api/requests/v1/nomination/create.rb +39 -0
  218. data/lib/app_store_dev_api/requests/v1/nomination/update.rb +40 -0
  219. data/lib/app_store_dev_api/requests/v1/pass_type_id/create.rb +22 -0
  220. data/lib/app_store_dev_api/requests/v1/pass_type_id/update.rb +21 -0
  221. data/lib/app_store_dev_api/requests/v1/profile/create.rb +14 -23
  222. data/lib/app_store_dev_api/requests/v1/promoted_purchase/create.rb +28 -0
  223. data/lib/app_store_dev_api/requests/v1/{promoted_purchases → promoted_purchase}/update.rb +4 -3
  224. data/lib/app_store_dev_api/requests/v1/review_submission/create.rb +11 -7
  225. data/lib/app_store_dev_api/requests/v1/review_submission/update.rb +12 -15
  226. data/lib/app_store_dev_api/requests/v1/review_submission_item/create.rb +20 -8
  227. data/lib/app_store_dev_api/requests/v1/review_submission_item/update.rb +18 -0
  228. data/lib/app_store_dev_api/requests/v1/routing_app_coverage/create.rb +24 -0
  229. data/lib/app_store_dev_api/requests/v1/routing_app_coverage/update.rb +21 -0
  230. data/lib/app_store_dev_api/requests/v1/subscription/create.rb +17 -17
  231. data/lib/app_store_dev_api/requests/v1/subscription/update.rb +19 -17
  232. data/lib/app_store_dev_api/requests/v1/subscription_app_store_review_screenshot/create.rb +26 -0
  233. data/lib/app_store_dev_api/requests/v1/{subscription_review_screenshot → subscription_app_store_review_screenshot}/update.rb +4 -3
  234. data/lib/app_store_dev_api/requests/v1/subscription_availability/create.rb +13 -12
  235. data/lib/app_store_dev_api/requests/v1/subscription_grace_period/update.rb +13 -16
  236. data/lib/app_store_dev_api/requests/v1/subscription_group/create.rb +12 -13
  237. data/lib/app_store_dev_api/requests/v1/subscription_group/update.rb +10 -14
  238. data/lib/app_store_dev_api/requests/v1/subscription_group_localization/create.rb +14 -16
  239. data/lib/app_store_dev_api/requests/v1/subscription_group_localization/update.rb +11 -16
  240. data/lib/app_store_dev_api/requests/v1/subscription_group_submission/create.rb +9 -10
  241. data/lib/app_store_dev_api/requests/v1/subscription_image/create.rb +20 -0
  242. data/lib/app_store_dev_api/requests/v1/subscription_image/update.rb +21 -0
  243. data/lib/app_store_dev_api/requests/v1/subscription_introductory_offer/create.rb +18 -18
  244. data/lib/app_store_dev_api/requests/v1/subscription_introductory_offer/update.rb +10 -15
  245. data/lib/app_store_dev_api/requests/v1/subscription_localization/create.rb +14 -16
  246. data/lib/app_store_dev_api/requests/v1/subscription_offer_code/create.rb +19 -19
  247. data/lib/app_store_dev_api/requests/v1/{subscription_offer_code_cunstom_code → subscription_offer_code_custom_code}/create.rb +9 -5
  248. data/lib/app_store_dev_api/requests/v1/{subscription_offer_code_cunstom_code → subscription_offer_code_custom_code}/update.rb +2 -3
  249. data/lib/app_store_dev_api/requests/v1/subscription_offer_code_one_time_use_code/create.rb +14 -15
  250. data/lib/app_store_dev_api/requests/v1/subscription_price/create.rb +15 -13
  251. data/lib/app_store_dev_api/requests/v1/subscription_promotional_offer/create.rb +17 -18
  252. data/lib/app_store_dev_api/requests/v1/subscription_promotional_offer/update.rb +10 -12
  253. data/lib/app_store_dev_api/requests/v1/subscription_submission/create.rb +9 -8
  254. data/lib/app_store_dev_api/requests/v1/{app_availability → territory_availability}/update.rb +4 -7
  255. data/lib/app_store_dev_api/requests/v1/user/update.rb +27 -0
  256. data/lib/app_store_dev_api/requests/v1/user_invitation/create.rb +30 -0
  257. data/lib/app_store_dev_api/requests/v1/webhook/create.rb +23 -0
  258. data/lib/app_store_dev_api/requests/v1/webhook/update.rb +21 -0
  259. data/lib/app_store_dev_api/requests/v1/webhook_delivery/create.rb +16 -0
  260. data/lib/app_store_dev_api/requests/v1/webhook_ping/create.rb +16 -0
  261. data/lib/app_store_dev_api/requests/v1/win_back_offer/create.rb +31 -0
  262. data/lib/app_store_dev_api/requests/v1/win_back_offer/update.rb +23 -0
  263. data/lib/app_store_dev_api/requests/v1/win_back_offer/update_prices_linkages.rb +18 -0
  264. data/lib/app_store_dev_api/requests/v2/app_availability/create.rb +13 -14
  265. data/lib/app_store_dev_api/requests/v2/app_availability_v2/create.rb +26 -0
  266. data/lib/app_store_dev_api/requests/v2/app_store_version_experiment_v2/create.rb +27 -0
  267. data/lib/app_store_dev_api/requests/v2/app_store_version_experiment_v2/update.rb +23 -0
  268. data/lib/app_store_dev_api/requests/v2/game_center_achievement_image_v2/create.rb +26 -0
  269. data/lib/app_store_dev_api/requests/v2/game_center_achievement_image_v2/update.rb +21 -0
  270. data/lib/app_store_dev_api/requests/v2/game_center_achievement_localization_v2/create.rb +28 -0
  271. data/lib/app_store_dev_api/requests/v2/game_center_achievement_localization_v2/update.rb +23 -0
  272. data/lib/app_store_dev_api/requests/v2/game_center_achievement_v2/create.rb +32 -0
  273. data/lib/app_store_dev_api/requests/v2/game_center_achievement_v2/update.rb +26 -0
  274. data/lib/app_store_dev_api/requests/v2/game_center_achievement_version_v2/create.rb +22 -0
  275. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_image_v2/create.rb +26 -0
  276. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_image_v2/update.rb +21 -0
  277. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_localization_v2/create.rb +30 -0
  278. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_localization_v2/update.rb +25 -0
  279. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_image_v2/create.rb +26 -0
  280. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_image_v2/update.rb +21 -0
  281. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_localization_v2/create.rb +26 -0
  282. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_localization_v2/update.rb +21 -0
  283. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_v2/create.rb +29 -0
  284. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_v2/update.rb +21 -0
  285. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_version_v2/create.rb +22 -0
  286. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_v2/create.rb +39 -0
  287. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_v2/update.rb +32 -0
  288. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_version_v2/create.rb +22 -0
  289. data/lib/app_store_dev_api/requests/v2/in_app_purchase/create.rb +16 -17
  290. data/lib/app_store_dev_api/requests/v2/in_app_purchase/update.rb +12 -15
  291. data/lib/app_store_dev_api/requests/v2/in_app_purchase_v2/create.rb +29 -0
  292. data/lib/app_store_dev_api/requests/v2/in_app_purchase_v2/update.rb +23 -0
  293. data/lib/app_store_dev_api/requests/v2/{sandbox_tester → sandbox_tester_v2}/update.rb +5 -4
  294. data/lib/app_store_dev_api/requests/v2/{sandbox_tester_clear_purchase_history/update.rb → sandbox_testers_clear_purchase_history_request_v2/create.rb} +9 -3
  295. data/lib/app_store_dev_api/version.rb +1 -1
  296. data/lib/config/{schema.json → schema_backup.json} +1185 -51
  297. data/lib/config/schema_v4.3.json +7307 -0
  298. data/push_all.sh +6 -0
  299. data/release_remote.sh +140 -0
  300. data/scripts/README.md +126 -0
  301. data/scripts/cleanup_scripts.sh +73 -0
  302. data/scripts/comprehensive_validation.rb +359 -0
  303. data/scripts/comprehensive_validation_report.json +12 -0
  304. data/scripts/final_validation_report.rb +134 -0
  305. data/scripts/find_deprecated_requests.rb +145 -0
  306. data/scripts/test_request_body_classes.rb +185 -0
  307. data/scripts/validate_requests.rb +192 -0
  308. data/test_library.rb +160 -0
  309. metadata +250 -34
  310. data/CODE_OF_CONDUCT.md +0 -84
  311. data/lib/app_store_dev_api/requests/v1/app_promoted_purchases/update.rb +0 -16
  312. data/lib/app_store_dev_api/requests/v1/app_store_version_build_linkage_request/update.rb +0 -17
  313. data/lib/app_store_dev_api/requests/v1/build_beta_groups/create.rb +0 -16
  314. data/lib/app_store_dev_api/requests/v1/build_beta_groups/delete.rb +0 -16
  315. data/lib/app_store_dev_api/requests/v1/promoted_purchases_image/create.rb +0 -20
  316. data/lib/app_store_dev_api/requests/v2/sandbox_tester/create.rb +0 -23
  317. data/release.sh +0 -55
@@ -0,0 +1,417 @@
1
+ # Bundle IDs - App Store Connect API
2
+
3
+ > 官方文档: https://developer.apple.com/documentation/appstoreconnectapi/bundle-ids
4
+
5
+ ## 概述
6
+
7
+ Bundle IDs 是用于标识 iOS、macOS 或通用平台应用的唯一标识符。通过 App Store Connect API,你可以注册、查询、更新和删除 Bundle ID,并管理其关联的 App、Capabilities 和 Profiles。
8
+
9
+ ## 数据模型
10
+
11
+ ### BundleId 对象
12
+
13
+ | 字段 | 类型 | 说明 |
14
+ |------|------|------|
15
+ | `type` | string | 固定值 `"bundleIds"` |
16
+ | `id` | string | 资源唯一标识 |
17
+ | `attributes.name` | string | Bundle ID 显示名称 |
18
+ | `attributes.platform` | BundleIdPlatform | 平台类型 |
19
+ | `attributes.identifier` | string | Bundle ID 标识符(如 `com.example.app`) |
20
+ | `attributes.seedId` | string | Team Seed ID |
21
+
22
+ ### BundleIdPlatform 枚举
23
+
24
+ | 值 | 说明 |
25
+ |----|------|
26
+ | `IOS` | iOS 平台 |
27
+ | `MAC_OS` | macOS 平台 |
28
+ | `UNIVERSAL` | 通用平台(iOS + macOS) |
29
+
30
+ ### 关联关系 (Relationships)
31
+
32
+ | 关系 | 类型 | 说明 |
33
+ |------|------|------|
34
+ | `profiles` | Profiles[] | 关联的配置文件 |
35
+ | `bundleIdCapabilities` | BundleIdCapability[] | 关联的能力配置 |
36
+ | `app` | App | 关联的应用 |
37
+
38
+ ---
39
+
40
+ ## API 端点
41
+
42
+ ### 1. 列出所有 Bundle IDs
43
+
44
+ ```
45
+ GET /v1/bundleIds
46
+ ```
47
+
48
+ 获取所有已注册的 Bundle ID 列表。
49
+
50
+ #### 查询参数
51
+
52
+ **过滤 (Filter)**
53
+
54
+ | 参数 | 类型 | 说明 |
55
+ |------|------|------|
56
+ | `filter[name]` | string | 按名称过滤 |
57
+ | `filter[platform]` | string | 按平台过滤,可选值: `IOS`, `MAC_OS`, `UNIVERSAL` |
58
+ | `filter[identifier]` | string | 按标识符过滤 |
59
+ | `filter[seedId]` | string | 按 Seed ID 过滤 |
60
+ | `filter[id]` | string | 按资源 ID 过滤 |
61
+
62
+ **排序 (Sort)**
63
+
64
+ | 参数 | 说明 |
65
+ |------|------|
66
+ | `sort` | 排序字段,可选: `name`, `-name`, `platform`, `-platform`, `identifier`, `-identifier`, `seedId`, `-seedId`, `id`, `-id` |
67
+
68
+ **字段选择 (Fields)**
69
+
70
+ | 参数 | 可选值 |
71
+ |------|--------|
72
+ | `fields[bundleIds]` | `name`, `platform`, `identifier`, `seedId`, `profiles`, `bundleIdCapabilities`, `app` |
73
+ | `fields[profiles]` | `name`, `platform`, `profileType`, `profileState`, `profileContent`, `uuid`, `createdDate`, `expirationDate`, `bundleId`, `devices`, `certificates` |
74
+ | `fields[bundleIdCapabilities]` | `capabilityType`, `settings` |
75
+ | `fields[apps]` | `name`, `bundleId`, `sku`, `primaryLocale` 等 |
76
+
77
+ **分页与包含**
78
+
79
+ | 参数 | 说明 |
80
+ |------|------|
81
+ | `limit` | 每页数量限制 |
82
+ | `limit[bundleIdCapabilities]` | Capabilities 关系数量限制 |
83
+ | `limit[profiles]` | Profiles 关系数量限制 |
84
+ | `include` | 包含关联资源,可选: `profiles`, `bundleIdCapabilities`, `app` |
85
+
86
+ #### 响应
87
+
88
+ | 状态码 | 说明 | 响应体 |
89
+ |--------|------|--------|
90
+ | 200 | 成功 | `BundleIdsResponse` |
91
+ | 400 | 请求参数错误 | `ErrorResponse` |
92
+ | 401 | 未认证 | `ErrorResponse` |
93
+ | 403 | 无权限 | `ErrorResponse` |
94
+ | 429 | 请求过于频繁 | `ErrorResponse` |
95
+
96
+ ---
97
+
98
+ ### 2. 注册新的 Bundle ID
99
+
100
+ ```
101
+ POST /v1/bundleIds
102
+ ```
103
+
104
+ 注册一个新的 Bundle ID。
105
+
106
+ #### 请求体 (BundleIdCreateRequest)
107
+
108
+ ```json
109
+ {
110
+ "data": {
111
+ "type": "bundleIds",
112
+ "attributes": {
113
+ "name": "My App Bundle ID",
114
+ "platform": "IOS",
115
+ "identifier": "com.example.myapp",
116
+ "seedId": "XXXXXXXXXX"
117
+ }
118
+ }
119
+ }
120
+ ```
121
+
122
+ **必填字段:**
123
+
124
+ | 字段 | 类型 | 说明 |
125
+ |------|------|------|
126
+ | `attributes.name` | string | **必填** - Bundle ID 显示名称 |
127
+ | `attributes.platform` | BundleIdPlatform | **必填** - 平台类型 |
128
+ | `attributes.identifier` | string | **必填** - Bundle ID 标识符 |
129
+
130
+ **可选字段:**
131
+
132
+ | 字段 | 类型 | 说明 |
133
+ |------|------|------|
134
+ | `attributes.seedId` | string | 可选 - Team Seed ID(nullable) |
135
+
136
+ #### 响应
137
+
138
+ | 状态码 | 说明 | 响应体 |
139
+ |--------|------|--------|
140
+ | 201 | 创建成功 | `BundleIdResponse` |
141
+ | 400 | 请求参数错误 | `ErrorResponse` |
142
+ | 401 | 未认证 | `ErrorResponse` |
143
+ | 403 | 无权限 | `ErrorResponse` |
144
+ | 409 | 资源冲突(已存在) | `ErrorResponse` |
145
+ | 422 | 请求体无法处理 | `ErrorResponse` |
146
+ | 429 | 请求过于频繁 | `ErrorResponse` |
147
+
148
+ ---
149
+
150
+ ### 3. 获取单个 Bundle ID
151
+
152
+ ```
153
+ GET /v1/bundleIds/{id}
154
+ ```
155
+
156
+ 根据 ID 获取指定的 Bundle ID 信息。
157
+
158
+ #### 路径参数
159
+
160
+ | 参数 | 类型 | 说明 |
161
+ |------|------|------|
162
+ | `id` | string | **必填** - Bundle ID 资源的唯一标识 |
163
+
164
+ #### 查询参数
165
+
166
+ | 参数 | 说明 |
167
+ |------|------|
168
+ | `fields[bundleIds]` | 选择返回的 Bundle ID 字段 |
169
+ | `fields[profiles]` | 选择返回的 Profile 字段 |
170
+ | `fields[bundleIdCapabilities]` | 选择返回的 Capability 字段 |
171
+ | `fields[apps]` | 选择返回的 App 字段 |
172
+ | `include` | 包含关联资源: `profiles`, `bundleIdCapabilities`, `app` |
173
+ | `limit[bundleIdCapabilities]` | Capabilities 数量限制 |
174
+ | `limit[profiles]` | Profiles 数量限制 |
175
+
176
+ #### 响应
177
+
178
+ | 状态码 | 说明 | 响应体 |
179
+ |--------|------|--------|
180
+ | 200 | 成功 | `BundleIdResponse` |
181
+ | 400 | 请求参数错误 | `ErrorResponse` |
182
+ | 401 | 未认证 | `ErrorResponse` |
183
+ | 403 | 无权限 | `ErrorResponse` |
184
+ | 404 | 资源不存在 | `ErrorResponse` |
185
+ | 429 | 请求过于频繁 | `ErrorResponse` |
186
+
187
+ ---
188
+
189
+ ### 4. 更新 Bundle ID
190
+
191
+ ```
192
+ PATCH /v1/bundleIds/{id}
193
+ ```
194
+
195
+ 更新已有 Bundle ID 的名称。
196
+
197
+ #### 路径参数
198
+
199
+ | 参数 | 类型 | 说明 |
200
+ |------|------|------|
201
+ | `id` | string | **必填** - Bundle ID 资源的唯一标识 |
202
+
203
+ #### 请求体 (BundleIdUpdateRequest)
204
+
205
+ ```json
206
+ {
207
+ "data": {
208
+ "type": "bundleIds",
209
+ "id": "BUNDLE_ID_RESOURCE_ID",
210
+ "attributes": {
211
+ "name": "Updated App Name"
212
+ }
213
+ }
214
+ }
215
+ ```
216
+
217
+ **可更新字段:**
218
+
219
+ | 字段 | 类型 | 说明 |
220
+ |------|------|------|
221
+ | `attributes.name` | string | 可选 - 新的显示名称(nullable) |
222
+
223
+ > 注意: `platform` 和 `identifier` 字段在创建后不可修改。
224
+
225
+ #### 响应
226
+
227
+ | 状态码 | 说明 | 响应体 |
228
+ |--------|------|--------|
229
+ | 200 | 更新成功 | `BundleIdResponse` |
230
+ | 400 | 请求参数错误 | `ErrorResponse` |
231
+ | 401 | 未认证 | `ErrorResponse` |
232
+ | 403 | 无权限 | `ErrorResponse` |
233
+ | 404 | 资源不存在 | `ErrorResponse` |
234
+ | 409 | 资源冲突 | `ErrorResponse` |
235
+ | 422 | 请求体无法处理 | `ErrorResponse` |
236
+ | 429 | 请求过于频繁 | `ErrorResponse` |
237
+
238
+ ---
239
+
240
+ ### 5. 删除 Bundle ID
241
+
242
+ ```
243
+ DELETE /v1/bundleIds/{id}
244
+ ```
245
+
246
+ 删除指定的 Bundle ID。
247
+
248
+ #### 路径参数
249
+
250
+ | 参数 | 类型 | 说明 |
251
+ |------|------|------|
252
+ | `id` | string | **必填** - Bundle ID 资源的唯一标识 |
253
+
254
+ #### 响应
255
+
256
+ | 状态码 | 说明 |
257
+ |--------|------|
258
+ | 204 | 删除成功(无响应体) |
259
+ | 400 | 请求参数错误 |
260
+ | 401 | 未认证 |
261
+ | 403 | 无权限 |
262
+ | 404 | 资源不存在 |
263
+ | 429 | 请求过于频繁 |
264
+
265
+ ---
266
+
267
+ ## 关联端点
268
+
269
+ ### 6. 获取 Bundle ID 关联的 App(关系)
270
+
271
+ ```
272
+ GET /v1/bundleIds/{id}/relationships/app
273
+ ```
274
+
275
+ 获取 Bundle ID 与 App 的关联关系 ID。
276
+
277
+ #### 响应
278
+
279
+ | 状态码 | 说明 | 响应体 |
280
+ |--------|------|--------|
281
+ | 200 | 成功 | `BundleIdAppLinkageResponse` |
282
+ | 404 | 资源不存在 | `ErrorResponse` |
283
+
284
+ ---
285
+
286
+ ### 7. 获取 Bundle ID 关联的 App(详情)
287
+
288
+ ```
289
+ GET /v1/bundleIds/{id}/app
290
+ ```
291
+
292
+ 获取与 Bundle ID 关联的 App 完整信息。
293
+
294
+ #### 查询参数
295
+
296
+ | 参数 | 说明 |
297
+ |------|------|
298
+ | `fields[apps]` | 选择返回的 App 字段 |
299
+
300
+ #### 响应
301
+
302
+ | 状态码 | 说明 | 响应体 |
303
+ |--------|------|--------|
304
+ | 200 | 成功 | `AppWithoutIncludesResponse` |
305
+ | 404 | 资源不存在 | `ErrorResponse` |
306
+
307
+ ---
308
+
309
+ ### 8. 获取 Bundle ID 关联的 Capabilities(关系)
310
+
311
+ ```
312
+ GET /v1/bundleIds/{id}/relationships/bundleIdCapabilities
313
+ ```
314
+
315
+ 获取 Bundle ID 与 Capabilities 的关联关系 ID 列表。
316
+
317
+ #### 查询参数
318
+
319
+ | 参数 | 说明 |
320
+ |------|------|
321
+ | `limit` | 数量限制 |
322
+
323
+ #### 响应
324
+
325
+ | 状态码 | 说明 | 响应体 |
326
+ |--------|------|--------|
327
+ | 200 | 成功 | `BundleIdBundleIdCapabilitiesLinkagesResponse` |
328
+ | 404 | 资源不存在 | `ErrorResponse` |
329
+
330
+ ---
331
+
332
+ ### 9. 获取 Bundle ID 关联的 Capabilities(详情)
333
+
334
+ ```
335
+ GET /v1/bundleIds/{id}/bundleIdCapabilities
336
+ ```
337
+
338
+ 获取与 Bundle ID 关联的所有 Capability 完整信息。
339
+
340
+ #### 查询参数
341
+
342
+ | 参数 | 说明 |
343
+ |------|------|
344
+ | `fields[bundleIdCapabilities]` | 选择返回的字段: `capabilityType`, `settings` |
345
+ | `limit` | 数量限制 |
346
+
347
+ #### 响应
348
+
349
+ | 状态码 | 说明 | 响应体 |
350
+ |--------|------|--------|
351
+ | 200 | 成功 | `BundleIdCapabilitiesWithoutIncludesResponse` |
352
+ | 404 | 资源不存在 | `ErrorResponse` |
353
+
354
+ ---
355
+
356
+ ### 10. 获取 Bundle ID 关联的 Profiles(关系)
357
+
358
+ ```
359
+ GET /v1/bundleIds/{id}/relationships/profiles
360
+ ```
361
+
362
+ 获取 Bundle ID 与 Profiles 的关联关系 ID 列表。
363
+
364
+ #### 查询参数
365
+
366
+ | 参数 | 说明 |
367
+ |------|------|
368
+ | `limit` | 数量限制 |
369
+
370
+ #### 响应
371
+
372
+ | 状态码 | 说明 | 响应体 |
373
+ |--------|------|--------|
374
+ | 200 | 成功 | `BundleIdProfilesLinkagesResponse` |
375
+ | 404 | 资源不存在 | `ErrorResponse` |
376
+
377
+ ---
378
+
379
+ ### 11. 获取 Bundle ID 关联的 Profiles(详情)
380
+
381
+ ```
382
+ GET /v1/bundleIds/{id}/profiles
383
+ ```
384
+
385
+ 获取与 Bundle ID 关联的所有 Profile 完整信息。
386
+
387
+ #### 查询参数
388
+
389
+ | 参数 | 说明 |
390
+ |------|------|
391
+ | `fields[profiles]` | 选择返回的字段 |
392
+ | `limit` | 数量限制 |
393
+
394
+ #### 响应
395
+
396
+ | 状态码 | 说明 | 响应体 |
397
+ |--------|------|--------|
398
+ | 200 | 成功 | `ProfilesWithoutIncludesResponse` |
399
+ | 404 | 资源不存在 | `ErrorResponse` |
400
+
401
+ ---
402
+
403
+ ## 端点汇总
404
+
405
+ | 方法 | 路径 | 说明 |
406
+ |------|------|------|
407
+ | `GET` | `/v1/bundleIds` | 列出所有 Bundle IDs |
408
+ | `POST` | `/v1/bundleIds` | 注册新 Bundle ID |
409
+ | `GET` | `/v1/bundleIds/{id}` | 获取单个 Bundle ID |
410
+ | `PATCH` | `/v1/bundleIds/{id}` | 更新 Bundle ID |
411
+ | `DELETE` | `/v1/bundleIds/{id}` | 删除 Bundle ID |
412
+ | `GET` | `/v1/bundleIds/{id}/relationships/app` | 获取 App 关系 |
413
+ | `GET` | `/v1/bundleIds/{id}/app` | 获取关联 App 详情 |
414
+ | `GET` | `/v1/bundleIds/{id}/relationships/bundleIdCapabilities` | 获取 Capabilities 关系 |
415
+ | `GET` | `/v1/bundleIds/{id}/bundleIdCapabilities` | 获取关联 Capabilities 详情 |
416
+ | `GET` | `/v1/bundleIds/{id}/relationships/profiles` | 获取 Profiles 关系 |
417
+ | `GET` | `/v1/bundleIds/{id}/profiles` | 获取关联 Profiles 详情 |
@@ -0,0 +1,137 @@
1
+ # 创建 App Store Connect API 密钥
2
+
3
+ > 官方文档: https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api
4
+
5
+ ## 概述
6
+
7
+ 要使用 App Store Connect API,你需要先创建 API 密钥来进行身份认证。Apple 提供了两种类型的 API 密钥:**团队密钥 (Team Keys)** 和 **个人密钥 (Individual Keys)**。
8
+
9
+ ## 密钥类型
10
+
11
+ ### 团队密钥 (Team Keys)
12
+
13
+ - 由 **Admin(管理员)** 角色创建和管理
14
+ - 作用于整个开发者团队
15
+ - 可分配不同的角色权限
16
+ - 适用于 CI/CD 自动化、后端服务等场景
17
+
18
+ ### 个人密钥 (Individual Keys)
19
+
20
+ - 由任何团队成员为自己创建
21
+ - 权限范围与创建者的角色一致
22
+ - 适用于个人开发工具和脚本
23
+
24
+ ## 创建步骤
25
+
26
+ ### 前置条件
27
+
28
+ - 拥有 Apple Developer Program 会员资格
29
+ - 拥有 App Store Connect 的 Admin 角色(创建团队密钥时需要)
30
+ - 访问 [App Store Connect](https://appstoreconnect.apple.com/)
31
+
32
+ ### 创建团队 API 密钥
33
+
34
+ 1. 登录 [App Store Connect](https://appstoreconnect.apple.com/)
35
+ 2. 导航到 **用户和访问 (Users and Access)**
36
+ 3. 选择 **集成 (Integrations)** 选项卡
37
+ 4. 在左侧导航中选择 **App Store Connect API**
38
+ 5. 选择 **团队密钥 (Team Keys)** 标签页
39
+ 6. 点击 **生成 API 密钥 (Generate API Key)** 或 **+** 按钮
40
+ 7. 输入密钥名称(用于标识用途)
41
+ 8. 选择密钥的访问权限(角色)
42
+ 9. 点击 **生成 (Generate)**
43
+
44
+ ### 密钥角色权限
45
+
46
+ 创建团队密钥时,可分配以下角色:
47
+
48
+ | 角色 | 说明 |
49
+ |------|------|
50
+ | Admin | 完全管理权限,可执行所有 API 操作 |
51
+ | Finance | 财务数据访问权限 |
52
+ | App Manager | 应用管理权限 |
53
+ | Developer | 开发相关权限 |
54
+ | Marketing | 营销相关权限 |
55
+ | Sales | 销售数据访问权限 |
56
+ | Customer Support | 客户支持权限 |
57
+ | Read Only | 只读访问权限 |
58
+
59
+ ## 密钥属性
60
+
61
+ 创建 API 密钥后,你将获得以下三个关键信息:
62
+
63
+ ### 1. Issuer ID(发行者 ID)
64
+
65
+ - 格式:UUID(如 `57246542-96fe-1a63-e053-0824d011072a`)
66
+ - 对整个团队唯一,所有 API 密钥共享同一个 Issuer ID
67
+ - 在 App Store Connect 的 **密钥 (Keys)** 页面顶部可以找到
68
+ - 用于 JWT Token 的 `iss` 声明
69
+
70
+ ### 2. Key ID(密钥 ID)
71
+
72
+ - 格式:10 位字母数字字符串(如 `2X9R4HXF34`)
73
+ - 每个 API 密钥唯一
74
+ - 在密钥列表中显示
75
+ - 用于 JWT Token Header 的 `kid` 字段
76
+
77
+ ### 3. Private Key(私钥)
78
+
79
+ - 格式:ECDSA P-256 私钥(`.p8` 文件)
80
+ - 使用 ES256 算法
81
+ - **仅在创建时可下载一次**
82
+
83
+ ## 下载私钥
84
+
85
+ > ⚠️ **重要提示**: 私钥文件 (.p8) 只能在创建后下载一次。如果丢失,需要撤销当前密钥并创建新的。
86
+
87
+ 1. 创建密钥后,点击 **下载 API 密钥 (Download API Key)**
88
+ 2. 保存 `.p8` 文件到安全位置
89
+ 3. 文件名格式为 `AuthKey_{Key ID}.p8`(如 `AuthKey_2X9R4HXF34.p8`)
90
+
91
+ ### 私钥文件格式
92
+
93
+ ```
94
+ -----BEGIN PRIVATE KEY-----
95
+ MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg...
96
+ (Base64 编码的 ECDSA P-256 私钥数据)
97
+ ...
98
+ -----END PRIVATE KEY-----
99
+ ```
100
+
101
+ ## 安全建议
102
+
103
+ 1. **妥善保管私钥** - 将私钥存储在安全的密钥管理系统中(如 Vault、AWS Secrets Manager)
104
+ 2. **不要提交到代码仓库** - 将 `.p8` 文件添加到 `.gitignore`
105
+ 3. **使用环境变量** - 通过环境变量传递私钥内容,而非硬编码文件路径
106
+ 4. **最小权限原则** - 为 API 密钥分配完成任务所需的最小权限角色
107
+ 5. **定期轮换** - 定期撤销旧密钥并创建新密钥
108
+ 6. **限制密钥数量** - 每个团队最多可创建的活跃密钥数量有限
109
+
110
+ ## 在本项目中使用
111
+
112
+ 使用 `app_store_dev_api` gem 时,需要提供以上三个凭证信息:
113
+
114
+ ```ruby
115
+ require 'app_store_dev_api'
116
+
117
+ # 方式一:直接传入私钥内容
118
+ client = AppStoreDevApi::Client.new(
119
+ issuer_id: '57246542-96fe-1a63-e053-0824d011072a',
120
+ key_id: '2X9R4HXF34',
121
+ private_key: File.read('/path/to/AuthKey_2X9R4HXF34.p8')
122
+ )
123
+
124
+ # 方式二:通过环境变量
125
+ client = AppStoreDevApi::Client.new(
126
+ issuer_id: ENV['APP_STORE_CONNECT_ISSUER_ID'],
127
+ key_id: ENV['APP_STORE_CONNECT_KEY_ID'],
128
+ private_key: ENV['APP_STORE_CONNECT_PRIVATE_KEY']
129
+ )
130
+ ```
131
+
132
+ 初始化后,gem 会自动处理 JWT Token 的生成和 API 请求认证。
133
+
134
+ ## 相关文档
135
+
136
+ - [生成 API 请求 Token](generating_tokens.md)
137
+ - [撤销 API 密钥](revoking_api_keys.md)