天道酬勤,学无止境

How to detect screen lock/unlock in iOS Swift 4?

How can I detect screen lock/unlock in iOS? I am using Swift 4 (Xcode 9.2), and I have tried following links but they are not working for me.

  • IOS swift 3 detect failed screen unlock?
  • How can I detect screen lock/unlock events on the iPhone?
  • detect screen unlock events in IOS Swift
  • http://www.oodlestechnologies.com/blogs/How-to-detect-device-Lock-Unlock-status-in-iOS

I would be happy if someone can teach me. Thanks.

标签

评论

you can detect the screen lock/unlock by writing the following code in AppDelegate.m file:-

var notify_register_dispatch: int notify_token?
"com.apple.springboard.lockstate", notify_token, DispatchQueue.main
[uint64_t]
state = UINT64_MAX
notify_get_state(token, state)
if state == 0 {
    print("Unlocked")
}
else {
    print("Locked")
}

This code will help you to get the info regarding the screen lock/unlock in foreground

First of all we need to register our app for lock/unlock events notification, for this we are going to use Objective C which uses c api.

DeviceLockStatus.m

#import "DeviceLockStatus.h"
#import "notify.h"
#import "YourProjectName-Swift.h"

@implementation DeviceLockStatus

-(void)registerAppforDetectLockState {
 int notify_token;
    notify_register_dispatch("com.apple.springboard.lockstate", notify_token,dispatch_get_main_queue(), ^(int token) {
        uint64_t state = UINT64_MAX;
        notify_get_state(token, &state);

        DeviceStatus * myOb = [DeviceStatus new];  //DeviceStatus is .swift file

        if(state == 0) {
            myOb.unlocked;

        } else {
            myOb.locked;
        }

    });
}
@end

Here we have used three import statements. DeviceStatus.h as follows :

#ifndef DeviceLockStatus_h
#define DeviceLockStatus_h

#import  "foundation.h"
@interface DeviceLockStatus : NSObject

@property (strong, nonatomic) id someProperty;

-(void)registerAppforDetectLockState;

@end
#endif /* DeviceLockStatus_h */

In Swift Projects we need to use #import "DeviceLockStatus.h" in Bridging-Header.

"YourProjectName-Swift.h"

is used to used to call Swift methods from Objective C code, although this file is not visible but we need to import this file if we want to call swift methods from Objective C.

DeviceStatus.swift

