|  | // | 
        
          |  | //  Springboard.swift | 
        
          |  | //  https://gist.github.com/KoCMoHaBTa/5d2cecfc17db5f3944bc98bcd6fcde55 | 
        
          |  | // | 
        
          |  | //  Created by Milen Halachev on 2/15/17. | 
        
          |  | // | 
        
          |  | //    MIT License | 
        
          |  | // | 
        
          |  | //    Copyright (c) 2017 Milen Halachev | 
        
          |  | // | 
        
          |  | //    Permission is hereby granted, free of charge, to any person obtaining a copy | 
        
          |  | //    of this software and associated documentation files (the "Software"), to deal | 
        
          |  | //    in the Software without restriction, including without limitation the rights | 
        
          |  | //    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
        
          |  | //    copies of the Software, and to permit persons to whom the Software is | 
        
          |  | //    furnished to do so, subject to the following conditions: | 
        
          |  | // | 
        
          |  | //    The above copyright notice and this permission notice shall be included in all | 
        
          |  | //    copies or substantial portions of the Software. | 
        
          |  | // | 
        
          |  | //    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
        
          |  | //    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
        
          |  | //    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
        
          |  | //    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
        
          |  | //    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
        
          |  | //    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
        
          |  | //    SOFTWARE. | 
        
          |  |  | 
        
          |  | import Foundation | 
        
          |  | import XCTest | 
        
          |  |  | 
        
          |  | class Springboard { | 
        
          |  |  | 
        
          |  | static let shared = Springboard() | 
        
          |  |  | 
        
          |  | let springboard = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard")! | 
        
          |  | let settings = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.Preferences")! | 
        
          |  |  | 
        
          |  | func deleteApp(withName name: String) { | 
        
          |  |  | 
        
          |  | XCUIApplication().terminate() | 
        
          |  |  | 
        
          |  | let springboard = self.springboard | 
        
          |  | springboard.resolve() | 
        
          |  |  | 
        
          |  | let icon = springboard.icons[name] | 
        
          |  | if icon.exists { | 
        
          |  |  | 
        
          |  | let iconFrame = icon.frame | 
        
          |  | let springboardFrame = springboard.frame | 
        
          |  |  | 
        
          |  | //Tap & Hold the app icon in order to go to edit mode | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | icon.press(forDuration: 1.3) | 
        
          |  |  | 
        
          |  | //Tap the little "X" button at approximately where it is. The X is not exposed directly | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | springboard.coordinate(withNormalizedOffset: CGVector(dx: (iconFrame.minX + 3) / springboardFrame.maxX, dy: (iconFrame.minY + 3) / springboardFrame.maxY)).tap() | 
        
          |  |  | 
        
          |  | //tap the delete alert button | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | springboard.alerts.buttons["Delete"].tap() | 
        
          |  | } | 
        
          |  |  | 
        
          |  | //Press home once make the icons stop wiggling | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | XCUIDevice.shared.press(.home) | 
        
          |  | } | 
        
          |  |  | 
        
          |  | func resetLocationAndPrivacySettings() { | 
        
          |  |  | 
        
          |  | XCUIApplication().terminate() | 
        
          |  |  | 
        
          |  | let springboard = self.springboard | 
        
          |  | springboard.resolve() | 
        
          |  |  | 
        
          |  | let settingsIcon = springboard.icons["Settings"] | 
        
          |  | if settingsIcon.exists { | 
        
          |  |  | 
        
          |  | //Press home button twise slowly in order to go to the first page of the springboard | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | XCUIDevice.shared.press(.home) | 
        
          |  |  | 
        
          |  | //Press home button twise slowly in order to go to the first page of the springboard | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | XCUIDevice.shared.press(.home) | 
        
          |  |  | 
        
          |  | //tap the settings icon | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | settingsIcon.tap() | 
        
          |  |  | 
        
          |  | let settings = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.Preferences")! | 
        
          |  |  | 
        
          |  | //go to `General` -> `Reset` and tap `Reset Location & Privacy` | 
        
          |  | settings.tables.staticTexts["General"].tap() | 
        
          |  | settings.tables.staticTexts["Reset"].tap() | 
        
          |  | settings.tables.staticTexts["Reset Location & Privacy"].tap() | 
        
          |  |  | 
        
          |  | //tap the `Reset Warnings` button | 
        
          |  | Thread.sleep(forTimeInterval: 0.5) | 
        
          |  | settings.buttons["Reset Warnings"].tap() | 
        
          |  | settings.terminate() | 
        
          |  | } | 
        
          |  | } | 
        
          |  | } | 
  
I have needed to increase the offset to 5 to find X button.
let vector = CGVector(dx: (iconFrame.minX + 5) / springboardFrame.maxX, dy: (iconFrame.minY + 5) / springboardFrame.maxY)