81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
'''
|
|
iOS GPS
|
|
-----------
|
|
'''
|
|
|
|
from pyobjus import autoclass, protocol
|
|
from pyobjus.dylib_manager import load_framework
|
|
from plyer.facades import GPS
|
|
|
|
load_framework('/System/Library/Frameworks/CoreLocation.framework')
|
|
CLLocationManager = autoclass('CLLocationManager')
|
|
|
|
|
|
class IosGPS(GPS):
|
|
def _configure(self):
|
|
if not hasattr(self, '_location_manager'):
|
|
self._location_manager = CLLocationManager.alloc().init()
|
|
|
|
def _start(self, **kwargs):
|
|
self._location_manager.delegate = self
|
|
|
|
self._location_manager.requestWhenInUseAuthorization()
|
|
# NSLocationWhenInUseUsageDescription key must exist in Info.plist
|
|
# file. When the authorization prompt is displayed your app goes
|
|
# into pause mode and if your app doesn't support background mode
|
|
# it will crash.
|
|
self._location_manager.startUpdatingLocation()
|
|
|
|
def _stop(self):
|
|
self._location_manager.stopUpdatingLocation()
|
|
|
|
@protocol('CLLocationManagerDelegate')
|
|
def locationManager_didChangeAuthorizationStatus_(self, manager, status):
|
|
if self.on_status:
|
|
s_status = ''
|
|
provider_status = ''
|
|
provider = 'standard-ios-provider'
|
|
if status == 0:
|
|
provider_status = 'provider-disabled'
|
|
s_status = 'notDetermined'
|
|
elif status == 1:
|
|
provider_status = 'provider-enabled'
|
|
s_status = 'restricted'
|
|
elif status == 2:
|
|
provider_status = 'provider-disabled'
|
|
s_status = 'denied'
|
|
elif status == 3:
|
|
provider_status = 'provider-enabled'
|
|
s_status = 'authorizedAlways'
|
|
elif status == 4:
|
|
provider_status = 'provider-enabled'
|
|
s_status = 'authorizedWhenInUse'
|
|
self.on_status(provider_status, '{}: {}'.format(
|
|
provider, s_status))
|
|
|
|
@protocol('CLLocationManagerDelegate')
|
|
def locationManager_didUpdateLocations_(self, manager, locations):
|
|
location = manager.location
|
|
|
|
description = location.description.UTF8String()
|
|
split_description = description.split('<')[-1].split('>')[0].split(',')
|
|
|
|
lat, lon = [float(coord) for coord in split_description]
|
|
acc = float(description.split(' +/- ')[-1].split('m ')[0])
|
|
|
|
speed = location.speed
|
|
altitude = location.altitude
|
|
course = location.course
|
|
|
|
self.on_location(
|
|
lat=lat,
|
|
lon=lon,
|
|
speed=speed,
|
|
bearing=course,
|
|
altitude=altitude,
|
|
accuracy=acc)
|
|
|
|
|
|
def instance():
|
|
return IosGPS()
|