import Foundation

 class DeviceStatus : NSObject {

     func locked(){
        print("device locked") // Handle Device Locked events here.
    }

     func unlocked(){
         print("device unlocked") //Handle Device Unlocked events here.
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 锁定解锁事件iPhone(Lock Unlock events iphone)
    问题 如何在iPhone上检测锁定/解锁事件? 假设只有越狱设备才有可能,您能指出我正确的API吗? 通过锁定事件,我的意思是显示或隐藏锁定屏幕(可能需要密码才能解锁)。 回答1 您可以使用Darwin通知来监听事件。 根据我在越狱的iOS 5.0.1 iPhone 4上进行的测试,我认为您可能需要以下事件之一: com.apple.springboard.lockstate com.apple.springboard.lockcomplete 注意:根据发布者对我在此处回答的类似问题的评论,这也可以在不越狱的手机上使用。 要使用此功能,请为以下事件注册(此事件仅注册上述第一个事件,但您也可以为lockcomplete添加观察者): CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center (void*)self, // observer (can be NULL) lockStateChanged, // callback CFSTR("com.apple.springboard.lockstate"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately)
  • 如何使用Swift检查iOS设备是否已锁定/解锁?(how to check if the iOS device is locked/unlocked using Swift?)
    问题 如何使用Swift检测锁定/未锁定的iOS设备(如Android中的SCRENON / SCREENOFF) 回答1 我使用以下方法创建相同的思想。 您需要使用桥接来快速使用目标C代码。 这是用于在Objective c和Swift之间建立桥梁的链接。 完成后,您可以将以下.h文件添加到yourproject-Bridging-Header 。 文件添加yourcontroller.h 然后将NotificationCenter.framework添加到您的项目中。 进入您的CustomObject.m #import "notify.h" -(void)registerAppforDetectLockState { int notify_token; notify_register_dispatch("com.apple.springboard.lockstate", &notify_token,dispatch_get_main_queue(), ^(int token) { uint64_t state = UINT64_MAX; notify_get_state(token, &state); if(state == 0) { NSLog(@"unlock device"); } else { NSLog(@"lock device"); } NSLog(@"com
  • How can I detect screen lock/unlock events on the iPhone?
    How can I detect screen lock/unlock events on the iPhone? When the user unlocks it, I want to show a notification alert from my iPhone app. (For Just like Broadcast Receiver for screen unlock in Android.)
  • How to Detect workstation/System Screen Lock/unlock in windows OS using java?
    I'm trying to note down workstation/System screen Lock and Unlock of each employee working in windows OS. I needed to store these record in a DataBase, using JAVA. I have searched all over and got on idea how to do it using JAVA. where ever I searched I get code for VB only.
  • 如何在Android上检测和控制手机的锁定/解锁?(How to detect and control the phone lock/unlock on android?)
    问题 我想让手机在手机被锁定(锁定=键盘被锁定)并且用户想要解锁时问一个问题(来自数据库)。 如果答案正确,则说明手机已解锁,否则手机会询问另一个问题。 我不知道如何在需要时检测解锁和解锁/锁定手机。 请帮我 回答1 您可能需要看一下Device Policy Manager和Device Admin教程。 您可以通过以下简单的代码示例锁定屏幕: DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); dpm.lockNow(); 为了进行检测,您可以按照本教程http://chandan-tech.blogspot.fr/2010/10/handling-screen-lock-unlock-in-android.html进行操作,这一点非常清楚。
  • 如何使用Java在Windows OS中检测工作站/系统屏幕锁定/解锁?(How to Detect workstation/System Screen Lock/unlock in windows OS using java?)
    问题 我试图记下在Windows OS中工作的每个员工的工作站/系统屏幕的锁定和解锁。 我需要使用JAVA将这些记录存储在数据库中。 我搜索了所有内容,并开始想到如何使用JAVA进行操作。 在我搜索过的任何地方,我只会获得VB的代码。 回答1 使用JNI(Java本机接口)从Windows系统dll调用功能。 以下是使用功能检查工作站锁定状态的示例代码:http://brutaldev.com/post/2008/05/23/Checking-if-the-workstation-is-locked.aspx 以下是有关通过JNI从Java调用dll函数的文章:http://edn.embarcadero.com/article/20679 回答2 您可以使用JNA在纯Java中完成此操作。 将jna.jar和jna -platform.jar添加到您的项目。 在此文件com.sun.jna.platform.win32.Win32WindowDemo中,有一个完整的锁定和解锁侦听器示例,还有更多内容。 这是Win32WindowDemo的必要代码: public class WorkstationLockListening implements WindowProc { /** * Instantiates a new win32 window test. */ public
  • 有没有一种方法可以检查iOS设备是否已锁定/解锁?(Is there a way to check if the iOS device is locked/unlocked?)
    问题 我在应用程序中使用了GPS位置更新。 我想检测iOS设备是否处于睡眠模式,以便可以关闭GPS位置更新并优化电池使用。 我已经尝试过在iOS 6中进行pausesLocationupdates的操作,但是它并没有按要求工作。 我想在设备进入睡眠模式后立即关闭GPS位置更新。 我想检测设备中的锁定/解锁事件。 有什么方法可以实现此功能? 到目前为止,我收到了如下的达尔文通知 -(void)registerForall { //Screen lock notifications CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.iokit.hid.displayStatus"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, /
  • 如何通过 ADB 锁定 Android 屏幕?(How to lock Android screen via ADB?)
    问题 有没有办法通过 ADB 锁定 Android 屏幕? 我找到了在 apk 中锁定显示的方法,但我想通过 ADB 从 PC 锁定屏幕,以模拟显示超时,而不必等待超时。 是否有可能做到这一点? 谢谢,黛安 回答1 酷,我刚刚发现KEYCODE_POWER是 26。 所以它的工作原理是发送: adb shell input keyevent 26 如果屏幕未锁定,则锁定屏幕。 如果屏幕已经锁定,它会唤醒设备。 我的猜测是确保屏幕被锁定(关闭)的唯一方法是解锁(我们使用 keyevent 82(菜单),然后用电源按钮 keyevent 锁定它。有人知道这是不是真的吗? 回答2 Michael R. Hines 给出了可以说是最简单的解决方案。 但是,以下行在更高版本的 Android 中没有用。 adb shell input keyevent 82 # unlock 我已经使用我想要唤醒的单个设备(平板电脑)的坐标更新了 shell 脚本。 我的平板电脑不支持锁屏事件的方向更改,因此这些值始终有效,因为锁屏始终处于横向。 如果您需要方向变化检测,一个简单的 if/then/else 就足以选择用于方向的正确坐标。 #!/bin/bash if [ "$(adb shell dumpsys power | grep mScreenOn= | grep -oE '(true|false
  • 以编程方式将iOS应用锁定为单个应用模式(Lock iOS app in single app mode programmatically)
    问题 注意:我不想将此应用提交到应用商店。 我要实现的目标: 我想要一个具有两个按钮“锁定”和“解锁”的简单应用程序。 锁定-此按钮将锁定设备。 即使重新启动后,此应用程序的屏幕也不会显示任何其他内容,即使重新启动该屏幕也会显示该屏幕。 主页按钮,手势将被禁用,类似于单个应用程序模式。 解锁-这将解锁设备并切换到设备的正常行为。 iOS:我想要在iOS 4.3及更高版本中使用。 我已经检查了以下解决方案,但这些与我的要求不符 配置配置文件锁定iPhone / iPod / iPad,使其只能运行一个应用程序但这是手动的(重新启动设备,打开要在单个应用程序模式下运行的应用程序)。 我想以编程方式按照上面通过我的应用程序提到的方式进行操作。 引导式访问(iOS 6及更高版本) 如何以编程方式在iOS 6中将用户锁定为“单应用程序”模式? 我希望它对所有OS都以编程方式执行。 有什么办法吗? 由于我不希望将其提交到应用商店,因此是否有任何私有api,是否有跳板可以实现此目的? 提前致谢 !! 回答1 据我所知,iOS 7中有一项新功能,可以完全按照您的要求进行操作。 但是,它仅适用于iOS 7(并且我相信它仅适用于受监管的设备)。 1)您将需要使用autonomousSingleAppModePermittedAppIDs密钥安装限制配置配置文件(在此处查看) 这是一个步骤
  • 以编程方式锁定和解锁iPhone屏幕(Programmatically lock and unlock iPhone screen)
    问题 如何以编程方式锁定和解锁iPhone的主屏幕(即设备本身)? 回答1 这是不可能的。 但是,您可以在应用程序运行时“防止”手机锁定。 [UIApplication sharedApplication].idleTimerDisabled = YES应该这样做。 回答2 可以通过校准GSEventLockDevice()来完成。 从您的应用中。 可以在GraphicsServices.framework中找到此功能。 回答3 这已经解决了。 您可以在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
  • 如何在Swift中自动递增变量?(How do I atomically increment a variable in Swift?)
    问题 我希望能够自动增加一个计数器,而我却找不到有关如何执行此操作的参考。 根据评论添加更多信息: 您正在使用GCD吗? 不,我没有使用GCD。 必须使用队列系统来增加数字似乎过大了。 你明白基本的线程安全? 是的,否则我不会问原子增量的问题。 这个变量是局部变量吗? 不。 它是实例级别吗? 是的,它应该是单个实例的一部分。 我想做这样的事情: class Counter { private var mux Mutex private (set) value Int func increment (){ mux.lock() value += 1 mux.unlock() } } 回答1 从低级并发API中: OSAtomicIncrement和OSAtomicDecrement函数的清单很长,这些函数使您能够以原子方式递增和递减整数值-线程安全,而无需获取锁(或使用队列)。 如果您需要从多个线程中增加全局计数器以进行统计,这些功能将很有用。 如果您要做的只是增加一个全局计数器,那么无障碍OSAtomicIncrement版本就可以了,并且在没有争用时,调用它们很便宜。 这些函数使用固定大小的整数,您可以根据需要选择32位或64位变体: class Counter { private (set) var value : Int32 = 0 func increment () {
  • @synchronized如何在Objective-C中锁定/解锁?(How does @synchronized lock/unlock in Objective-C?)
    问题 @synchronized是否不使用“锁定”和“解锁”来实现互斥? 那么它如何锁定/解锁? 以下程序的输出仅是“ Hello World”。 @interface MyLock: NSLock<NSLocking> @end @implementation MyLock - (id)init { return [super init]; } - (void)lock { NSLog(@"before lock"); [super lock]; NSLog(@"after lock"); } - (void)unlock { NSLog(@"before unlock"); [super unlock]; NSLog(@"after unlock"); } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; MyLock *lock = [[MyLock new] autorelease]; @synchronized(lock) { NSLog(@"Hello World"); } [pool drain]; } 回答1 就像NSLock一样,Objective-C语言级同步也使用互斥量。 从语义上讲
  • Swift变量是原子的吗?(Are Swift variables atomic?)
    问题 在Objective-C中,您可以区分原子性质和非原子性质: @property (nonatomic, strong) NSObject *nonatomicObject; @property (atomic, strong) NSObject *atomicObject; 据我了解,您可以安全地从多个线程中读取和写入定义为原子的属性,而同时从多个线程中写入和访问非原子属性或ivars可能导致未定义的行为,包括严重的访问错误。 因此,如果您在Swift中有这样的变量: var object: NSObject 我可以安全地并行读写该变量吗? (不考虑这样做的实际含义)。 回答1 假设尚无底层文档,这还为时过早,但是您可以从汇编中学习。 料斗拆卸器是一个很棒的工具。 @interface ObjectiveCar : NSObject @property (nonatomic, strong) id engine; @property (atomic, strong) id driver; @end 分别对非原子和原子使用objc_storeStrong和objc_setProperty_atomic ,其中 class SwiftCar { var engine : AnyObject? init() { } } 使用swift_retain的libswift_stdlib
  • 如何在Swift中使用NSURLSession依次下载多个文件(How To Download Multiple Files Sequentially using NSURLSession downloadTask in Swift)
    问题 我有一个必须下载多个大文件的应用程序。 我希望它依次而不是同时下载一个文件。 当它同时运行时,该应用程序将过载并崩溃。 所以。 我试图在一个NSBlockOperation中包装一个downloadTaskWithURL,然后在队列上设置maxConcurrentOperationCount = 1。 我在下面编写了此代码,但是由于两个文件同时下载而无法正常工作。 import UIKit class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDownloadDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. processURLs() } func download(url: NSURL){ let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() let session = NSURLSession(configuration
  • Programmatically detect whether iOS passcode is enabled or not
    Rather than build a passcode directly into my app and potentially require the user to enter a passcode twice (once for the device and again for my app); I thought I might out-clever myself and do something along the lines of: if (device has passcode) continue into my app else make user enter my app passcode I don't want to set the device passcode, I don't want to force a screen lock, not encrypting anything - all I really want is an API just to detect if a device passcode is in effect. Something like: BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn]; or maybe if I
  • 如何轻松使std :: cout成为线程安全的?(How to easily make std::cout thread-safe?)
    问题 我有一个多线程应用程序,它大量使用std::cout进行日志记录而没有任何锁定。 在这种情况下,如何轻松添加锁定机制以使std::cout线程安全的? 我不想搜索每次出现的std::cout并添加一行锁定代码。 那太乏味了。 有更好的做法吗? 回答1 注意:此答案是C ++ 20之前的版本,因此它不使用std :: osyncstream及其单独的缓冲,而是使用锁。 我想您可以实现自己的包装cout并将其与互斥量关联的类。 该新类的operator <<将做三件事: 为互斥锁创建锁,可能会阻塞其他线程执行输出,即对包装的流和传递的参数执行运算符<< 构造一个不同类的实例,将锁传递给该类 这个不同的类将把锁和委托运算符<<保留到包装的流中。 该第二类的析构函数最终将销毁该锁并释放互斥量。 因此,只要您的所有输出都使用相同的互斥量通过该对象,那么您以单个语句(即, <<调用的单个序列)编写的任何输出将被自动打印。 让我们locked_ostream两个类称为“ synchronized_ostream和“ locked_ostream 。 如果sync_cout是实例synchronized_ostream它包装std::cout ,然后顺序 sync_cout << "Hello, " << name << "!" << std::endl; 将导致以下操作: synced
  • detect screen unlock events in IOS Swift
    How can i detect screen unlock events on iPhone? When the user unlocks it, I want to perform an action in my app. I searched on googled but only found code related to objective C , change it to swift but its not working. Follow this blog: http://kidtechblogs.blogspot.com/2014/07/how-to-detect-screen-lockunlock-events.html. Any help how can i detect it in swift. Below is the code change into swift.. func displayStatusChanged(center: CFNotificationCenter, observer: Void, name: CFString, object: Void, userInfo: CFDictionaryRef) { // the "com.apple.springboard.lockcomplete" notification will
  • 以编程方式检测是否启用了iOS密码(Programmatically detect whether iOS passcode is enabled or not)
    问题 而不是直接在我的应用程序中构建密码,并可能要求用户输入两次密码(一次针对该设备,再一次针对我的应用程序); 我认为我可能会超越自我,并按照以下方式做一些事情: if (device has passcode) continue into my app else make user enter my app passcode 我不想设置设备密码,我不想强​​制屏幕锁定,不加密任何内容-我真正想要的只是一个API,用于检测设备密码是否有效。 就像是: BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn]; 或者,如果我很幸运: BOOL isPasscodeEnabled = [UIDevice isPasscodeEnabled]; BOOL isSimplePasscode = [UIDevice isSimplePasscode]; NSInteger minutes = [UIDevice requirePasscodeAfter]; 我猜不是基于这个问题(但是已经有好几年了)“以编程方式检查设置包中的iPhone密码”,或者这可能是答案。 “锁定解锁事件iphone”不是我想要的,但可能“在事实发生后”起作用。 回答1 更新 从iOS 9开始
  • 如何在Swift中使用AVPlayerViewController检测全屏模式?(How to detect fullscreen mode using AVPlayerViewController in Swift?)
    问题 我正在尝试检测AVPlayerViewController何时处于全屏模式,但是我很难实现这一目标。 我想知道用户何时选择展开按钮以进入全屏状态,如下所示: 我根据以下建议添加了适当的观察者: 检测以人像或风景全屏播放的视频如何检测AVPlayerViewController的全屏模式 适当的代码: var avWidth:CGFloat = 375 var avHeight:CGFloat = 300 override func viewDidLoad() { super.viewDidLoad() let path = NSBundle.mainBundle().pathForResource("cable pressback", ofType: "mp4") let url = NSURL.fileURLWithPath(path!) let player = AVPlayer(URL: url) playerViewController.player = player playerViewController.view.frame = CGRectMake(0, 100, self.view.frame.size.width, 300) playerViewController.view
  • 在iPhone App中如何检测设备的屏幕分辨率(in iPhone App How to detect the screen resolution of the device)
    问题 在iPhone App中,在设备上运行App时,如何检测运行App的设备的屏幕分辨率? 回答1 CGRect screenBounds = [[UIScreen mainScreen] bounds]; 这将为您提供整个屏幕的分辨率(以磅为单位),因此,对于iPhone,通常为320x480。 即使iPhone4的屏幕尺寸更大,iOS仍会返回320x480而不是640x960。 这主要是因为较旧的应用程序损坏了。 CGFloat screenScale = [[UIScreen mainScreen] scale]; 这将为您提供屏幕比例。 对于所有不配备Retina显示屏的设备,它将返回1.0f,而Retina Display设备将提供2.0f,而iPhone 6 Plus(Retina HD)将提供3.0f。 现在,如果要获取iOS设备屏幕的像素宽度和高度,您只需做一件事。 CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 通过乘以屏幕比例,可以得到实际的像素分辨率。 在此处可以很好地了解iOS中点和像素之间的差异。 编辑:(版本为Swift) let screenBounds = UIScreen