@@ -449,6 +449,30 @@ def mac_ver(release='', versioninfo=('', '', ''), machine=''):
449449 # If that also doesn't work return the default values
450450 return release , versioninfo , machine
451451
452+
453+ # A namedtuple for iOS version information.
454+ IOSVersionInfo = collections .namedtuple (
455+ "IOSVersionInfo" ,
456+ ["system" , "release" , "model" , "is_simulator" ]
457+ )
458+
459+
460+ def ios_ver (system = "" , release = "" , model = "" , is_simulator = False ):
461+ """Get iOS version information, and return it as a namedtuple:
462+ (system, release, model, is_simulator).
463+
464+ If values can't be determined, they are set to values provided as
465+ parameters.
466+ """
467+ if sys .platform == "ios" :
468+ import _ios_support
469+ result = _ios_support .get_platform_ios ()
470+ if result is not None :
471+ return IOSVersionInfo (* result )
472+
473+ return IOSVersionInfo (system , release , model , is_simulator )
474+
475+
452476def _java_getprop (name , default ):
453477
454478 from java .lang import System
@@ -564,7 +588,7 @@ def _platform(*args):
564588 if cleaned == platform :
565589 break
566590 platform = cleaned
567- while platform [- 1 ] == '-' :
591+ while platform and platform [- 1 ] == '-' :
568592 platform = platform [:- 1 ]
569593
570594 return platform
@@ -605,7 +629,7 @@ def _syscmd_file(target, default=''):
605629 default in case the command should fail.
606630
607631 """
608- if sys .platform in ( 'dos' , 'win32' , 'win16' ) :
632+ if sys .platform in { 'dos' , 'win32' , 'win16' , 'ios' , 'tvos' , 'watchos' } :
609633 # XXX Others too ?
610634 return default
611635
@@ -744,6 +768,14 @@ def get_OpenVMS():
744768 csid , cpu_number = vms_lib .getsyi ('SYI$_CPU' , 0 )
745769 return 'Alpha' if cpu_number >= 128 else 'VAX'
746770
771+ # On the iOS simulator, os.uname returns the architecture as uname.machine.
772+ # On device it returns the model name for some reason; but there's only one
773+ # CPU architecture for iOS devices, so we know the right answer.
774+ def get_ios ():
775+ if sys .implementation ._multiarch .endswith ("simulator" ):
776+ return os .uname ().machine
777+ return 'arm64'
778+
747779 def from_subprocess ():
748780 """
749781 Fall back to `uname -p`
@@ -893,6 +925,10 @@ def uname():
893925 system = 'Windows'
894926 release = 'Vista'
895927
928+ # Normalize responses on iOS
929+ if sys .platform == 'ios' :
930+ system , release , _ , _ = ios_ver ()
931+
896932 vals = system , node , release , version , machine
897933 # Replace 'unknown' values with the more portable ''
898934 _uname_cache = uname_result (* map (_unknown_as_blank , vals ))
@@ -1205,11 +1241,14 @@ def platform(aliased=0, terse=0):
12051241 system , release , version = system_alias (system , release , version )
12061242
12071243 if system == 'Darwin' :
1208- # macOS (darwin kernel)
1209- macos_release = mac_ver ()[0 ]
1210- if macos_release :
1211- system = 'macOS'
1212- release = macos_release
1244+ # macOS and iOS both report as a "Darwin" kernel
1245+ if sys .platform == "ios" :
1246+ system , release , _ , _ = ios_ver ()
1247+ else :
1248+ macos_release = mac_ver ()[0 ]
1249+ if macos_release :
1250+ system = 'macOS'
1251+ release = macos_release
12131252
12141253 if system == 'Windows' :
12151254 # MS platforms
0 commit comments