Files
hermes-skills/skills/devops/ops-portal-and-collector/references/ios-pwa-push-testing.md
T

2.4 KiB

iOS PWA Push Notification Testing Guide

Debugging web push notifications for the shark game on iOS.

Setup

  1. Load the test page at https://shark.iamgmb.com/push-test.html
  2. Share -> "Add to Home Screen"
  3. Open from home screen (not from Safari browser tab)

Expected subscription flow

Browser supports push -> SW registered -> Permission granted -> Push subscribed -> Subscription sent to server

If subscribe succeeds but banner is invisible

The push opt-in <div id="pushBanner" style="display:none"> is hardcoded hidden in HTML. The showNotificationBanner() function must call banner.style.display = 'block' — without this explicit line, the banner state variable changes but the UI never reveals the prompt.

Check: Does showNotificationBanner() have banner.style.display = 'block'; at the top of the function body?

iOS PWA push limitation

PushManager is NOT available in Safari's browser tab on iOS. The FAIL: No PushManager error is expected behavior on iPhone Safari. The user MUST:**

  1. Tap Share -> "Add to Home Screen"
  2. Open from home screen (PWA mode, fullscreen, no URL bar)
  3. Then push subscription works via Apple Push Service (APNs)

Common subscription failures

The user_id column has a FK constraint to users.id. Test subscriptions use user_id: NULL — ensure the column allows NULL and the subscribe-noauth endpoint passes NULL.

Fix:

-- Rebuild table with nullable user_id
CREATE TABLE push_subscriptions_new (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,
    endpoint TEXT NOT NULL UNIQUE,
    p256dh TEXT NOT NULL,
    auth TEXT NOT NULL,
    created_at TEXT DEFAULT (datetime('now'))
);
INSERT INTO push_subscriptions_new SELECT * FROM push_subscriptions;
DROP TABLE push_subscriptions;
ALTER TABLE push_subscriptions_new RENAME TO push_subscriptions;

Server rejected subscription

Check that the subscribe-noauth endpoint exists and accepts the POST body:

{"endpoint": "https://...", "p256dh": "...", "auth": "..."}

Test send after subcription

curl -s -X POST https://shark.iamgmb.com/api/push/test \
  -H "Content-Type: application/json" \
  -d '{}'

Expected: {"sent": 1} Failure: {"sent": 0} — check journald for Push test failed: ...

Debugging database

sqlite3 /root/shark-game/backend/game.db "SELECT count(*) FROM push_subscriptions;"
sqlite3 /root/shark-game/backend/game.db "SELECT id, endpoint FROM push_subscriptions;"