Many centralized exchanges keep you in the dark, leaving no-one accountable when things go wrong. It’s like handing your car keys to a stranger and asking them to park your car for you. They could crash it, steal it, park it in the wrong place, lose the keys or sell them to someone else. Once they’ve taken the keys, you’ve got no control, no transparency, and no guarantees.
Finally: irrespective of the overall architecture, we find great value in programming to interfaces (protocols) for many of our components (now popular approach thanks to Protocol-Oriented Programming in Swift), in a proper dependency injection like Typhoon and in a proper dependency management like Cocoapods.
Let me explain better. When you build apps for a specific domain, like airlines and travel companies as MTT does, you realize soon that some Screens / Modules can be productize and consumed as a libraries among other apps. This also implies that Screens / Modules placed within unknown hosting apps must require a custom navigation (Builder can inject a custom Wireframe), may require a slightly different way of formatting data on the screen (Builder can inject a custom PresentationModelBuilder) and even a bespoke user interface (Builder can inject a custom View).