如何在iPhone上检测锁定/解锁事件?假设它只能用于越狱设备,你能指出我正确的API吗?
通过锁定事件,我的意思是显示或隐藏锁定屏幕(可能需要密码才能解锁).
如何检测iPhone上的屏幕锁定/解锁事件?当用户解锁时,我想从我的iPhone应用程序显示通知提醒.(就像在Android中用于屏幕解锁的广播接收器一样.)
我在我的应用程序中使用了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, // observer
displayStatusChanged, // callback
CFSTR("com.apple.springboard.lockstate"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
displayStatusChanged, // callback
CFSTR("com.apple.springboard.hasBlankedScreen"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
displayStatusChanged, // callback
CFSTR("com.apple.springboard.lockcomplete"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
}
//call back
static void displayStatusChanged(CFNotificationCenterRef center, …Run Code Online (Sandbox Code Playgroud) 一个应用程序可以在内部使用NSNotificationCenter不同的部分来相互通信,但是这是否可以扩展,以便不同的应用程序可以使用它来进行通信?
编辑:对于 iOS 与 OSX 之间的混淆表示抱歉。我只添加了 iOS 标签,我不知道如何/谁/为什么还添加了 Objective-C 标签,这不是我。
我正在尝试编写一个代码来处理iOS上的打开/关闭屏幕(你可以看一下这个问题,讨论类似的问题).我为此问题添加了OSX标记,因为OSX具有相同的系统范围通知功能.并且下面描述的问题继承到通知工具(vs iOS或OSX).
众所周知,注册系统范围通知com.apple.springboard.hasBlankedScreen以在屏幕关闭或打开时接收通知.
仅供参考(以下是用于注册系统范围通知的API):
但是,这种方法存在两个相互关联的问题:
因此,结果我们需要实现一些不同的屏幕打开和关闭的解决方案(因为将调用相同的通知回调,并且没有参数将具有状态).
一般来说,状态与通知回调分离的核心问题.我不知道如何优雅地处理这个问题.
我提出了两种直截了当的方法(每种方法都有缺陷).并寻找关于这种方法的另一种方法或改进的想法.
我们可以实施一个计数器来计算我们已经收到多少通知,并根据这些信息,我们将知道是否有关于打开或关闭屏幕的通知(基于我们的计数器的奇怪性).
但是,它有两个缺点:
1)在这种情况下,如果系统(因设计时间原因未知)将发送具有相同名称的其他通知,我们的逻辑将被搞砸,因为它会破坏奇怪的检查.
2)另外,我们需要正确设置初始状态.所以代码中的某个地方我们会有类似的东西:
Run Code Online (Sandbox Code Playgroud)counter = getInitialState(); registerForNotification();
在这种情况下,我们有一个竞争条件.如果系统将在我们执行getInitialState()之后发送通知并更改状态,但在registerForNotification()之前,我们将以错误的计数器值结束.
如果我们将执行以下代码:
Run Code Online (Sandbox Code Playgroud)registerForNotification(); counter = getInitialState();
在这种情况下,我们有另一种竞争条件.如果系统将在我们执行registerForNotification()之后发送通知并更改状态,但在getInitialState()之前,我们将获得一个计数器,将进入通知回调并将增加一个计数器(这将使其错误).
在这种情况下,我们不存储任何计数器,而是在通知回调中使用API notify_get_state来获取当前状态.
这有它自己的问题:
1)异步传递给应用程序的通知.因此,如果您以非常快的速度关闭屏幕,则可以在屏幕已经打开时收到两个通知.因此,notify_check将获得当前状态(与发送通知时的状态相比).
因此,当应用程序在通知回调中使用notify_get_state时,它将确定有两个通知"屏幕已打开",而不是一个通知"屏幕已关闭"而另一个"屏幕已打开".
PS一般而言,所有描述的问题并非特定于屏幕开/关情况.对于具有独特状态并使用相同通知名称发送的任何系统范围的通知,它们都是实际的.
更新1
我没有测试完全打开/关闭屏幕的情况,并且从notify_get_state()获得相同的结果.
但是,当我收到两个通知com.apple.springboard.lockstate(通过CFNotificationCenterAddObserver订阅)并且我使用另一个API来获取当前设备锁定状态并且两个通知都收到相同的值时,我有类似的情况.
所以我只是假设notify_get_state也会返回相同的值.但是,我认为这是有根据的猜测.notify_get_state的输入参数对于两个调用将是相同的(它不会更改).我不认为系统存储应由notify_get_state返回的状态的FIFO队列.
architecture macos iphone-privateapi nsnotificationcenter ios