実現したいこと
現在開発しているアプリの AppDelegate.swift
ファイルの applicationDidBecomeActive
に特定状況下においてはAlertだけを表示する画面を表示してアプリ画面に行かないよいうにする実装をしています。Alertは問題なく表示できるのですが、Alert表示直後自動でAlertが消え、アプリの普通の画面が立ち上がってしまう状態です。
コードレビューを受けapplicationDidBecomeActive
内は長くしたくないということになり、別のForceUpdate
というstructと、その中に作ったactivate()
というファンクションを呼ぶだけの作りで現在実装しています。
問題の原因はSplashViewController
なのではないかと考えています。元々こちらの問題を解決できなかったのでSplashViewController.swift
と AppDelegate.swift
に同じようなコードを書いてSplashViewController
にDispatchGroup()
を使って記述して問題が起こらないよう無理やり解決していました。
ですがコードレビューでSplashViewController.swift
には何も書かずにAppDelegate.swift
にだけ記述するだけにしたいという流れになりました。
下記ソースコードをご覧いただければお分かりになる通り、Alertの表示はメインスレッドで出すように実装しています。
Alert表示後に自動で次の画面が表示されてしまうのを回避したいです。どのようにすれば解決できそうでしょうか?皆様のお力添えいただけますと幸いです。
swift
1class SplashViewController: UIViewController { 2 3 //中略 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 let isUserLoggedIn = UserDefaults.userData != nil && UserDefaults.userData2 != nil 8 let openRootViewController = { 9 DispatchQueue.main.async { 10 AppDelegate.share()?.setRootViewController() 11 } 12 } 13 if isUserLoggedIn { 14 15 //中略 16 17 openRootViewController() 18 19 } else { 20 openRootViewController() 21 } 22 } 23}
Swift
1func applicationDidBecomeActive(_ application: UIApplication) { 2 ForceUpdate.activate() 3}
swift
1struct ForceUpdate { 2 3 static func activate() { 4 5 let appDelegate = AppDelegate() 6 let deviceAppBuild = Int(Bundle.main.infoDictionary?["CFBundleVersion"] as! String) 7 let remoteConfig = RemoteConfig.remoteConfig() 8 let settings = RemoteConfigSettings() 9 settings.minimumFetchInterval = 0 10 remoteConfig.configSettings = settings 11 remoteConfig.fetch(withExpirationDuration: 0) { (status, error) in 12 if status == .success { 13 //RemoteConfigからデータがとれた場合 14 remoteConfig.activate(completionHandler: { (error) in 15 let minimumBuild = Int(remoteConfig.configValue(forKey: "minimum_build").numberValue ?? 0) 16 //端末側のアプリのビルド番号がremoteConfigのビルド番号より古かったらアップデートを促す 17 if deviceAppBuild! < minimumBuild { 18 DispatchQueue.main.async { 19 20 let alert = UIAlertController(title: Localizable.ForceUpdate.gettingLatestVersion.localized(), message: Localizable.ForceUpdate.availableLatestVersion.localized(), preferredStyle: .alert) 21 let alertAction = UIAlertAction(title: Localizable.ForceUpdate.getLatestVersion.localized(), style: .default, handler: { (action) in 22 let url = URL(string: Constants.URLs.appStoreUrl)! 23 UIApplication.shared.openURL(url) 24 }) 25 alert.addAction(alertAction) 26 appDelegate.window = UIWindow(frame: UIScreen.main.bounds) 27 let storyboard = UIStoryboard(name: "Main", bundle: nil) 28 let alertViewController = storyboard.instantiateInitialViewController() 29 appDelegate.window?.rootViewController = alertViewController 30 appDelegate.window?.makeKeyAndVisible() 31 alertViewController!.present(alert, animated: true) 32 } 33 } 34 }) 35 } 36 } 37 } 38} 39
追記
swift
1func setRootViewController() { 2 3 if !UserDefaults.isDidShowLandingPage { 4 replaceRootViewController(by: LandingPageViewController.getXibVC()) 5 return 6 } 7 if UserDefaults.userData != nil && UserDefaults.userData2 != nil { 8 setContainerToRoot() 9 } else { 10 setLoginVCToRoot() 11 } 12}
補足情報
Swift 5.0.1
Xcode 11.1
回答1件
あなたの回答
tips
プレビュー