Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
iOS后台任务检测屏幕打开或关闭_Ios_Objective C_Iphone_Screen_Background Service - Fatal编程技术网

iOS后台任务检测屏幕打开或关闭

iOS后台任务检测屏幕打开或关闭,ios,objective-c,iphone,screen,background-service,Ios,Objective C,Iphone,Screen,Background Service,我正在开发一个应用程序,用于记录屏幕开/关事件。这是一种智能手机使用分析应用程序。应用程序所做的只是写下如下日志: 2015 July 25 at 03:54:12 PM - Screen on 2015 July 25 at 03:59:38 PM - Screen off 2015 July 25 at 04:20:52 PM - Screen on 2015 July 25 at 04:22:32 PM - Screen off ... 2015 July 26 at 10:20:32 A

我正在开发一个应用程序,用于记录屏幕开/关事件。这是一种智能手机使用分析应用程序。应用程序所做的只是写下如下日志:

2015 July 25 at 03:54:12 PM - Screen on
2015 July 25 at 03:59:38 PM - Screen off
2015 July 25 at 04:20:52 PM - Screen on
2015 July 25 at 04:22:32 PM - Screen off
...
2015 July 26 at 10:20:32 AM - Screen on
2015 July 26 at 10:22:11 AM - Screen off
2015 July 26 at 11:30:38 AM - Screen on
2015 July 26 at 10:31:02 AM - Screen off
...
  • “屏幕打开”:用户按下主页按钮(或电源按钮)并输入密码/解锁密码(如果有)
  • “屏幕关闭”:用户按下电源按钮关闭屏幕
我能够在Android上找到一些方法,使用广播接收器捕获系统发送的事件。但在iOS中似乎存在一个问题,因为iOS只允许后台服务运行几分钟,我甚至不确定是否可以在iOS上检测到“屏幕开/关”事件

我对此做了一些研究,发现了一些文章,但这些都没有多大帮助:

我的问题是“在iOS(最新版本-8.4)中是否可以制作这样的应用程序”


谢谢。

使用后台服务,在已发布的、无牢狱之灾的iOS设备中可能无法满足您的所有要求。我可以看到通知,我只是不确定背景

由于其他人一直说这是不可能的,我在这里深入挖掘,看看能做多少

由于iOS目前仅限于少数后台模式(事件在后台传递的情况),或在用户离开应用程序后几分钟内授予应用程序权限的模式,主要问题是欺骗系统,让你的应用程序在需要时可以在后台获得时间

有几种背景模式,如中所述。例如,如果您可以定期发送推送通知以唤醒应用程序“下载内容”,则您可能能够在系统认为合适的情况下定期获得一些时间

后台是一种可能的解决方案,但只能供您自己使用,不能通过应用商店使用。官方对此的看法是——相关部分是2.8(大概你会让应用程序“在幕后”安装你的守护进程):

2.8安装或启动其他可执行代码的应用程序将被拒绝

可能有一些系统日志是iOS自己保存的;如果你能访问这些,你就拥有了你的数据。然而,我怀疑,这是否可以通过编程方式从一部没有牢狱之灾的手机上获得

我能够测试一些使用Darwin通知的Swift(2.0)代码,Darwin通知在您最初的问题导致的一个堆栈溢出讨论中提到:。我实际上没有在后台运行,但我确实验证了事件最终是否已交付,即使在实际锁定事件发生时应用程序未运行。当我的应用程序被切换时,会调用通知。因此,如果你能从系统中获得时间,当苹果的算法决定给你时间时,你会收到(延迟的)通知

允许侦听的代码片段(我将其塞进了一些随机应用程序)如下所示:

import UIKit
import CoreFoundation

class MainViewController: UIViewController, UIWebViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CoreFoundation compatible types
        var cfstr: CFString = "com.apple.iokit.hid.displayStatus" as NSString
        var notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()

        CFNotificationCenterAddObserver(notificationCenter, nil,
            { (noti: CFNotificationCenter!, aPtr: UnsafeMutablePointer<Void>, aStr: CFString!, bPtr: UnsafePointer<Void>, aDict: CFDictionary!) -> () in
                print("got notification") }, cfstr, nil, CFNotificationSuspensionBehavior.DeliverImmediately)

    }
    // [... more stuff ...]
}
导入UIKit
进口核心基金会
类MainViewController:UIViewController、UIWebViewDelegate{
重写func viewDidLoad(){
super.viewDidLoad()
//CoreFoundation兼容类型
var cfstr:CFString=“com.apple.iokit.hid.displayStatus”作为NSString
var notificationCenter=CFNotificationCenterGetDarwinNotifyCenter()
cfNotificationCenter添加观察员(notificationCenter,无,
{(noti:CFNotificationCenter!、aPtr:unsafemeutablepointer、asr:CFString!、bPtr:UnsafePointer、aDict:CFDictionary!)->中的()
打印(“收到通知”)},cfstr,nil,CFNotificationSuspensionBehavior.deliveriely)
}
//[…更多东西…]
}

如果您可以使用C或objective C代码,我想这段代码可能会对您有所帮助

   notify_register_dispatch("com.apple.iokit.hid.displayStatus", &notify_token, dispatch_get_main_queue(), ^(int token) {
    uint64_t state = UINT64_MAX;
    notify_get_state(token, &state);
    //notify_cancel(token);
    debug("com.apple.iokit.hid.displayStatus = %llu", state);
});
前提是您能够在后台模式下运行应用程序。
状态将提供屏幕开-关状态

否,在iosAw上不可能。。太糟糕了。事情是如此的受限。无论如何,谢谢你提供的信息。你能指出为什么这个应用程序不可行,以及苹果关于限制政策的链接吗?非常感谢。只是更新了一些可能有用的信息,至少对玩游戏有用。将问题向上投票,这样可能会有人提出更具体的建议;-)谢谢,这是很多有用的信息。我对“后台守护进程”非常感兴趣,目前正在进行一些研究。我真的不需要发布应用程序,所以根据你说的,这个“守护进程”可能是我的解决方案。是的,我认为后台守护进程会工作——不确定是否绝对需要越狱。也许应用程序可以安装它,您可以将其配置到测试设备。