|
// |
|
// 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() |
|
} |
|
} |
|
} |
appDelete only works in portrait orientation. To avoid this change the orientation to portrait by setting: XCUIDevice.shared().orientation = .portrait