The problem isn't the fallback to cellular but the function it uses to detect whether the WiFi is actually working. It works if there's a gross network failure but fails to detect networks which have packet loss, captive portal pages which cannot be loaded, etc. With the exception of captive portal pages, this isn't specific to the WiFi implementation either – the cellular stack is just as broken.
As far as I can tell, this comes down to two problems: the most obvious technical challenge is the difficulty of detecting soft failures rather than hard failures. What they need to implement is a hard timeout which resets the connection state if the remote end fails to respond correctly within a set interval. I encounter this regularly commuting on the subway or taking underground tunnels between buildings; toggling airplane mode is the only way to get it to accept that the base station (WiFi or cellular) it was talking to 1500 feet back is never going to start responding.
The social problem appears to be that nobody considers this a keynote demo feature and so it hasn't advanced beyond iOS 1.0 despite years of bug reports.
Even an app which you could program yourself would be excellent. It seems the system has equal belief in the reliability of all wifi networks, in terms of sticking with them. I'd like to give good reputation to my home wifi, but any new wifi should start with low reputation. And anything with a captive portal, you really want your phone to connect via 3G every few minutes to see if the connection is filtered.
As far as I can tell, this comes down to two problems: the most obvious technical challenge is the difficulty of detecting soft failures rather than hard failures. What they need to implement is a hard timeout which resets the connection state if the remote end fails to respond correctly within a set interval. I encounter this regularly commuting on the subway or taking underground tunnels between buildings; toggling airplane mode is the only way to get it to accept that the base station (WiFi or cellular) it was talking to 1500 feet back is never going to start responding.
The social problem appears to be that nobody considers this a keynote demo feature and so it hasn't advanced beyond iOS 1.0 despite years of bug reports.