【问题标题】:iOS, locking the device from codeiOS,从代码中锁定设备
【发布时间】:2016-12-18 03:38:35
【问题描述】:

出于测试目的(制作本地通知的屏幕截图),我需要能够从代码(测试代码或应用程序代码)中锁定设备(模拟器)。 我从这里(GSEventLockDevice)查看了几个答案,但它们已经很老了,对我不起作用

【问题讨论】:

  • 您可以创建一个 Apple 脚本来执行此操作并在您的代码中使用它。 (不是来自 iOS,但由于它是一个模拟器,您可以在项目代码之外运行它)apple.stackexchange.com/questions/135728/…
  • 我希望它成为我的测试套件的一部分,这可能吗?
  • 据我所知,从 iOS 项目运行苹果脚本不是一个选项。您可以创建一个运行 xcodebuild 的 shell 文件,该文件将运行您的测试套件,同时还运行一个 Apple 脚本。 developer.apple.com/library/prerelease/content/documentation/…
  • 这不是快车道快照的一部分吗?
  • 您是在寻找代码,还是在寻找锁定模拟器的方法(cmd+L)?

标签: ios xctest


【解决方案1】:

XCUIDevice 中有一个私有方法,所以你可以使用它来锁定设备/模拟器。

Swift 3 示例:

import XCTest

class LockTests: XCTestCase {
  func testExample() {
    XCUIDevice.shared().perform(NSSelectorFromString("pressLockButton"))

    let localNotification = UILocalNotification()
    localNotification.fireDate = Date(timeIntervalSinceNow: 2)
    localNotification.alertBody = "This is local notification"
    localNotification.timeZone = NSTimeZone.local
    localNotification.category = "Message"
    UIApplication.shared.scheduleLocalNotification(localNotification)
  }
}

并且会收到这样的东西:

我对您使用的快照工具没有经验,但您需要知道切换到锁定状态需要时间,因此在创建快照之前等待一段时间可能会很有用(您可以使用这样的代码):

let date = Date(timeIntervalSinceNow: 3)
while date.timeIntervalSinceNow > 0 {
  CFRunLoopRunInMode(CFRunLoopMode.defaultMode, 0.1, true)
}

另外,您可以在测试结束时通过调用返回 SpringBoard(仅限 iOS 10):

XCUIDevice.shared().press(.home)

希望对你有帮助!

【讨论】:

  • 仅供参考,我使用了 XCUIDevice.sharedDevice.performSelector("pressLockButton")
  • 选择器有误,将更新我的答案。谢谢!
  • 谢谢,看起来完全一样。
  • XCUIDevice.shared().perform(NSSelectorFromString("pressLockButton")) 帮助我锁定手机。另一方面,它还有助于使来电静音。
  • 只是出于好奇,这样锁定后我们可以通过XCTest/Swift解锁设备吗? @RomanErmolov
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多