@@ -498,6 +498,30 @@ def mac_ver(release='', versioninfo=('', '', ''), machine=''):
498498 # If that also doesn't work return the default values
499499 return release , versioninfo , machine
500500
501+
502+ # A namedtuple for iOS version information.
503+ IOSVersionInfo = collections .namedtuple (
504+ "IOSVersionInfo" ,
505+ ["system" , "release" , "model" , "is_simulator" ]
506+ )
507+
508+
509+ def ios_ver (system = "" , release = "" , model = "" , is_simulator = False ):
510+ """Get iOS version information, and return it as a namedtuple:
511+ (system, release, model, is_simulator).
512+
513+ If values can't be determined, they are set to values provided as
514+ parameters.
515+ """
516+ if sys .platform == "ios" :
517+ import _ios_support
518+ result = _ios_support .get_platform_ios ()
519+ if result is not None :
520+ return IOSVersionInfo (* result )
521+
522+ return IOSVersionInfo (system , release , model , is_simulator )
523+
524+
501525def _java_getprop (name , default ):
502526
503527 from java .lang import System
@@ -613,7 +637,7 @@ def _platform(*args):
613637 if cleaned == platform :
614638 break
615639 platform = cleaned
616- while platform [- 1 ] == '-' :
640+ while platform and platform [- 1 ] == '-' :
617641 platform = platform [:- 1 ]
618642
619643 return platform
@@ -654,7 +678,7 @@ def _syscmd_file(target, default=''):
654678 default in case the command should fail.
655679
656680 """
657- if sys .platform in ( 'dos' , 'win32' , 'win16' ) :
681+ if sys .platform in { 'dos' , 'win32' , 'win16' , 'ios' , 'tvos' , 'watchos' } :
658682 # XXX Others too ?
659683 return default
660684
@@ -816,6 +840,14 @@ def get_OpenVMS():
816840 csid , cpu_number = vms_lib .getsyi ('SYI$_CPU' , 0 )
817841 return 'Alpha' if cpu_number >= 128 else 'VAX'
818842
843+ # On the iOS simulator, os.uname returns the architecture as uname.machine.
844+ # On device it returns the model name for some reason; but there's only one
845+ # CPU architecture for iOS devices, so we know the right answer.
846+ def get_ios ():
847+ if sys .implementation ._multiarch .endswith ("simulator" ):
848+ return os .uname ().machine
849+ return 'arm64'
850+
819851 def from_subprocess ():
820852 """
821853 Fall back to `uname -p`
@@ -970,6 +1002,10 @@ def uname():
9701002 system = 'Windows'
9711003 release = 'Vista'
9721004
1005+ # Normalize responses on iOS
1006+ if sys .platform == 'ios' :
1007+ system , release , _ , _ = ios_ver ()
1008+
9731009 vals = system , node , release , version , machine
9741010 # Replace 'unknown' values with the more portable ''
9751011 _uname_cache = uname_result (* map (_unknown_as_blank , vals ))
@@ -1249,11 +1285,14 @@ def platform(aliased=False, terse=False):
12491285 system , release , version = system_alias (system , release , version )
12501286
12511287 if system == 'Darwin' :
1252- # macOS (darwin kernel)
1253- macos_release = mac_ver ()[0 ]
1254- if macos_release :
1255- system = 'macOS'
1256- release = macos_release
1288+ # macOS and iOS both report as a "Darwin" kernel
1289+ if sys .platform == "ios" :
1290+ system , release , _ , _ = ios_ver ()
1291+ else :
1292+ macos_release = mac_ver ()[0 ]
1293+ if macos_release :
1294+ system = 'macOS'
1295+ release = macos_release
12571296
12581297 if system == 'Windows' :
12591298 # MS platforms
0 commit comments