App-Store-Connect-CLI 的 Game Center 被封禁玩家管理:blocked-players 命令完整实战指南
发布时间:2026/9/29 7:26:34
资讯中心
01
ARTICLE
App-Store-Connect-CLI 的 Game Center 被封禁玩家管理:blocked-players 命令完整实战指南
【免费下载链接】App-Store-Connect-CLIFast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more项目地址https://gitcode.com/gh_mirrors/ap/App-Store-Connect-CLI点击查看免费下载本文基于 App Store Connect API 4.5 引入的 Game Center blocked-player 集合能力系统讲解 App-Store-Connect-CLI 中asc game-center details blocked-players命令组list 与 update的完整用法、参数语义与底层实现。读者将掌握如何列出某个 Game Center detail 下被封禁的玩家、如何对单个玩家执行封禁/解封、如何正确处理分页与 bundle ID 属性以及该功能在源码中的真实调用链与验证逻辑。blocked-players 功能是什么App Store Connect API 4.5 为 Game Center detail 资源新增了两类能力一是blockedPlayers集合端点可以列出某个 Game Center detail 下处于封禁状态的玩家二是gameCenterDetailPlayers资源的更新端点可以修改单个玩家的封禁状态。App-Store-Connect-CLI 将这些能力封装为asc game-center details blocked-players命令组对应的三个典型用法如下asc game-center details blocked-players list --detail-id DETAIL_ID --paginate asc game-center details blocked-players update --id PLAYER_ID --blocked true --confirm asc game-center details blocked-players update --id PLAYER_ID --blocked false --confirm从 docs/openapi/paths.txt 可以看到本次功能涉及的全部端点GET /v1/gameCenterDetails/{id}/blockedPlayers—— 集合端点列出被封禁玩家PATCH /v1/gameCenterDetailPlayers/{id}—— 更新端点修改单个玩家封禁/解封GET /v1/gameCenterDetails/{id}/relationships/blockedPlayers—— 仅返回 ID 的关系端点仍可通过asc api透传访问。重要前置认知集合只含被封禁玩家需要首先明确一个容易混淆的点blockedPlayers 集合只包含被封禁的玩家它并不是全部玩家的目录。也就是说list的输出是黑名单快照而非玩家总览。文档原文与命令实现internal/cli/gamecenter/game_center_blocked_players.go 中 list 子命令的 ShortHelp 即 List only blocked players for a Game Center detail.都强调了这一点。解析 Game Center detail ID调用list需要--detail-id而 detail ID 需要通过asc game-center details list按 App ID 解析得到asc game-center details list --app APP_ID该子命令实现在 internal/cli/gamecenter/game_center_details.go通过--app定位应用对应的 Game Center detail 资源。获取待封禁的 player ID对于要新封禁的玩家其 player ID 可以从已提交成绩score的player关系中获得。Apple 在该 API 版本中没有暴露独立的玩家查找端点因此先找到违规成绩再顺着成绩的 player 关系拿到玩家最后封禁玩家是官方推荐的取证路径。与之配合的成绩审核能力位于 internal/asc/game_center_score_moderations.go它通过GET /v2/gameCenterLeaderboards/{id}/gameCenterScoreModerations列出成绩其中player关系可以展开出玩家资源从而取得 player ID 用于后续的update操作。列出被封禁玩家list 子命令list的基本用法asc game-center details blocked-players list --detail-id DETAIL_ID [flags]支持的分页与字段控制参数如下参数说明取值范围/约束--detail-idGame Center detail ID必填除非使用--next来自asc game-center details list --app APP_ID--fields指定返回字段仅允许nickname,blocked,bundleId的组合--limit每页最大结果数1–200越界会报错--limit must be between 1 and 200--next使用上一页返回的links.nextURL 取下一页完整携带查询串不能与--detail-id、--fields、--limit组合--paginate自动翻页并聚合所有页的结果与--limit等参数可组合使用为什么--next不能与其他参数组合--next传入的是 Apple 返回的完整延续 URL它已经包含了完整的查询串包括字段、limit、游标等全部信息。若再叠加--detail-id、--fields、--limit会形成语义冲突。CLI 通过 internal/cli/shared/next_flag_conflicts.go 的RejectNextFlagConflicts在解析阶段强制拒绝这种组合报错形如--next cannot be combined with --detail-idasc game-center details blocked-players list \ --next https://api.appstoreconnect.apple.com/v1/gameCenterDetails/d/blockedPlayers?cursornext仅使用--next时--detail-id不再是必填项实现见 internal/cli/gamecenter/game_center_blocked_players.go。每页独立请求超时list的每页请求都会通过shared.ContextWithTimeout创建全新的请求超时上下文见 internal/cli/gamecenter/game_center_blocked_players.go这意味着即使前几页耗时较长下一页仍享有完整的超时预算不会被累计拖垮。底层实现Go 客户端如何构造请求list最终调用 internal/asc/game_center_detail_players.go 的GetGameCenterBlockedPlayers未使用--next时路径为/v1/gameCenterDetails/{detailID}/blockedPlayers并拼装fields[gameCenterDetailPlayers]与limit查询参数使用--next时直接用延续 URL 作为完整请求路径且会先经过validateNextURL校验响应解析为GameCenterDetailPlayersResponse其属性结构为nickname、blocked、bundleIdinternal/asc/game_center_detail_players.go。--paginate则依赖 internal/asc/client_pagination.go 的PaginateAll它按links.next逐页拉取并聚合全部数据同时检测重复的延续 URL 以防止死循环。更新封禁状态update 子命令update用于封禁或解封单个玩家必须同时提供--blocked true|false和--confirm# 封禁玩家 asc game-center details blocked-players update --id PLAYER_ID --blocked true --confirm # 解封玩家 asc game-center details blocked-players update --id PLAYER_ID --blocked false --confirm参数说明--id玩家 IDgameCenterDetailPlayers资源 ID必填--blocked布尔值true 封禁 / false 解封必填且必须显式给出--confirm确认执行破坏性变更必填--bundle-id可选随更新一起发送 Apple 的bundleId属性--output/--pretty输出格式控制json / table / markdown--confirm的强制逻辑Game Center 的更新操作可能造成不可逆影响CLI 专门实现了 internal/cli/gamecenter/game_center_confirmation.go 的validateGameCenterReplacementConfirm未提供--confirm时输出Error: --confirm is required并返回用法错误--confirm显式传false也会被拒绝--confirm must be true when specified。--bundle-id的三态语义--bundle-id的行为值得特别注意它存在三种状态实现见 internal/cli/gamecenter/game_center_blocked_players.go完全省略--bundle-id请求体中的bundleId字段因omitempty而被省略Apple 端该属性保持原样不变提供非空值bundleId随 PATCH 请求一并发送覆盖原有值显式提供空值被拒绝报错--bundle-id must not be empty。这是因为一个显式置空的 bundle ID 在语义上等同于要清除该属性而 CLI 选择保守处理不允许用户通过这种方式误清空数据。底层实现PATCH 请求与资源信封update最终调用 internal/asc/game_center_detail_players.go 的UpdateGameCenterDetailPlayer其发送PATCH /v1/gameCenterDetailPlayers/{id}请求体为标准的 JSON:API 资源信封{ data: { type: gameCenterDetailPlayers, id: PLAYER_ID, attributes: { blocked: true, bundleId: com.example.game } } }资源类型gameCenterDetailPlayers在 internal/asc/types/resources.go 中定义并在 internal/asc/client_types.go 重新导出供客户端使用。测试 internal/cli/cmdtest/game_center_blocked_players_test.go 对封禁与解封两种 payload 均有断言不带--bundle-id时 attributes 中只有blocked一个字段带--bundle-id时则恰好包含blocked与bundleId两个字段。输出格式与数据保留语义JSON 输出保留资源信封使用--output json时输出直接保留 Apple 返回的完整资源信封data、attributes、links等包括显式的false与空字符串值。这一点在 update 场景下尤为重要例如某玩家的blocked属性为false、nickname为空字符串JSON 输出会原样呈现blocked:false与nickname:不会因为值为空/为假而丢失。测试 internal/cli/cmdtest/game_center_blocked_players_test.go 明确断言了nickname:会出现在输出中。Table 与 Markdown 输出列--output table与--output markdown的行渲染实现在 internal/asc/output_game_center_detail_players.go每行输出四列IDNicknameBlockedBundle ID即玩家的 ID、昵称、封禁状态与所属 bundle ID。该行渲染器通过 internal/asc/output_registry_init.go 注册到输出注册表因此list和update都能复用统一的表格化输出。仅 ID 的关系端点与 asc api 后备通道如果只需要操作玩家与 Game Center detail 的关联关系而非封禁状态本身可以继续使用仅返回 ID 的关系端点GET /v1/gameCenterDetails/{id}/relationships/blockedPlayers见 docs/openapi/paths.txt该端点未在blocked-players命令组中提供专门子命令但可通过通用透传命令访问asc api gameCenterDetails/{DETAIL_ID}/relationships/blockedPlayers常见错误与排查根据 list/update 的校验逻辑测试用例见 internal/cli/cmdtest/game_center_blocked_players_test.go以下错误均有对应的明确报错信息错误场景报错信息list未提供--detail-id且无--next--detail-id is required--limit 0或--limit 201--limit must be between 1 and 200--fields score不在允许集合内--fields不可用字段名--fields显式传空串--fields must not be empty--next与--detail-id等组合--next cannot be combined with --detail-idupdate未提供--blocked--blocked is requiredupdate未提供--confirm--confirm is required--bundle-id显式为空--bundle-id must not be empty另外internal/cli/cmdtest/game_center_blocked_players_test.go 的端到端测试还验证了list在--fields nickname,blocked,bundleId --limit 1 --paginate场景下会先携带这些查询参数请求/v1/gameCenterDetails/detail-45/blockedPlayers随后携带游标cursorpage2请求下一页三种输出格式json、table、markdown都能正确呈现聚合结果可作为理解完整调用链的参考。小结asc game-center details blocked-players命令组为 Game Center 玩家封禁治理提供了完整的脚本化工作流通过details list解析 detail ID、通过成绩的player关系定位违规玩家、用list审计当前黑名单、用update执行封禁与解封并且全程贯彻了严格的分页互斥校验、确认机制与数据保真输出。结合 internal/asc/game_center_detail_players.go 的客户端实现与 internal/cli/gamecenter/game_center_blocked_players.go 的命令解析逻辑开发者可以放心地将该命令组集成进自动化封禁/审计流程中。赞分享【免费下载链接】App-Store-Connect-CLIFast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more项目地址https://gitcode.com/gh_mirrors/ap/App-Store-Connect-CLI点击查看免费下载相关推荐App-Store-Connect-CLI 实战Game Center 排行榜分数审核Score Moderation命令指南App Store Connect CLI 实战Game Center 排行榜分数审核Score Moderation命令指南 App Store ConNotepad-- 完整指南集批量查找替换、文件对比与编码转换于一体的跨平台文本编辑器Notepad 完整指南集批量查找替换、文件对比与编码转换于一体的跨平台文本编辑器 Notepad 简称 ndd是一款基于 C 与 Qt 开发的跨平台Sanity 仓库中的 React 最佳实践用 toSorted() 替代 sort() 实现不可变排序Sanity 仓库中的 React 最佳实践用 toSorted 替代 sort 实现不可变排序 本文基于 Sanity Studio 仓库内置的 Verce上一篇pi-mono 自定义模型实战一份 models.json 接上你的本地模型下一篇如何三步让MuJoCo机械臂稳定抓杯轨迹回放完整实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考