为了账号安全,请及时绑定邮箱和手机立即绑定

锁定解锁事件iphone

锁定解锁事件iphone

LEATH 2019-07-30 16:03:39
锁定解锁事件iphone如何在iPhone上检测锁定/解锁事件?假设它只能用于越狱设备,你能指出我正确的API吗?通过锁定事件,我的意思是显示或隐藏锁定屏幕(可能需要密码才能解锁)。
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

回答:

应用程序将在各种情况下调用活动调用...并且从我的所有测试中,即使您的应用程序在后台运行时保持清醒状态,也无法确定屏幕是否已锁定(CPU速度未报告,总线速度保持不变,mach_time denom / numer不会改变)......

但是,当设备锁定时,Apple似乎关闭了加速计... 在屏幕锁定时启用iPhone加速计 (在iPhone 4上测试iOS4.2有此行为)

从而...

在您的应用程序委托中:

- (void)applicationWillResignActive:(UIApplication *)application{
    NSLog(@"STATUS - Application will Resign Active");
    // Start checking the accelerometer (while we are in the background)
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];
    [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1]; // Ping every second
    _notActiveTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(deviceDidLock) userInfo:nil repeats:NO]; // 2 seconds for wiggle}//Deprecated in iOS5- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
    NSLog(@"STATUS - Update from accelerometer");
    [_notActiveTimer invalidate];
    _notActiveTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(deviceDidLock) userInfo:nil repeats:NO];}- (void)deviceDidLock{
    NSLog(@"STATUS - Device locked!");
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    _notActiveTimer = nil;}- (void)applicationDidBecomeActive:(UIApplication *)application{
    NSLog(@"STATUS - Application did become active");
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    [_notActiveTimer invalidate];
    _notActiveTimer = nil;}

我知道......这是一种黑客攻击,但到目前为止,它对我来说就像是一种魅力。如果您发现任何阻止其工作的问题,请更新。


查看完整回答
反对 回复 2019-07-30
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

有一种更漂亮的方式可以分辨任务切换和屏幕锁定发起的applicationWillResignActive:回调,甚至不涉及无记录功能,如加速度计状态。

当应用程序移动到后台时,应用程序委托首先发送一个applicationWillResignActive:,然后发送一个applicationDidEnterBackground:。当通过按下“锁定”按钮或来电来中断应用程序时,不会调用后一种方法。我们可以使用此信息来区分这两种情况。

假设您希望screenLockActivated在屏幕被锁定时在方法中回调。这是魔术:

- (void)applicationWillResignActive:(UIApplication*)aApplication{
    [self performSelector:@selector(screenLockActivated)
               withObject:nil
               afterDelay:0];}- (void)applicationDidEnterBackground:(UIApplication*)aApplication{
    [NSObject cancelPreviousPerformRequestsWithTarget:self];}- (void)screenLockActivated{
    NSLog(@"yaay");}

说明:

默认情况下,我们假设每次调用applicationWillResignActive:都是因为活动 - >非活动状态转换(如锁定屏幕时),但我们慷慨地让系统通过延迟在超时(在这种情况下,单个runloop循环)中证明相反打电话给screenLockActivated。如果屏幕被锁定,系统将完成当前的runloop循环,而不会触及任何其他委托方法。但是,如果这是一个active-> background状态转换,它也会applicationDidEnterBackground:在循环结束之前调用,这允许我们从那里简单地取消先前调度的请求,从而防止它在不应该被调用时被调用。

请享用!


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 712 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信