强制锁定屏幕

6

我正在尝试在一定时间后自动锁定设备。唯一能实现这个功能的方法是这样做:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    UIApplication.sharedApplication().idleTimerDisabled = true

    NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: "lockScreen", userInfo: nil, repeats: false)

    return true
}

func lockScreen() {
    print("locking screen")
    UIApplication.sharedApplication().idleTimerDisabled = false
}

然而它似乎不起作用。有其他的替代方案吗?市场上有一个叫做CellControl的应用程序可以做到这一点,所以我知道这是可能的,只是似乎无法弄清楚如何实现。
我还尝试过从this answer中使用obj-c。
这是他们的应用程序工作的片段,可以从公共应用商店下载。你可以看到,一旦我按下主页按钮并退出应用程序,他们就会强制锁定屏幕。

enter image description here

我也见过使用私有框架的情况,这肯定会被拒绝:

char *gsDylib = "/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices";
void *handle = dlopen(gsDylib, RTLD_NOW);
if (handle) {
  BOOL locked = FALSE;
  void (*_GSEventLockDevice)() = dlsym(handle, "GSEventLockDevice");
  if (_GSEventLockDevice)  {
    _GSEventLockDevice();
    //...
  }
  dlclose(handle);
  //...
}

当第一次启动应用程序时,它们会请求以下权限:

  • 即使不使用应用程序,也可向蓝牙设备提供数据
  • 发送推送通知
  • 访问联系人
  • 访问麦克风
  • 即使不使用应用程序,也可使用位置

我不知道这些框架中是否有任何一个可以让您锁定屏幕,但也许可以?...


快速更新:

经过更多的研究和JBA的大力帮助,我离解决方案越来越近了。看起来Cell Control充当了键盘外设,使他们能够发送锁定屏幕的命令。所以我买了一个蓝牙键盘去尝试,结果很不错。我能够用它来锁定和解锁我的设备。因此,我将键盘与我的Mac(通过蓝牙)连接以嗅探数据包。当在键盘上按下锁定按钮时,就会记录此事件:

enter image description here

据我所知(我绝不是这方面的专家),触发锁定的方法是发送一个鼠标事件,所有事件数据都被清零。同时没有按下任何按钮。我的目标是在Arduino上复制这个过程...还有更多工作要做。

我本来想说苹果不可能允许这个进入应用商店,但显然他们会。我猜这是因为它违反了他们的指南,使用了必须要私有API才能实现的功能。 - Chris
2
要么他们在构建产品之前与苹果达成了协议,以确保其通过审核。如果您找不到所需的答案,您可以通过开启几个技术工单来向苹果工程师提问。 - Chris
@vishy 是的,我联系了苹果开发者支持,他们表示没有支持的方法来实现这个。 - random
@vishy 是的,我有测试过,但是无法立即告诉你执行时间。 - random
@random 你有没有找到关于发送给设备以关闭电源的HID键盘事件的结构/数据的更多有用信息? - JBA
显示剩余5条评论
4个回答

10
如果你想知道他们是如何做到这一点的:
手机与其硬件内置的蓝牙设备配对。如果你进一步检查,你会发现这个蓝牙设备具有“键盘”配置文件:只需在手机上检查,你会看到它被识别为无线键盘...很有趣...你看到答案来了吗?...
你说对了!该设备向手机发送锁屏命令键,就像它是一个连接的蓝牙键盘一样(是的,因为蓝牙键盘实际上可以这样做)。然后你就可以了。
===编辑===
请查看此HID使用表,您将找到一些有用的命令代码。我们正在寻找的密钥代码很可能是 0x81 0x82

1
@random 这些发现对我非常有帮助。使用树莓派(控制器)锁定屏幕的操作与您建议的程序调用HID中断相同。我在控制器端使用Python和JS,如何以编程方式调用HID中断?任何建议都将非常有帮助! - swathy krishnan
@swathykrishnan 看起来只是一个没有按键的空白鼠标点击,X、Y、滚动都为零。如果你能让它工作,请告诉我! - random
回答中添加了一个编辑:这种电源关闭(和开启)是由“媒体类型”键命令的,但这仍然是一个常见的键,而不是一个棘手的苹果特定信号。因此,只要您可以发送所需的HID命令,就非常容易触发电源的开启/关闭。 - JBA
@JBA 感谢您的帮助。但是它仍然无法正常工作。 - swathy krishnan
@random 零值输出是在按键事件之后发生的释放键事件。因此最好您嗅探并分享按下事件。 - ABHIJITH KINI
显示剩余14条评论

4
在联系了苹果开发者技术支持之后,没有支持的方法可以实现此功能而不使用私有API。使用这些API将导致您的应用程序被拒绝。
我猜CellControl能够通过审核是因为他们唯一使用此功能的方式是如果您在车辆中安装了他们的硬件,设备与其配对并开始驾驶。我猜在应用程序审核期间,苹果没有购买他们的任何设备并进行测试。虽然我一直认为他们会扫描二进制文件以检查未记录的API使用情况,但这似乎是错误的。
如@Chris所提到的另一个可能性是他们在开始开发之前可能已经与苹果达成协议。虽然这似乎不太可能,但确实有可能。
以下是来自苹果开发者技术支持的一些摘录:
“感谢您联系苹果开发者技术支持(DTS)。我们的工程师已经审查了您的请求,并得出结论:在当前正在运输的系统配置下,没有支持的方法可以实现所需的功能。”
“你好,开发者技术支持无法代表你反向工程其他开发者的软件。看起来做着看似不可能的事情的应用程序通常属于以下两类:它们正在违反规则,而应用审核尚未发现它们(A),或者他们的营销材料在经济上与真相不符(B)。我可以说没有支持的方法从你的iOS应用程序锁定设备。”
希望这能帮助将来的某个人。

正确,假设您使用内部应用程序逻辑来完成此任务...当您探索上述提到的解决方案时,这是可能的。 - GoreDefex

0
经过长时间的研究,我发现没有办法通过编程来锁定屏幕。但是我找到了两种思路: 1. 对iOS设备进行越狱; 2. 使用MDM技术来实现。但这将是一项巨大的工作。我们需要建立一个服务器来处理与iOS设备的通信。

0

iOS 16.4提供了一种更简单的方法,通过调用锁定设备的快捷方式来实现。

这并不完美,因为快捷方式应用程序会短暂地打开,并且看起来像是一个变通方法,但至少它存在:

以编程方式锁定iOS设备


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