It never works well because the platforms are not simply the same thing by different companies but they all have their concurrent ideas, conventions and differences.
The toolset for "Write once. Deploy everywhere." that works is HTML + JS + CSS and nothing else. This is because browsers work about the same everywhere.
IMHO if an app is not going to leverage the platform but will simply show some UI to display or collect data, the way to do it is HTML + JS + CSS in the browser.
When you try to support platform specific features, you end up doing much more work but instead of working on the primary App, you spend you time on integration and replication of platform behaviour or functions.
There are two major types of application: one where users play role of "reader" and second type is where user is "writer" - creator of some data, document, etc.
> that works is HTML + JS + CSS and nothing else.
That type of UI mostly works for "reader" applications - when maximum what you do is clicking on buttons and filling couple of <input>s.
For "creator"'s applications, CADs, editors, IDEs, and so on, HTML + JS + CSS is far from being perfect. At least without special means that extend these technologies to acceptable level.
Menu shall be menu but not that position:absolute something, dialog shall be modal window, drawing shall support immediate mode, keyboard interaction shall be there, and so forth.
My App definition was a bit too narrow maybe, games too tend to be multi platform.
I think that’s possible when the App and user interaction model is completely custom - like shooting zombies or drawing 3D shapes.
That's also party why browsers can't replace every app(the browsers have it's own opinion about the UI and interactions), the other reasons are performance and access limitations.
The toolset for "Write once. Deploy everywhere." that works is HTML + JS + CSS and nothing else. This is because browsers work about the same everywhere.
IMHO if an app is not going to leverage the platform but will simply show some UI to display or collect data, the way to do it is HTML + JS + CSS in the browser.
When you try to support platform specific features, you end up doing much more work but instead of working on the primary App, you spend you time on integration and replication of platform behaviour or functions.