Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从iOS服务检测屏幕开/关_Objective C_Ios_Notifications_Jailbreak_Broadcast - Fatal编程技术网

Objective c 从iOS服务检测屏幕开/关

Objective c 从iOS服务检测屏幕开/关,objective-c,ios,notifications,jailbreak,broadcast,Objective C,Ios,Notifications,Jailbreak,Broadcast,我正在开发一个网络监控应用程序,作为一项服务在后台运行。屏幕打开或关闭时是否可能收到通知/呼叫 它通过使用以下代码存在于Android中: private void registerScreenOnOffReceiver() { IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(

我正在开发一个网络监控应用程序,作为一项服务在后台运行。屏幕打开或关闭时是否可能收到通知/呼叫

它通过使用以下代码存在于Android中:

private void registerScreenOnOffReceiver()
{
   IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
   filter.addAction(Intent.ACTION_SCREEN_OFF);
   registerReceiver(screenOnOffReceiver, filter);
}
当屏幕打开/关闭时,会调用screenOnOffReceiver。iOS有类似的解决方案吗

编辑:
到目前为止,我发现最好的是UIApplicationProtectedDataWillBecomeUnavailable(),但它要求用户在设备上启用数据保护(密码保护)。

当iPhone屏幕锁定时,appdelegate方法 “-(无效)应用程序将重新指定:(UIApplication*)应用程序” 你可以检查一下。希望它能对您有所帮助。

您可以使用,来收听事件。我不是100%确定,但在我看来,在越狱的iOS 5.0.1 iPhone4上运行,这些事件之一可能就是您所需要的:

com.apple.iokit.hid.displayStatus
com.apple.springboard.hasBlankedScreen
com.apple.springboard.lockstate
更新:此外,手机锁定时(但解锁时除外)会发布以下通知:

要使用它,请像这样注册事件(这只注册一个事件,但如果这对您不起作用,请尝试其他事件):

其中
displayStatusChanged
是您的事件回调:

static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    NSLog(@"event received!");
    // you might try inspecting the `userInfo` dictionary, to see 
    //  if it contains any useful info
    if (userInfo != nil) {
        CFShow(userInfo);
    }
}
如果你真的想让这段代码作为一项服务在后台运行,而且你已经越狱了,我建议你调查一下。与只允许在后台运行的应用程序不同,启动守护进程可以在重新启动后自动启动,并且您不必担心在后台运行任务的应用程序的iOS规则


让我们知道它是如何工作的

使用较低级别的notify API,您可以在收到通知时查询锁定状态:

#import <notify.h>

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);
    NSLog(@"com.apple.springboard.lockstate = %llu", state);
});
#导入
int通知令牌;
notify\u register\u dispatch(“com.apple.springboard.lockstate”),¬ify\u令牌,dispatch\u get\u main\u queue(),^(int令牌){
uint64_t状态=uint64_最大值;
通知获取状态(令牌和状态);
NSLog(@“com.apple.springboard.lockstate=%llu”,state);
});

当然,你的应用程序必须启动UIBackgroundTask才能获得通知,这限制了该技术的实用性,因为iOS允许的运行时间有限。

是的,但你将无法在后台监控网络……苹果不会允许。我知道。但该应用程序不适用于应用商店,因此这不是问题。即使该应用程序本身不在前台,检查也必须有效。我假设applicationWillResignActive:仅在应用程序位于前台时调用?是的,在这种情况下,您必须对私有API进行反向工程,以尝试为其找到通知。没有公开的方法来做这件事。此外,你将不得不越狱的设备,以便它甚至运行在后台连续这样。有几种方法可以启动《黑客攻击和保护iOS应用程序》一书中列出的守护进程。Ok。谢谢你的提示。实际上,到目前为止,我还不需要越狱就能运行一个长寿命的后台服务。只需将其“声明”为VOIP应用程序,iOS不会将其关闭。非常感谢!这正是我要找的!在未越狱的iPhone5上试用了它,回调被调用!然而,userInfo总是为零,也许是因为它没有越狱?我试图避免不越狱,这个解决方案无疑是向前迈进了一步。现在我只需要找到一种方法来确定回调是由于屏幕关闭还是打开事件引起的。手机锁定和解锁时,会调用com.apple.springboard.lockstate。当屏幕打开和关闭时,可以选择另外两个。您也可以尝试检查
com.apple.springboard.lockcomplete
。我相信只有当屏幕被锁定时才会调用,而不是当它被解锁时。因此,这可能有助于您确定您正在检测的情况。至于
userInfo
为零,我怀疑这是因为你没有越狱。并非所有通知都填充
userInfo
dictionary。它基本上是一个可选的有效载荷。所以,它很可能是空的。它可用于希望提供其他详细信息的事件。我希望它能告诉你屏幕是开还是关,但我想不会。再次感谢。com.apple.springboard.lockcomplete仅在关闭屏幕时启动@iOSAppDev,您可以让您的应用程序运行的时间比正常的iOS规则允许的时间更长,方法是将您的应用程序设置为启动守护程序(如我上面提到的),或者。后台模式是未记录的API,不会被批准用于应用商店应用,但使用它们不需要越狱。如何在swift中使用此模式?
static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    NSLog(@"event received!");
    // you might try inspecting the `userInfo` dictionary, to see 
    //  if it contains any useful info
    if (userInfo != nil) {
        CFShow(userInfo);
    }
}
#import <notify.h>

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);
    NSLog(@"com.apple.springboard.lockstate = %llu", state);
});