Not long ago I got tired of some web technologies and decided to look into iOS native app building. It took me some time to un-learn many things and have that "aha moment" but when I got it, I'm no longer craving for JS - except for few things that I think are better on the JS world and that is the when UI building is done better with code. In my experience when you have a situation where you want to represent data visually, it's more intuitive to create the UI by code and I find that UIKit is not much fun when dealt with only through code and no WYSIWYG interface building tools(btw WYSIWYG on XCode is not like Dreamviewer, it actually works pretty well and helps you more than limits you).
This SwiftUI + Combine thing seems to fix that pretty well. It's unfortunate that it's iOS13+ only. One thing that I kept craving when I switched to native app development was ReduxJS like state management and visual UI for data management so I build one for myself[0]. Right now there are few friction points of keeping the UI in sync with the state but I think there's now a real opportunity with Combine to have nice state management like with ReduxJS in iOS.
For professional projects I have worked on, the rule of thumb we have landed on is usually to support 2 versions older than the current version.
Yes it's usually a small minority of users who haven't upgraded, but that tends to be people with older phones who can't update to the latest version. It makes my life harder, but it's better than punishing users who can't afford to upgrade their phone often.
True but the maturity of the framework is also questionable, they changed quite a few things since the introduction. I think we should wait a bit before going all in :)
I've done a little bit of Native iOS, the main thing I found annoying was having to build UI's using a drag/drop editor.
On web you have HTML, on Android you can ignore the UI builder and write XML, on WPF/Xamarin Forms you have XAML, but on iOS you have to either use the drag/drop editor or build your UI in Swift/Objective C. Both feel messy.
You can edit the XML generated manually of course, but it's clearly not supported, and isn't as intuitive as other UI frameworks (as far as I can tell).
Maybe I just need to spend more time with iOS, I only spent a couple of months working on that app, and didn't do a lot of UI work but that was my initial takeaway.
I see. You don't have to use the Interface Builder(the WYSIWYG drag and drop stuff) at all. The empty state of any new project will be initiated with it but you can simply delete it, remove any reference to it from the other files and do code-only UI.
That said, after some un-learning, I found that this Interface Builder is actually very powerful in taking care of the mundane stuff and so you can concentrate on the more interesting things. This is because you can interact with the drag-and-drop elements as if they were written in code, this thing doesn't generate some weird markup that you have to understand, instead, you interact with it through API in your code(essentially, linking the visually created element to a variable in your code. Once linked, you can work with that visual element as if it was created through code).
The positioning is done through constraints, you can have conflicting constraints with different priority and you can change these priorities in your code to have nice animations. You can add constraints, remove constraints, turn on/off constraints from your code, you can do everything nicely mixing the code with the Interface Builder. It's really amazing once you get over your previous ways of doing things and embrace the Apple way.
This SwiftUI + Combine thing seems to fix that pretty well. It's unfortunate that it's iOS13+ only. One thing that I kept craving when I switched to native app development was ReduxJS like state management and visual UI for data management so I build one for myself[0]. Right now there are few friction points of keeping the UI in sync with the state but I think there's now a real opportunity with Combine to have nice state management like with ReduxJS in iOS.
[0] SwiftyState is an open source state management library inspired by ReduxJS and built with Swift 5: https://github.com/mrtksn/SwiftyState