{
  "added_at": "2026-10-27",
  "additional_evidence_urls": [
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/pyproject.toml",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/LICENSE",
    "https://github.com/JJTech0130/pypush/tree/71aa2e4442061596f75e6b02dfad613330127b5b/pypush",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/pypush/apns/__init__.py",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/pypush/apns/lifecycle.py",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/pypush/apns/protocol.py",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/pypush/cli/__init__.py",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/tests/test_apns.py",
    "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/.github/workflows/lint.yml",
    "https://github.com/JJTech0130/pypush/releases/tag/v2.0.2",
    "https://pypi.org/project/pypush/2.0.2/"
  ],
  "category": "reconstruction-cases",
  "description_en": "Reimplements the client side of Apple’s private Apple Push Notification service (APNs) protocol in platform-independent Python: it activates as an Apple device, connects to the APNs courier, mints app-scoped tokens and receives push notifications. The project began as the author’s proof of concept for iMessage reverse engineering, but the current rewrite has removed IDS and iMessage support for now. It uses Apple’s services outside Apple’s official clients.",
  "description_zh": "以与平台无关的 Python 重新实现 Apple 私有推送通知服务（APNs）协议的客户端：它以 Apple 设备身份完成激活，连接 APNs courier 服务器，生成限定于应用的令牌并接收推送通知。项目最初是作者 iMessage 逆向研究的概念验证，但当前重写版暂时移除了 IDS 和 iMessage 支持。它在 Apple 官方客户端之外使用 Apple 的服务。",
  "entry_url": "https://awesomerea.org/resources/pypush-apns-protocol-case/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/pypush-apns-protocol-case/",
  "evidence_url": "https://github.com/JJTech0130/pypush/blob/71aa2e4442061596f75e6b02dfad613330127b5b/README.md",
  "group": "cases",
  "id": "pypush-apns-protocol-case",
  "json_url": "https://awesomerea.org/resources/pypush-apns-protocol-case/record.json",
  "kind": "case-study",
  "markdown_url": "https://awesomerea.org/resources/pypush-apns-protocol-case/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/pypush-apns-protocol-case/index.md",
  "name": "pypush: a Python client for Apple’s push protocol",
  "name_zh": "pypush：Apple 推送协议的 Python 客户端",
  "record_type": "resource",
  "relationship": "independent-reconstruction",
  "requirements": [
    "Reviewed at the 2026-03-15 main head, identical to release v2.0.2 on PyPI. The README warns that the rewrite is unstable, that many features have been temporarily removed and that stability should not be expected before 3.0.0. The IDS, iMessage, GrandSlam and CloudKit packages are empty placeholders, so the earlier iMessage work is not part of this version.",
    "Activation and connections go to Apple’s live activation and APNs servers through what the project calls Apple’s internal API, outside Apple’s official clients; the README notes that some APIs may need device identifiers. Apple’s terms for these services apply separately.",
    "Requires Python 3.9+ with anyio, httpx (HTTP/2) and cryptography; the cli extra adds Frida, Rich and Typer. The CLI listens for notifications on a topic, and its proxy mode, meant for observing a Mac’s own APNs traffic, attaches Frida to the local apsd daemon and requires System Integrity Protection disabled and root.",
    "Pull-request CI runs Ruff and pytest on Python 3.9–3.12 across Linux, macOS and Windows. The tests activate against Apple’s servers, open an APNs connection and round-trip a sandbox notification through a scoped token, so they depend on live services rather than offline protocol fixtures.",
    "LICENSE is the Server Side Public License v1, and the package metadata classifies it as Other/Proprietary; the README says Beeper purchased the project and directs licensing questions to Beeper."
  ],
  "requirements_zh": [
    "审阅对象为 2026-03-15 的 main 最新提交，与 PyPI 上的 v2.0.2 版本一致。README 警告重写版尚不稳定，许多功能已被暂时移除，3.0.0 之前不应期待稳定。IDS、iMessage、GrandSlam 和 CloudKit 包都是空占位，因此早期的 iMessage 成果不在此版本中。",
    "激活和连接会通过项目所称的 Apple 内部 API 访问 Apple 线上的激活服务器和 APNs 服务器，处于 Apple 官方客户端之外；README 指出部分 API 可能需要设备标识符。Apple 对这些服务的条款另行适用。",
    "需要 Python 3.9+ 及 anyio、httpx（HTTP/2）和 cryptography；cli 附加依赖会加入 Frida、Rich 和 Typer。命令行可在指定主题上监听通知；其代理模式用于观察 Mac 自身的 APNs 流量，会用 Frida 附加到本机 apsd 守护进程，需要关闭系统完整性保护（SIP）并以 root 运行。",
    "拉取请求的 CI 在 Linux、macOS 和 Windows 上以 Python 3.9–3.12 运行 Ruff 和 pytest。测试会向 Apple 服务器激活、建立 APNs 连接，并通过限定令牌往返一条沙盒通知，因此依赖线上服务，而非离线协议样本。",
    "LICENSE 为 Server Side Public License v1，包元数据将其归类为 Other/Proprietary；README 称项目已被 Beeper 收购，许可问题需联系 Beeper。"
  ],
  "targets": [
    "protocol"
  ],
  "url": "https://github.com/JJTech0130/pypush",
  "verification": "source-reviewed",
  "verified_at": "2026-10-19"
}
