From 1ca3aa3cdb50e73e830411850b843be926755e57 Mon Sep 17 00:00:00 2001 From: naturecodevoid <44983869+naturecodevoid@users.noreply.github.com> Date: Thu, 13 Apr 2023 07:20:36 -0700 Subject: [PATCH] fix: force close SideStore after 3 seconds if still reinstalling --- AltStore/Operations/InstallAppOperation.swift | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/AltStore/Operations/InstallAppOperation.swift b/AltStore/Operations/InstallAppOperation.swift index abe24a85..41deab1a 100644 --- a/AltStore/Operations/InstallAppOperation.swift +++ b/AltStore/Operations/InstallAppOperation.swift @@ -149,9 +149,45 @@ 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 { + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + if installing { + print("We are still installing after 3 seconds") + + let alert = UIAlertController(title: "Finish Refresh", message: "To finish refreshing, SideStore must force close itself. Please reopen SideStore after continuing!", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in + if installing { + print("Closing SideStore since we are still installing") + exit(0) + } else { + print("Not closing SideStore since installing finished") + } + })) + + 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? Closing SideStore") + exit(0) + } + } else { + print("Installing finished") + } + } + } + do { try install_ipa(installedApp.bundleIdentifier) + installing = false } catch { + installing = false return self.finish(.failure(error)) }