以编程方式锁定和解锁iPhone屏幕

15

我该如何以编程的方式锁定和解锁iPhone主屏幕(即设备本身)?

9个回答

26

不可能。不过当你的应用程序在运行时,你可以“防止”你的手机锁屏。[UIApplication sharedApplication].idleTimerDisabled = YES 可以实现此功能。


“不可能”似乎并不正确(“不可能”和“未记录”之间有些微小的区别……) - The Paramagnetic Croissant

23

你可以通过在你的应用程序中调用GSEventLockDevice();来实现。这个函数可以在GraphicsServices.framework中找到。


17
@Mugunth,我并没有说这是一个公共API,我只是说它是可能的 - user529758
1
@H2CO3:在 iOS7 上它不能工作。你能告诉我有关 iOS7 的情况吗?我已经为此提出了一个问题(https://dev59.com/cnfZa4cB1Zd3GeqPUag5)。 - Bhavin
@Vin我做不到。我不使用iOS 7,而且由于这是私有API,它很可能会失效。也许其他私有函数可以实现相同的功能。或者只需要挂钩SpringBoard即可。 - user529758
@H2CO3:有点失望。我看到你在这里回答问题已经一年了,以为你会对这个问题有所回答。但没关系,谢谢你的回复。 :) - Bhavin
3
@Vin 我知道你的感受 :) 你看,我更愿意花时间购买最新的i设备,并深入研究顶级的iOS API和技术,而不是去上大学(在那里我们被迫参加“编程入门”课程,学习没有指针的C ++)。但不幸的是,这不是一个选择,我很少有时间进行iOS开发... :/ - user529758
GSEventLockDevice 只能锁定设备。如何解锁?只有使用私有 eAPI 才可能吗? - Maxim Shoustin

4

这个问题已经得到解决。你可以在Github上找到相关内容:https://github.com/neuroo/LockMeNow(适用于IOS 7以下版本)。

char*framework="/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices";
                void *handle= dlopen(framework, RTLD_NOW);
                if (handle)
                {

                  void (*GSEventLockDevice)() = dlsym(handle, "GSEventLockDevice");

                    if (GSEventLockDevice)
                    {

                        GSEventLockDevice();
                        NSLog(@"Phone is Locked");
                       //.........

                    }
                    dlclose(handle);

                }

2

可能可以使用未经记录的苹果功能(也许是GSEventLockDevice()?),但这肯定会导致应用商店自动拒绝。

苹果公司根本不希望任何人去玩弄这样的核心功能。


1
如果您想这样做,苹果将永远不会批准此操作,您的应用程序必须进行越狱。您可以通过在项目中调用私有框架来实现此操作。您可以使用GraphicsServices.framework

注意:

GraphicsServices.framework是一个私有框架。苹果将永远不会接受您的应用程序。通过调用GSEventLockDevice()方法,您可以轻松锁定或解锁设备。此GSEventLockDevice()位于GSEvent.h中。

我希望这可以帮助您。

如果您仍然遇到任何问题,请告诉我。


我已经成功完成了这个,但在锁定手机之前如何设置或更改密码呢?先谢谢了。 - M.Shuaib Imran
你是说你做到了?它已经被App Store接受了? - mtasic85

0

现在有一个解决方法,如果你真的需要锁定手机,但我没有解锁它的方法...

使用iOS 16.4,你现在可以在快捷方式中使用"锁屏"操作。

因此,要以编程方式锁定设备,您可以要求您的应用程序启动一个将完成工作的快捷方式。

您可以使用一行代码导入所需的"锁屏"快捷方式:

openURL(URL(string: "https://www.icloud.com/shortcuts/da76168e73974887ae96480d435da049")!)

当用户导入所需的快捷方式后,您可以直接调用它:

func runLockscreenShortcut2() {
    if let url = URL(string: "shortcuts://run-shortcut?name=Lockscreen"), UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

唯一的缺点是,在设备锁定之前,快捷方式应用程序会短暂地出现,并且在解锁时会处于前台。

您可以在“锁定屏幕”操作之前为您的快捷方式添加一个“转到主屏幕”操作,这样当设备解锁时,快捷方式应用程序就不会处于前台,但这会减慢锁定过程。

远非完美,但目前是您的唯一选择...


0

基本上不可能,因为这可能是苹果专有的私有框架的一部分。有一些应用程序,例如虚假呼叫应用程序,利用“虚假”锁屏,但正如您所指出的那样,按下主页按钮会退出应用程序,使您的锁屏无效。


0

我不相信有一种方法可以实现这个目标。

但我相信有一种可能的方法是防止iPhone锁屏。然后,您可以构建一个视图来复制锁定解锁功能,并仍然控制手机。


-1
描述锁定和解锁。我会尝试使用一个开关,将视图属性设置为enabled = YES和enabled = NO。因此,您可以禁用所有的UIGestureRecognizers并“锁定”屏幕,如果这是您的意思。我在添加UIbuttons作为IBOutlet和IBAction后,也会对它们进行操作,使它们成为对象,并可以在属性级别上进行修改。我现在正在处理这个问题。我会发布我的发现。

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