1- And how do you think supposedly fragmented Android deals with it ? Is it “progress” when it’s iOS and “fragmentation” when it’s Android ?
2- Arguably, Android does more to handle version differences by providing backward-compatibility libraries, putting less stuff in the core OS…
3- APIs/dev tools try and paper over slight differences (screens sizes, dpi; CPU & GPU performance…) but can’t really do anything about bigger ones (3D touch: either there’s code to handle that or there isn’t; TouchID; Interactive notifications; 64 bits vs 32 bits; etc….) (*). Contrary to what you say, there’s no magic feature in the OS that makes all apps handle that stuff, the devs have to write it. That’s the definition of fragmentation.
(*) maybe a better way to separate the 2 issues is quantitative vs qualitative. OS and dev tools can handle quantitative (more pixels, MHz, RAM..) automatically, they can’t handle qualitative (new pen, new coprocessor, notch…) w/o specific code.