The iOS app's icon count, pushed by ipx (#433)
Background refresh runs when iOS chooses, and for this app that has been rarely, so the icon's unread count lagged until the app was opened (#421). Now ipx sends the count: - ipx: a push_devices table and POST/DELETE /api/push/devices. With [push] set to an APNs key, a task compares each phone's All Subscriptions unread count with the last sent, once a minute, and sends a changed one to Apple as a badge-only push: no alert, no sound. A token Apple says is gone is forgotten. The signing token is ES256 over the team and time, made again every forty minutes, inside Apple's limits. - iOS: the aps-environment entitlement. The app registers for push once badge permission is given, each launch, and hands its token to the page. - Page: registers the token with ipx as the person signed in, since the player's address (ipxapi) lets through only the player's paths, and removes it on signing out. jsonwebtoken here is built without PEM support, so the .p8 key's base64 is decoded in push.rs rather than turning on a feature and changing Cargo.lock for one file. cargo test -p ipx on macOS: 182 pass; the 3 that fail read /proc and fail there without this change too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
23
ios/Sources/Push.swift
Normal file
23
ios/Sources/Push.swift
Normal file
@@ -0,0 +1,23 @@
|
||||
import Foundation
|
||||
|
||||
/// This phone's push token (#433). ipx sends the icon's count to it while the app is closed,
|
||||
/// which background refresh only guessed at. The page registers it with ipx, signed in as the
|
||||
/// page is, since the player's address lets through only the player's own paths.
|
||||
@MainActor
|
||||
enum Push {
|
||||
/// Told when the token arrives or changes, to pass it to the page.
|
||||
static var onToken: ((String) -> Void)?
|
||||
|
||||
static var token: String? {
|
||||
didSet { if let token, token != oldValue { onToken?(token) } }
|
||||
}
|
||||
|
||||
/// A debug build is served by Apple's sandbox, which ipx has to send to instead.
|
||||
static var sandbox: Bool {
|
||||
#if DEBUG
|
||||
true
|
||||
#else
|
||||
false
|
||||
#endif
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user