duccio/apns-php
A PHP library for sending push notifications to iOS and macOS via Apple Push Notification service (APNs). Supports HTTP/2 and legacy binary protocols, token and certificate authentication, batch sending, error handling, and feedback.
Recommendation up front (revised): the critical blocker from the previous assessment is removed. duccio/apns-php v2.0.0-alpha speaks HTTP/2, so the package is no longer structurally incapable of delivering a notification. That is a material change and the "do not adopt under any circumstances" verdict no longer holds. The verdict is now hold for evaluation, do not production-adopt the alpha: pilot in staging, pin the exact pre-release, and gate any production use on a stable tag plus verified PHP 8 / curl-nghttp2 support. The package has moved from technically dead to technically viable but operationally unproven.
Architecture fit
ApnsPHP\Push) that you construct, connect, send, disconnect. HTTP/2 improves the economics of that model considerably — one connection now multiplexes many notifications instead of one TLS handshake per worker — but it does not change the shape. There is still no Laravel service provider, config file, facade, notification channel, or queue integration; all wiring, credential handling, connection lifecycle, and token bookkeeping remain first-party work.apns-topic, apns-push-type, apns-priority, apns-collapse-id, 4 KB payloads, and per-notification response codes — it is not a guarantee that the library exposes them. VoIP, critical alerts, Live Activities, and background pushes all depend on header control and correct push-type declaration, so these must be verified in code, not assumed from the release note.Integration feasibility
composer require needs an explicit stability flag, the version must be pinned exactly, and the public API may change before stable. Budget for one breaking-change cycle.Technical risk
2.0.0-alpha signals an API that may change, incomplete feature coverage, and unknown test depth. There is no track record of this code path in production anywhere you can observe..p8 provider keys with JWT — Apple's current recommendation. Certificate rotation remains a recurring manual operational task with hard expiry failure, and the new-certificate requirement means you inherit that burden immediately rather than inheriting an existing credential.410 Unregistered and BadDeviceToken. Whether the library surfaces these to the caller determines whether token hygiene is a small adapter or a rebuild. Treat the feedback-service replacement as still outstanding until proven otherwise.apns-* headers and enforces the new limit correctly needs a code read, not a changelog read.Key questions
composer.json, and has anyone run it on your pinned Laravel/PHP version?apns-topic, apns-push-type, apns-priority, and apns-collapse-id, and does it return per-notification status codes to the caller?.p8 JWT provider-token auth on the maintainer's roadmap, or is certificate auth the permanent design?Stack fit
ApnsPHP\* types.edamov/pushok and aporat/php-apns on three axes that matter more than raw features: JWT .p8 support, per-notification response-code surfacing, and release cadence. If those two do the same job on a stable tag, the alpha's only advantage is that you may already have the dependency and the message-building code.Migration path
composer.json and a smoke test. Both are cheap; either can invalidate the whole plan.PushSender::send(DeviceToken, PushMessage): DeliveryResult in the application domain. This is non-negotiable regardless of which library wins — it is what makes the alpha's instability survivable and what makes a later swap to a stable client or a managed provider a configuration change.ApnsPhpHttp2Sender behind the contract and send to Apple's sandbox. Success criteria: a real alert push arrives; a deliberately invalid token returns a distinguishable 410/BadDeviceToken; a 4 KB payload is accepted; a background push with the correct apns-push-type is accepted. If any of these requires patching the library, that is a fork decision, not a spike outcome.Compatibility
composer.json before any estimate.content-available, mutable-content, thread-id, apns-*).Sequencing
PushSender contract + adapter spike against sandbox + the four acceptance criteria above.Maintenance
.p8 auth would eliminate this; the package does not offer it.Support
Scaling
Failure modes
Ramp-up
apns-topic mapping to bundle ID, push-type headers per notification class, response-code handling, and token lifecycle without a feedback service. This knowledge is portable across every client library and every future platform, which is a better return on the investment than the binary-protocol knowledge it replaces.How can I help you explore Laravel packages today?