@@ -452,6 +452,30 @@ def mac_ver(release='', versioninfo=('', '', ''), machine=''):
452452 # If that also doesn't work return the default values
453453 return release , versioninfo , machine
454454
455+
456+ # A namedtuple for iOS version information.
457+ IOSVersionInfo = collections .namedtuple (
458+ "IOSVersionInfo" ,
459+ ["system" , "release" , "model" , "is_simulator" ]
460+ )
461+
462+
463+ def ios_ver (system = "" , release = "" , model = "" , is_simulator = False ):
464+ """Get iOS version information, and return it as a namedtuple:
465+ (system, release, model, is_simulator).
466+
467+ If values can't be determined, they are set to values provided as
468+ parameters.
469+ """
470+ if sys .platform == "ios" :
471+ import _ios_support
472+ result = _ios_support .get_platform_ios ()
473+ if result is not None :
474+ return IOSVersionInfo (* result )
475+
476+ return IOSVersionInfo (system , release , model , is_simulator )
477+
478+
455479def _java_getprop (name , default ):
456480
457481 from java .lang import System
@@ -567,7 +591,7 @@ def _platform(*args):
567591 if cleaned == platform :
568592 break
569593 platform = cleaned
570- while platform [- 1 ] == '-' :
594+ while platform and platform [- 1 ] == '-' :
571595 platform = platform [:- 1 ]
572596
573597 return platform
@@ -608,7 +632,7 @@ def _syscmd_file(target, default=''):
608632 default in case the command should fail.
609633
610634 """
611- if sys .platform in ( 'dos' , 'win32' , 'win16' ) :
635+ if sys .platform in { 'dos' , 'win32' , 'win16' , 'ios' , 'tvos' , 'watchos' } :
612636 # XXX Others too ?
613637 return default
614638
@@ -750,6 +774,14 @@ def get_OpenVMS():
750774 csid , cpu_number = vms_lib .getsyi ('SYI$_CPU' , 0 )
751775 return 'Alpha' if cpu_number >= 128 else 'VAX'
752776
777+ # On the iOS simulator, os.uname returns the architecture as uname.machine.
778+ # On device it returns the model name for some reason; but there's only one
779+ # CPU architecture for iOS devices, so we know the right answer.
780+ def get_ios ():
781+ if sys .implementation ._multiarch .endswith ("simulator" ):
782+ return os .uname ().machine
783+ return 'arm64'
784+
753785 def from_subprocess ():
754786 """
755787 Fall back to `uname -p`
@@ -904,6 +936,10 @@ def uname():
904936 system = 'Windows'
905937 release = 'Vista'
906938
939+ # Normalize responses on iOS
940+ if sys .platform == 'ios' :
941+ system , release , _ , _ = ios_ver ()
942+
907943 vals = system , node , release , version , machine
908944 # Replace 'unknown' values with the more portable ''
909945 _uname_cache = uname_result (* map (_unknown_as_blank , vals ))
@@ -1216,11 +1252,14 @@ def platform(aliased=0, terse=0):
12161252 system , release , version = system_alias (system , release , version )
12171253
12181254 if system == 'Darwin' :
1219- # macOS (darwin kernel)
1220- macos_release = mac_ver ()[0 ]
1221- if macos_release :
1222- system = 'macOS'
1223- release = macos_release
1255+ # macOS and iOS both report as a "Darwin" kernel
1256+ if sys .platform == "ios" :
1257+ system , release , _ , _ = ios_ver ()
1258+ else :
1259+ macos_release = mac_ver ()[0 ]
1260+ if macos_release :
1261+ system = 'macOS'
1262+ release = macos_release
12241263
12251264 if system == 'Windows' :
12261265 # MS platforms
0 commit comments