I'm kind of amazed no one has implemented a better system for this yet. Public WiFi is very common, and relying on intercepting HTTP requests to show users a login screen seems very hacky to me.
What if a device pinged the gateway IP on a certain port whenever it connected, and received a small payload with details on connectivity authorisation URL, etc. etc.? For backwards compatibility if that ping fails it could just assume the network is open. It would take years for all the public routers out there to be updated, but you kind of need to start somewhere.