@@ -19,7 +19,7 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
1919 @Published var isPresented = false
2020 @Published var phase : Phase = . idle
2121
22- @Published var fromVersion : String = EpsilonVersions . bundledSimulator
22+ @Published var fromVersion : String = EpsilonVersions . currentSimulatorVersionString ( )
2323 @Published var toVersion : String = " "
2424
2525 @Published var progress : Double = 0
@@ -57,7 +57,7 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
5757 restartTimer = nil
5858 restartSecondsRemaining = 0
5959 self . remoteURL = remoteURL
60- self . fromVersion = currentInstalledVersion
60+ self . fromVersion = EpsilonVersions . currentSimulatorVersionString ( )
6161 self . toVersion = remoteVersion
6262 setProgress ( 0 )
6363 self . phase = . prompt
@@ -74,7 +74,7 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
7474 restartTimer = nil
7575 restartSecondsRemaining = 0
7676 self . remoteURL = remoteURL
77- self . fromVersion = currentInstalledVersion
77+ self . fromVersion = EpsilonVersions . currentSimulatorVersionString ( )
7878 self . toVersion = remoteVersion
7979 setProgress ( 0 )
8080 self . phase = . prompt
@@ -134,10 +134,8 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
134134 try ? fm. removeItem ( at: currentDir)
135135 }
136136 try fm. moveItem ( at: stagingDir, to: currentDir)
137- try ensureSimulatorEntryHTML ( in: currentDir)
138-
139- setInstalledVersion ( toVersion)
140- print ( " [SimulatorUpdater] installed version set to \( toVersion) " )
137+ let normalizedTo = try normalizeVersionString ( toVersion)
138+ try ensureSimulatorEntryHTML ( in: currentDir, version: normalizedTo)
141139
142140 // cleanup staged artifacts
143141 try ? fm. removeItem ( at: zip)
@@ -232,7 +230,7 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
232230
233231 // Added per update prompting fixes and cleanup
234232 nonisolated static func installedSimulatorVersionString( ) -> String {
235- UserDefaults . standard . string ( forKey : " installedSimulatorVersion " ) ?? EpsilonVersions . bundledSimulator
233+ EpsilonVersions . currentSimulatorVersionString ( )
236234 }
237235
238236 nonisolated static func hasInstalledSimulatorInAppSupport( ) -> Bool {
@@ -331,14 +329,6 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
331329
332330 // MARK: - Paths + versions
333331
334- private var currentInstalledVersion : String {
335- UserDefaults . standard. string ( forKey: " installedSimulatorVersion " ) ?? EpsilonVersions . bundledSimulator
336- }
337-
338- private func setInstalledVersion( _ v: String ) {
339- UserDefaults . standard. set ( v, forKey: " installedSimulatorVersion " )
340- }
341-
342332 private var appSupportDir : URL {
343333 let base = FileManager . default. urls ( for: . applicationSupportDirectory, in: . userDomainMask) [ 0 ]
344334 let id = Bundle . main. bundleIdentifier ?? " NumworksApplication "
@@ -363,9 +353,9 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
363353
364354 // MARK: - Install helpers
365355
366- private func ensureSimulatorEntryHTML( in currentDir: URL ) throws {
356+ private func ensureSimulatorEntryHTML( in currentDir: URL , version : String ) throws {
367357 let fm = FileManager . default
368- let desired = currentDir. appendingPathComponent ( " numworks-simulator.html " , isDirectory: false )
358+ let desired = currentDir. appendingPathComponent ( " numworks-simulator- \( version ) .html " , isDirectory: false )
369359 if fm. fileExists ( atPath: desired. path) { return }
370360
371361 let index = currentDir. appendingPathComponent ( " index.html " , isDirectory: false )
@@ -382,6 +372,15 @@ final class SimulatorUpdater: NSObject, ObservableObject, URLSessionDownloadDele
382372 }
383373 }
384374
375+ private func normalizeVersionString( _ v: String ) throws -> String {
376+ let parts = v. split ( separator: " . " )
377+ guard parts. count == 3 else { throw NSError ( domain: " SimulatorUpdater " , code: 1 ) }
378+ guard let major = Int ( parts [ 0 ] ) , let minor = Int ( parts [ 1 ] ) , let patch = Int ( parts [ 2 ] ) else {
379+ throw NSError ( domain: " SimulatorUpdater " , code: 2 )
380+ }
381+ return String ( format: " %02d.%02d.%02d " , major, minor, patch)
382+ }
383+
385384 private func unzip( zipFile: URL , to dest: URL ) throws {
386385 let p = Process ( )
387386 p. executableURL = URL ( fileURLWithPath: " /usr/bin/ditto " )
0 commit comments