@@ -2,7 +2,7 @@ skip_docs
22
33devices  =  { 
44    "ios"  =>  { 
5-         15  =>  [ "iPhone SE (3rd generation)  (15.5)" ,  "iPad Air (5th  generation) (15.5)" , ] , 
5+         15  =>  [ "iPhone 13 Pro  (15.5)" ,  "iPad Pro (11-inch) (3rd  generation) (15.5)" , ] , 
66        16  =>  [ "iPhone 14 Pro (16.4)" ,  "iPad Pro (11-inch) (4th generation) (16.4)" ] , 
77        17  =>  [ "iPhone 15 Pro (17.5)" ,  "iPad Pro 11-inch (M4) (17.5)" ] , 
88        18  =>  [ "iPhone 16 Pro (18.6)" ,  "iPad Pro 11-inch (M4) (18.6)" ] , 
@@ -48,20 +48,27 @@ lane :create_simulators do |options|
4848
4949    # Build lookup tables from CoreSimulator for robust name→identifier mapping 
5050    begin 
51+         # Build a set of existing simulator name+runtime pairs to prevent duplicates across OS versions 
52+         devices_json  =  sh ( "xcrun simctl list -j devices" ,  log : false ) 
53+         devices_list  =  JSON . parse ( devices_json ) 
54+         existing_pairs  =  Set . new 
55+         ( devices_list [ "devices" ]  || { } ) . each  do  |runtime_key ,  arr |
56+             Array ( arr ) . each  do  |d |
57+                 name  =  d [ "name" ] 
58+                 next  unless  name  && runtime_key 
59+                 existing_pairs . add ( "#{ name }  ||#{ runtime_key }  " ) 
60+             end 
61+         end 
62+ 
5163        list_json  =  sh ( "xcrun simctl list -j" ,  log : false ) 
5264        list  =  JSON . parse ( list_json ) 
5365        devtypes  =  list [ "devicetypes" ]  || [ ] 
5466        runtimes  =  list [ "runtimes" ]  || [ ] 
55- 
56-         # Build a set of existing simulator names to prevent duplicates 
57-         devices_json  =  sh ( "xcrun simctl list -j devices" ,  log : false ) 
58-         devices_list  =  JSON . parse ( devices_json ) 
59-         existing_names  =  ( devices_list [ "devices" ]  || { } ) . values . flatten . map  {  |d | d [ "name" ]  } . compact . to_set 
6067    rescue  =>  e 
6168        UI . message ( "Failed to read simctl lists: #{ e }  " ) 
6269        devtypes  =  [ ] 
6370        runtimes  =  [ ] 
64-         existing_names  =  Set . new 
71+         existing_pairs  =  Set . new 
6572    end 
6673
6774    device_name_to_id  =  devtypes . each_with_object ( { } )  do  |dt ,  h |
@@ -126,13 +133,14 @@ lane :create_simulators do |options|
126133                # Use the device name without the version suffix as the simulator name 
127134                sim_name  =  device_name 
128135
129-                 if  existing_names . include? ( sim_name ) 
136+                 pair_key  =  "#{ sim_name }  ||#{ runtime_id }  " 
137+                 if  existing_pairs . include? ( pair_key ) 
130138                    UI . message ( "Already exists: #{ sim_name }   (#{ runtime_version }  ), skipping" ) 
131139                    next 
132140                end 
133141
134142                sh ( %(xcrun simctl create "#{ sim_name }  " "#{ device_type_id }  " "#{ runtime_id }  " || true) ) 
135-                 existing_names . add ( sim_name ) 
143+                 existing_pairs . add ( pair_key ) 
136144            rescue  =>  e 
137145                UI . message ( "Skipping #{ descriptor }  : #{ e }  " ) 
138146            end 
0 commit comments