iOS
Swift: modifica del rootViewController in AppDelegate per presentare il flusso principale o di accesso / onboarding
Ricerca…
introduzione
È spesso utile presentare un'esperienza di prima esecuzione ai nuovi utenti della tua app. Questo potrebbe essere per un numero qualsiasi di motivi, come chiedere loro di accedere (se necessario per la tua situazione), spiegare come utilizzare l'App o semplicemente informarli di nuove funzionalità in un aggiornamento (come Notes, Photos e Music do in iOS11).
Osservazioni
In primo luogo, poiché hai a che fare con flussi multipli, è qui che gli storyboard possono essere usati efficacemente. Per impostazione predefinita, l'applicazione utilizza Main.storyboard
per il flusso principale. Il tuo onboarding / flusso alternativo può essere contenuto in uno storyboard secondario, ad es. Onboarding.storyboard
Questo ha una serie di vantaggi:
- in un team di sviluppatori, il lavoro su ciascun flusso di utenti può essere separato
- controllo sorgente più chiaro (git)
- separazione degli interessi
Quando la tua app si avvia, puoi determinare quale flusso deve essere presentato. La logica per questo può essere contenuta nel tuo AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let isFirstRun = true // logic to determine goes here
if isFirstRun {
showOnboarding()
}
return true
}
Per mostrare il flusso di Onboarding, vale la pena considerare come vorresti gestire l'esperienza di licenziamento una volta che la persona che lo usa ha completato il viaggio e che è semanticamente corretto per ciò che stai cercando di creare.
approcci:
I due approcci principali sono:
- Scambia il controller della vista radice della finestra principale dell'app
- Presenta il flusso di bordo come un viaggio modale, sovrapponendo il flusso principale.
L'implementazione di questo dovrebbe essere contenuta in un'estensione di AppDelegate.
Opzione 1: scambia il controller di visualizzazione radice (buono)
Ci sono dei vantaggi nel cambiare il controller della vista radice, sebbene le opzioni di transizione siano limitate a quelle supportate da UIViewAnimationOptions
, quindi a seconda di come desideri passare tra i flussi potrebbe significare che devi implementare una transizione personalizzata, che può essere complicata.
È possibile mostrare il flusso di UIApplication.shared.keyWindow.rootViewController
semplicemente impostando UIApplication.shared.keyWindow.rootViewController
Il licenziamento viene gestito utilizzando UIView.transition(with:)
e passando lo stile di transizione come UIViewAnimationOptions
, in questo caso Cross Dissolve. (Anche Flip e ricci sono supportati).
Devi anche impostare la cornice della vista principale prima di ricollegarti ad essa, mentre la installi per la prima volta.
// MARK: - Onboarding
extension AppDelegate {
func showOnboarding() {
if let window = UIApplication.shared.keyWindow, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
onboardingViewController.delegate = self
window.rootViewController = onboardingViewController
}
}
func hideOnboarding() {
if let window = UIApplication.shared.keyWindow, let mainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() {
mainViewController.view.frame = window.bounds
UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {
window.rootViewController = mainViewController
}, completion: nil)
}
}
}
Opzione 2: presentare il flusso alternativo in modo modale (migliore)
Nell'implementazione più semplice, il flusso di Onboarding può essere semplicemente presentato in un contesto modale, poiché semanticamente l'utente si trova su un singolo percorso.
[Linee guida per l'interfaccia umana Apple - Modalità] [1]:
Prendi in considerazione la possibilità di creare un contesto modale solo quando è fondamentale attirare l'attenzione di qualcuno, quando un'attività deve essere completata o abbandonata per continuare a utilizzare l'app o per salvare dati importanti.
La presentazione modale consente la semplice opzione di licenziamento alla fine del viaggio, con un po 'di cruft di controller di scambio.
Le transizioni personalizzate sono supportate anche nel modo standard, poiché utilizza l'API ViewController.present()
:
// MARK: - Onboarding
extension AppDelegate {
func showOnboarding() {
if let window = window, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
onboardingViewController.delegate = self
window.makeKeyAndVisible()
window.rootViewController?.present(onboardingViewController, animated: false, completion: nil)
}
}
func hideOnboarding() {
if let window = UIApplication.shared.keyWindow {
window.rootViewController?.dismiss(animated: true, completion: nil)
}
}
}