@@ -19,6 +19,7 @@ use cargo_mobile2::{
1919 util:: { prompt, relativize_path} ,
2020} ;
2121use clap:: { Parser , Subcommand } ;
22+ use serde:: Deserialize ;
2223use sublime_fuzzy:: best_match;
2324use tauri_utils:: resources:: ResourcePaths ;
2425
@@ -325,12 +326,23 @@ fn connected_device_prompt<'a>(env: &'_ Env, target: Option<&str>) -> Result<Dev
325326 device,
326327 device. target( ) . triple,
327328 ) ;
329+
328330 Ok ( device)
329331 } else {
330332 Err ( anyhow:: anyhow!( "No connected iOS devices detected" ) )
331333 }
332334}
333335
336+ #[ derive( Default , Deserialize ) ]
337+ struct InstalledRuntimesList {
338+ runtimes : Vec < InstalledRuntime > ,
339+ }
340+
341+ #[ derive( Deserialize ) ]
342+ struct InstalledRuntime {
343+ name : String ,
344+ }
345+
334346fn simulator_prompt ( env : & ' _ Env , target : Option < & str > ) -> Result < device:: Simulator > {
335347 let simulator_list = device:: list_simulators ( env) . map_err ( |cause| {
336348 anyhow:: anyhow!( "Failed to detect connected iOS Simulator devices: {cause}" )
@@ -367,6 +379,19 @@ fn simulator_prompt(env: &'_ Env, target: Option<&str>) -> Result<device::Simula
367379 } ;
368380 Ok ( device)
369381 } else {
382+ log:: warn!( "No available iOS Simulator detected" ) ;
383+ let install_ios = crate :: helpers:: prompts:: confirm (
384+ "Would you like to install the latest iOS runtime?" ,
385+ Some ( false ) ,
386+ )
387+ . unwrap_or_default ( ) ;
388+ if install_ios {
389+ duct:: cmd ( "xcodebuild" , [ "-downloadPlatform" , "iOS" ] )
390+ . stdout_file ( os_pipe:: dup_stdout ( ) . unwrap ( ) )
391+ . stderr_file ( os_pipe:: dup_stderr ( ) . unwrap ( ) )
392+ . run ( ) ?;
393+ return simulator_prompt ( env, target) ;
394+ }
370395 Err ( anyhow:: anyhow!( "No available iOS Simulator detected" ) )
371396 }
372397}
@@ -382,6 +407,34 @@ fn device_prompt<'a>(env: &'_ Env, target: Option<&str>) -> Result<Device<'a>> {
382407 }
383408}
384409
410+ fn ensure_ios_runtime_installed ( ) -> Result < ( ) > {
411+ let installed_platforms_json =
412+ duct:: cmd ( "xcrun" , [ "simctl" , "list" , "runtimes" , "--json" ] ) . read ( ) ?;
413+ let installed_platforms: InstalledRuntimesList =
414+ serde_json:: from_str ( & installed_platforms_json) . unwrap_or_default ( ) ;
415+ if !installed_platforms
416+ . runtimes
417+ . iter ( )
418+ . any ( |r| r. name . starts_with ( "iOS" ) )
419+ {
420+ log:: warn!( "iOS platform not installed" ) ;
421+ let install_ios = crate :: helpers:: prompts:: confirm (
422+ "Would you like to install the latest iOS runtime?" ,
423+ Some ( false ) ,
424+ )
425+ . unwrap_or_default ( ) ;
426+ if install_ios {
427+ duct:: cmd ( "xcodebuild" , [ "-downloadPlatform" , "iOS" ] )
428+ . stdout_file ( os_pipe:: dup_stdout ( ) . unwrap ( ) )
429+ . stderr_file ( os_pipe:: dup_stderr ( ) . unwrap ( ) )
430+ . run ( ) ?;
431+ } else {
432+ anyhow:: bail!( "iOS platform not installed" ) ;
433+ }
434+ }
435+ Ok ( ( ) )
436+ }
437+
385438fn detect_target_ok < ' a > ( env : & Env ) -> Option < & ' a Target < ' a > > {
386439 device_prompt ( env, None ) . map ( |device| device. target ( ) ) . ok ( )
387440}
0 commit comments