diff --git a/AltStore/Operations/InstallAppOperation.swift b/AltStore/Operations/InstallAppOperation.swift index 12db3326..bc866498 100644 --- a/AltStore/Operations/InstallAppOperation.swift +++ b/AltStore/Operations/InstallAppOperation.swift @@ -149,21 +149,58 @@ final class InstallAppOperation: ResultOperation }) } - // Since reinstalling ourself will hang until we leave the app, force quit after 3 seconds if still installing var installing = true if installedApp.storeApp?.bundleIdentifier == Bundle.Info.appbundleIdentifier { + // Reinstalling ourself will hang until we leave the app, so we need to exit it without force closing DispatchQueue.main.asyncAfter(deadline: .now() + 3) { - if installing { - print("We are still installing after 3 seconds, requesting notification and then closing") - - var content = UNMutableNotificationContent() - content.title = "Refreshing..." - content.body = "To finish refreshing, SideStore must force close itself. Please reopen SideStore after it is done refreshing!" - let notification = UNNotificationRequest(identifier: Bundle.Info.appbundleIdentifier + ".FinishRefreshNotification", content: content, trigger: UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)) - UNUserNotificationCenter.current().add(notification) - exit(0) - } else { + if UIApplication.shared.applicationState != .active { + print("We are not in the foreground, let's not do anything") + return + } + if !installing { print("Installing finished") + return + } + print("We are still installing after 3 seconds") + + UNUserNotificationCenter.current().getNotificationSettings { settings in + switch (settings.authorizationStatus) { + case .authorized, .ephemeral, .provisional: + print("Notifications are enabled") + + let content = UNMutableNotificationContent() + content.title = "Refreshing..." + content.body = "To finish refreshing, SideStore must be moved to the background, which it does by opening Safari. Please reopen SideStore after it is done refreshing!" + let notification = UNNotificationRequest(identifier: Bundle.Info.appbundleIdentifier + ".FinishRefreshNotification", content: content, trigger: UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false)) + UNUserNotificationCenter.current().add(notification) + + DispatchQueue.main.async { UIApplication.shared.open(URL(string: "x-web-search://")!) } + + break + default: + print("Notifications are not enabled") + + let alert = UIAlertController(title: "Finish Refresh", message: "To finish refreshing, SideStore must be moved to the background. To do this, you can either go to the Home Screen or open Safari by pressing Continue. Please reopen SideStore after doing this.", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in + print("Opening Safari") + DispatchQueue.main.async { UIApplication.shared.open(URL(string: "x-web-search://")!) } + })) + + DispatchQueue.main.async { + let keyWindow = UIApplication.shared.windows.filter { $0.isKeyWindow }.first + if var topController = keyWindow?.rootViewController { + while let presentedViewController = topController.presentedViewController { + topController = presentedViewController + } + topController.present(alert, animated: true) + } else { + print("No key window? Let's just open Safari") + UIApplication.shared.open(URL(string: "x-web-search://")!) + } + } + + break + } } } }