├── README.md ├── SwiftLiverpool.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── SwiftLiverpool └── main.swift └── example.png /README.md: -------------------------------------------------------------------------------- 1 | # SwiftLiverpool 2 | 3 | ![Output](https://raw.githubusercontent.com/slyd0g/SwiftLiverpool/main/example.png) 4 | 5 | ## Blogpost 6 | 7 | https://medium.com/@slyd0g/where-in-the-world-is-carmen-sandiego-abusing-location-services-on-macos-10e9f4eefb71 8 | 9 | ## Description 10 | 11 | This tool leverages the CoreLocation API on macOS to enumerate Location Services data. You need to enable "Location Services" permission for the tool for this to work. 12 | 13 | ## Usage 14 | - Analyze availability of Location Services and dump location, speed, and course data if available 15 | - ```./SwiftLiverpool``` 16 | 17 | ## References 18 | - https://developer.apple.com/documentation/corelocation/cllocationmanager 19 | -------------------------------------------------------------------------------- /SwiftLiverpool.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3F93F17626D6E17D00EA536C /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F93F17526D6E17D00EA536C /* main.swift */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXCopyFilesBuildPhase section */ 14 | 3F93F17026D6E17D00EA536C /* CopyFiles */ = { 15 | isa = PBXCopyFilesBuildPhase; 16 | buildActionMask = 2147483647; 17 | dstPath = /usr/share/man/man1/; 18 | dstSubfolderSpec = 0; 19 | files = ( 20 | ); 21 | runOnlyForDeploymentPostprocessing = 1; 22 | }; 23 | /* End PBXCopyFilesBuildPhase section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | 3F93F17226D6E17D00EA536C /* SwiftLiverpool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SwiftLiverpool; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | 3F93F17526D6E17D00EA536C /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | 3F93F16F26D6E17D00EA536C /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | 3F93F16926D6E17D00EA536C = { 42 | isa = PBXGroup; 43 | children = ( 44 | 3F93F17426D6E17D00EA536C /* SwiftLiverpool */, 45 | 3F93F17326D6E17D00EA536C /* Products */, 46 | ); 47 | sourceTree = ""; 48 | }; 49 | 3F93F17326D6E17D00EA536C /* Products */ = { 50 | isa = PBXGroup; 51 | children = ( 52 | 3F93F17226D6E17D00EA536C /* SwiftLiverpool */, 53 | ); 54 | name = Products; 55 | sourceTree = ""; 56 | }; 57 | 3F93F17426D6E17D00EA536C /* SwiftLiverpool */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | 3F93F17526D6E17D00EA536C /* main.swift */, 61 | ); 62 | path = SwiftLiverpool; 63 | sourceTree = ""; 64 | }; 65 | /* End PBXGroup section */ 66 | 67 | /* Begin PBXNativeTarget section */ 68 | 3F93F17126D6E17D00EA536C /* SwiftLiverpool */ = { 69 | isa = PBXNativeTarget; 70 | buildConfigurationList = 3F93F17926D6E17D00EA536C /* Build configuration list for PBXNativeTarget "SwiftLiverpool" */; 71 | buildPhases = ( 72 | 3F93F16E26D6E17D00EA536C /* Sources */, 73 | 3F93F16F26D6E17D00EA536C /* Frameworks */, 74 | 3F93F17026D6E17D00EA536C /* CopyFiles */, 75 | ); 76 | buildRules = ( 77 | ); 78 | dependencies = ( 79 | ); 80 | name = SwiftLiverpool; 81 | productName = SwiftLiverpool; 82 | productReference = 3F93F17226D6E17D00EA536C /* SwiftLiverpool */; 83 | productType = "com.apple.product-type.tool"; 84 | }; 85 | /* End PBXNativeTarget section */ 86 | 87 | /* Begin PBXProject section */ 88 | 3F93F16A26D6E17D00EA536C /* Project object */ = { 89 | isa = PBXProject; 90 | attributes = { 91 | LastSwiftUpdateCheck = 1250; 92 | LastUpgradeCheck = 1250; 93 | TargetAttributes = { 94 | 3F93F17126D6E17D00EA536C = { 95 | CreatedOnToolsVersion = 12.5; 96 | }; 97 | }; 98 | }; 99 | buildConfigurationList = 3F93F16D26D6E17D00EA536C /* Build configuration list for PBXProject "SwiftLiverpool" */; 100 | compatibilityVersion = "Xcode 9.3"; 101 | developmentRegion = en; 102 | hasScannedForEncodings = 0; 103 | knownRegions = ( 104 | en, 105 | Base, 106 | ); 107 | mainGroup = 3F93F16926D6E17D00EA536C; 108 | productRefGroup = 3F93F17326D6E17D00EA536C /* Products */; 109 | projectDirPath = ""; 110 | projectRoot = ""; 111 | targets = ( 112 | 3F93F17126D6E17D00EA536C /* SwiftLiverpool */, 113 | ); 114 | }; 115 | /* End PBXProject section */ 116 | 117 | /* Begin PBXSourcesBuildPhase section */ 118 | 3F93F16E26D6E17D00EA536C /* Sources */ = { 119 | isa = PBXSourcesBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | 3F93F17626D6E17D00EA536C /* main.swift in Sources */, 123 | ); 124 | runOnlyForDeploymentPostprocessing = 0; 125 | }; 126 | /* End PBXSourcesBuildPhase section */ 127 | 128 | /* Begin XCBuildConfiguration section */ 129 | 3F93F17726D6E17D00EA536C /* Debug */ = { 130 | isa = XCBuildConfiguration; 131 | buildSettings = { 132 | ALWAYS_SEARCH_USER_PATHS = NO; 133 | CLANG_ANALYZER_NONNULL = YES; 134 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 135 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 136 | CLANG_CXX_LIBRARY = "libc++"; 137 | CLANG_ENABLE_MODULES = YES; 138 | CLANG_ENABLE_OBJC_ARC = YES; 139 | CLANG_ENABLE_OBJC_WEAK = YES; 140 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 141 | CLANG_WARN_BOOL_CONVERSION = YES; 142 | CLANG_WARN_COMMA = YES; 143 | CLANG_WARN_CONSTANT_CONVERSION = YES; 144 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 145 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 146 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 147 | CLANG_WARN_EMPTY_BODY = YES; 148 | CLANG_WARN_ENUM_CONVERSION = YES; 149 | CLANG_WARN_INFINITE_RECURSION = YES; 150 | CLANG_WARN_INT_CONVERSION = YES; 151 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 152 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 153 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 154 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 155 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 156 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 157 | CLANG_WARN_STRICT_PROTOTYPES = YES; 158 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 159 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 160 | CLANG_WARN_UNREACHABLE_CODE = YES; 161 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 162 | COPY_PHASE_STRIP = NO; 163 | DEBUG_INFORMATION_FORMAT = dwarf; 164 | ENABLE_STRICT_OBJC_MSGSEND = YES; 165 | ENABLE_TESTABILITY = YES; 166 | GCC_C_LANGUAGE_STANDARD = gnu11; 167 | GCC_DYNAMIC_NO_PIC = NO; 168 | GCC_NO_COMMON_BLOCKS = YES; 169 | GCC_OPTIMIZATION_LEVEL = 0; 170 | GCC_PREPROCESSOR_DEFINITIONS = ( 171 | "DEBUG=1", 172 | "$(inherited)", 173 | ); 174 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 175 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 176 | GCC_WARN_UNDECLARED_SELECTOR = YES; 177 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 178 | GCC_WARN_UNUSED_FUNCTION = YES; 179 | GCC_WARN_UNUSED_VARIABLE = YES; 180 | MACOSX_DEPLOYMENT_TARGET = 11.3; 181 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 182 | MTL_FAST_MATH = YES; 183 | ONLY_ACTIVE_ARCH = YES; 184 | SDKROOT = macosx; 185 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 186 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 187 | }; 188 | name = Debug; 189 | }; 190 | 3F93F17826D6E17D00EA536C /* Release */ = { 191 | isa = XCBuildConfiguration; 192 | buildSettings = { 193 | ALWAYS_SEARCH_USER_PATHS = NO; 194 | CLANG_ANALYZER_NONNULL = YES; 195 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 196 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 197 | CLANG_CXX_LIBRARY = "libc++"; 198 | CLANG_ENABLE_MODULES = YES; 199 | CLANG_ENABLE_OBJC_ARC = YES; 200 | CLANG_ENABLE_OBJC_WEAK = YES; 201 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 202 | CLANG_WARN_BOOL_CONVERSION = YES; 203 | CLANG_WARN_COMMA = YES; 204 | CLANG_WARN_CONSTANT_CONVERSION = YES; 205 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 206 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 207 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 208 | CLANG_WARN_EMPTY_BODY = YES; 209 | CLANG_WARN_ENUM_CONVERSION = YES; 210 | CLANG_WARN_INFINITE_RECURSION = YES; 211 | CLANG_WARN_INT_CONVERSION = YES; 212 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 213 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 214 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 215 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 216 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 217 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 218 | CLANG_WARN_STRICT_PROTOTYPES = YES; 219 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 220 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 221 | CLANG_WARN_UNREACHABLE_CODE = YES; 222 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 223 | COPY_PHASE_STRIP = NO; 224 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 225 | ENABLE_NS_ASSERTIONS = NO; 226 | ENABLE_STRICT_OBJC_MSGSEND = YES; 227 | GCC_C_LANGUAGE_STANDARD = gnu11; 228 | GCC_NO_COMMON_BLOCKS = YES; 229 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 230 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 231 | GCC_WARN_UNDECLARED_SELECTOR = YES; 232 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 233 | GCC_WARN_UNUSED_FUNCTION = YES; 234 | GCC_WARN_UNUSED_VARIABLE = YES; 235 | MACOSX_DEPLOYMENT_TARGET = 11.3; 236 | MTL_ENABLE_DEBUG_INFO = NO; 237 | MTL_FAST_MATH = YES; 238 | SDKROOT = macosx; 239 | SWIFT_COMPILATION_MODE = wholemodule; 240 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 241 | }; 242 | name = Release; 243 | }; 244 | 3F93F17A26D6E17D00EA536C /* Debug */ = { 245 | isa = XCBuildConfiguration; 246 | buildSettings = { 247 | CODE_SIGN_STYLE = Automatic; 248 | PRODUCT_NAME = "$(TARGET_NAME)"; 249 | SWIFT_VERSION = 5.0; 250 | }; 251 | name = Debug; 252 | }; 253 | 3F93F17B26D6E17D00EA536C /* Release */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | CODE_SIGN_STYLE = Automatic; 257 | PRODUCT_NAME = "$(TARGET_NAME)"; 258 | SWIFT_VERSION = 5.0; 259 | }; 260 | name = Release; 261 | }; 262 | /* End XCBuildConfiguration section */ 263 | 264 | /* Begin XCConfigurationList section */ 265 | 3F93F16D26D6E17D00EA536C /* Build configuration list for PBXProject "SwiftLiverpool" */ = { 266 | isa = XCConfigurationList; 267 | buildConfigurations = ( 268 | 3F93F17726D6E17D00EA536C /* Debug */, 269 | 3F93F17826D6E17D00EA536C /* Release */, 270 | ); 271 | defaultConfigurationIsVisible = 0; 272 | defaultConfigurationName = Release; 273 | }; 274 | 3F93F17926D6E17D00EA536C /* Build configuration list for PBXNativeTarget "SwiftLiverpool" */ = { 275 | isa = XCConfigurationList; 276 | buildConfigurations = ( 277 | 3F93F17A26D6E17D00EA536C /* Debug */, 278 | 3F93F17B26D6E17D00EA536C /* Release */, 279 | ); 280 | defaultConfigurationIsVisible = 0; 281 | defaultConfigurationName = Release; 282 | }; 283 | /* End XCConfigurationList section */ 284 | }; 285 | rootObject = 3F93F16A26D6E17D00EA536C /* Project object */; 286 | } 287 | -------------------------------------------------------------------------------- /SwiftLiverpool.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftLiverpool.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SwiftLiverpool/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // SwiftLiverpool 4 | // 5 | // Created by Justin Bui on 8/25/21. 6 | // 7 | 8 | import Foundation 9 | import CoreLocation 10 | 11 | func getLocation() { 12 | let locationManager = CLLocationManager() 13 | locationManager.startUpdatingLocation() 14 | 15 | // Get location attributes 16 | let latitude = String((locationManager.location?.coordinate.latitude)!) 17 | let longitude = String((locationManager.location?.coordinate.longitude)!) 18 | let altitude = String((locationManager.location?.altitude)!) 19 | let horizontalAccuracy = String((locationManager.location?.horizontalAccuracy)!) 20 | let verticalAccuracy = String((locationManager.location?.verticalAccuracy)!) 21 | 22 | // Get floor level 23 | var level = 0 24 | if (locationManager.location?.floor != nil) { 25 | // https://stackoverflow.com/questions/60837128/clfloor-returns-level-2146959360, it's a bug ... 26 | if (locationManager.location?.floor!.level != 2146959360) { 27 | level = (locationManager.location?.floor!.level)! 28 | } 29 | } 30 | 31 | // Get timestamp 32 | let timestamp = locationManager.location?.timestamp 33 | let dateFormatter = DateFormatter() 34 | dateFormatter.dateFormat = "MMM d, YYYY, HH:mm:ss" 35 | let formattedTimestamp = dateFormatter.string(from: timestamp!) 36 | 37 | print("[*] Getting location data ...") 38 | print(" [+] Timestamp:", formattedTimestamp) 39 | print(" [+] Latitude, Longitude:", latitude, ",", longitude) 40 | print(" [+] Horizontal Accuracy:", horizontalAccuracy, "meter(s)") 41 | print(" [+] Altitude:", altitude, "meter(s)") 42 | print(" [+] Vertical Accuracy:", verticalAccuracy, "meter(s)") 43 | print(" [+] Floor:", level) 44 | 45 | // Get speed and course information 46 | print("[*] Getting speed and course information ...") 47 | let speed = String((locationManager.location?.speed)!) 48 | let speedAccuracy = String((locationManager.location?.speedAccuracy)!) 49 | let course = String((locationManager.location?.course)!) 50 | let courseAccuracy = String((locationManager.location?.courseAccuracy)!) 51 | if locationManager.location?.speed ?? -1 > 0 { 52 | print(" [+] Speed:", speed, "meters/second") 53 | } 54 | else { 55 | print(" [-] Speed could not be obtained") 56 | } 57 | if locationManager.location?.speedAccuracy ?? -1 > 0 { 58 | print(" [+] Speed Accuracy:", speedAccuracy, "meters/second") 59 | } 60 | else { 61 | print(" [-] Speed Accuracy could not be obtained") 62 | } 63 | if locationManager.location?.course ?? -1 > 0 { 64 | print(" [+] Course:", course, "° relative to due north") 65 | } 66 | else { 67 | print(" [-] Course could not be obtained") 68 | } 69 | if locationManager.location?.courseAccuracy ?? -1 > 0 { 70 | print(" [+] Course Accuracy:", courseAccuracy, "°") 71 | } 72 | else { 73 | print(" [-] Course Accuracy could not be obtained") 74 | } 75 | } 76 | 77 | func checkAvailability() -> Bool { 78 | var status = false 79 | let lm = CLLocationManager() 80 | lm.requestWhenInUseAuthorization() 81 | print("[*] Determining availability of Location Services ...") 82 | sleep(1) // I'm sorry for this monstrosity, this terror, this horrible practice, this failure to find the root cause, it worked in XCode while being debugged and while analyzing with Console.app and this "fixed" my race condition 83 | 84 | if (lm.locationServicesEnabled) { 85 | print(" [+] Location services is enabled on this device") 86 | } 87 | else { 88 | print(" [-] Location services is disabled on this device") 89 | } 90 | 91 | let authStatus = lm.authorizationStatus 92 | switch authStatus { 93 | case .authorizedAlways: 94 | print(" [+] The user authorized the app to start location services at any time") 95 | case .denied: 96 | print(" [-] The user denied the use of location services for the app or they are disabled globally in Settings") 97 | case .notDetermined: 98 | print(" [-] The user has not chosen whether the app can use location services") 99 | case .restricted: 100 | print(" [-] The app is not authorized to use location services.") 101 | default: 102 | print(" [-] SwiftLiverpool was unable to determine authorizationStatus") 103 | } 104 | 105 | if authStatus == .authorizedAlways { 106 | status = true 107 | if (lm.accuracyAuthorization == CLAccuracyAuthorization.fullAccuracy) { 108 | print(" [+] The application has access to location data with full accuracy") 109 | } 110 | else { 111 | print(" [-] The application has access to location data with reduced accuracy") 112 | } 113 | } 114 | 115 | if (lm.headingAvailable) { 116 | print(" [+] Location manager can generate heading-related events") 117 | } 118 | else { 119 | print(" [-] Location manager cannot generate heading-related events") 120 | } 121 | 122 | if status { 123 | getLocation() 124 | } 125 | 126 | return status 127 | } 128 | 129 | func banner() 130 | { 131 | print(""" 132 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 133 | @@@@@@@@@@@@@@@(*(#/*/#/((///##%#(//(#(*#@@@@@@@@@@@@@@ 134 | @@@@@@@@@@@(,,,*//**,**//(/#(#*/####(/#%%%%(@@@@@@@@@@@ 135 | @@@@@@@@(/#**,,,,**/**,/(###(/*//*###%%%%%%%%&/&@@@@@@@ 136 | @@@@@@.####*,,. .,*//*,,****//((((##%%%%%%%&&#.@@@@@ 137 | @@@@*(###((..... ...../,/*****(((######%%%%%%%&&/&@@@ 138 | @@%/####((. . .....,,,,/(##########%%%%%%%%&&%#@@ 139 | @@#####((((. .......,/(((#########%%%%%%%%%&&&% @ 140 | @%####((((((,*. ///////*/(((#########%%%%%%%%%%&&%#* 141 | @(####(((((////.. .*//..//((**(((#######%%%%%%%%%%&&%%, 142 | *#####(((((///////***....*(((((((#######%%%%%%%%%%%&%%( 143 | (#####((((((/////////////***/*,*,***/####%%%%%%%%&&&%%# 144 | *######(((((((//////////((((/,,,******///#%%%%%%%%%&&%# 145 | @/######(((((((((((((((((((,,*****/////(((((##%%&&&&%%. 146 | @/########((((((((((((((((((,*****////////((###%&&&%%#* 147 | @@############((((((((((#####/,,***//////((##%%%&&%%#&@ 148 | @@@*############################***////((((#%%%%%%%#(@@ 149 | @@@@*/%########################/*////(((%%%%&%%%%%.@@@@ 150 | @@@@@@/(%%#####################////((#%%%%&&&%%%*&@@@@@ 151 | @@@@@@@@@(%%%%%%%%%%%%%%%%%%%#(((#%%%%%&&&&&&##@@@@@@@@ 152 | @@@@@@@@@@@@,#%%%%%%%%%%%%%%%##%%%%&&&&&&%(*@@@@@@@@@@@ 153 | @@@@@@@@@@@@@@@@(/(%%%%%%%%%%&&&&&&&%(%%@@@@@@@@@@@@@@@ 154 | """) 155 | print("") 156 | print("|~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*|") 157 | print("|~*~*~*~*~*~* SwiftLiverpool by @slyd0g ~*~*~*~*~*~*~|") 158 | print("|~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*|") 159 | print("| Enumerate Location Services using CoreLocation API |") 160 | print("|~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*|") 161 | } 162 | 163 | banner() 164 | checkAvailability() 165 | -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slyd0g/SwiftLiverpool/87f335e217cdccf9e225d4fcedd7ad222f954575/example.png --------------------------------------------------------------------------------