iOS,如何通过代码锁定设备

12
为了测试目的(截取本地通知的屏幕截图),我需要能够从代码中锁定设备(模拟器)。我查看了这里的一些答案(GSEventLockDevice),但它们非常古老并且对我没有用。

据我所知,在iOS项目中运行Apple脚本脚本不是一个选项。您可以创建一个shell文件,该文件将运行xcodebuild以运行测试套件,并同时运行Apple脚本。https://developer.apple.com/library/prerelease/content/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/08-automation.html - Roy K
这不是快车道的快照的一部分吗? - Florian Burel
你是在寻找代码还是想要知道如何锁定模拟器(cmd+L)? - Michael
@FlorianBurel 是的,但“截取锁定模拟器的屏幕截图”不是 :) - kap
@Michael 专门从代码方面来说。 - kap
显示剩余5条评论
1个回答

10
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)
  }
}

你将会得到类似于这样的东西:

enter image description here

我对你所使用的快照工具没有经验,但是你需要知道进入锁定状态需要时间,因此在创建快照之前等待一段时间可能会很有用(你可以使用以下代码):

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

此外,你可以通过调用以下方法(仅适用于iOS 10)在测试结束后返回SpringBoard:

XCUIDevice.shared().press(.home)

希望能对你有所帮助!

1
只是提醒一下,我使用了XCUIDevice.sharedDevice.performSelector("pressLockButton")。 - kap
选择器方面有误,我会更新我的回答。谢谢! - Roman Ermolov
谢谢,正在寻找完全相同的东西。 - Muhammad Anum
XCUIDevice.shared().perform(NSSelectorFromString("pressLockButton")) 可以帮我锁定手机。顺便提一下,它还可以帮助静音来电。 - Jasmeet Singh
只是出于好奇,我们能否在这种方式下使用XCTest/Swift解锁设备?@RomanErmolov - pvd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接