A forced update screen makes users update when the old version must not be used anymore, like when it has a critical bug. Use it rarely. For regular releases show a soft update instead: an indicator on the home screen saying a new version exists. Not a dialog, users get tired of closing those. If you use a dialog anyway, show it once.
The third state is maintenance mode. It freezes the app and shows a message, for example while your backend is down. Keep the message on the server so you can tell users what's happening and when the app will be back. A bonus: it's also how you shut an app down for good, I've used it for that.
All of it should live in one config on a server: minimum versions, the maintenance flag and message, and the store URLs. Don't hardcode the URLs inside the app, they can change, for example when the app moves to another developer account. And set versions, even the maintenance flag, separately for Android and iOS: a bug can be Android-only, and store reviews finish at different times.
Check the config on app startup, but in the background. The check can take seconds on a slow network, and no app open should be delayed for it. When the result says forced update or maintenance, open that screen with a fade, not a regular transition, and disable the back gesture. There's no going back from it (users shouldn't be able to close those pages).
If you don't want to build this yourself, my package versionarte handles all of it. Go check it.