我开发记录下来开/关事件屏幕的应用程序。这是一种智能手机使用情况的分析应用程序。所有的应用程序,它只是写下日志是这样的:
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使用后台服务设备中的所有需求。我可以看到通知碰到过,我只是不知道该backgrounding。
因为别人一直在说这是不可能的,我挖得更深一些,这里看到底有多少可以做到的。
由于iOS的目前仅限于少数在您的应用程序是在用户离开你的应用远后授予的几分钟时间背景模式(情况,事件在后台交付),或模式,首要的问题是怎么回事为系统欺骗到让你的应用程序需要的时候在后台获取时间。
有几个背景模式,在Programming Guide to Background Execution描述。如果你可以,例如,定期发送推送通知来唤醒应用“下载内容”,您可以定期获得一些时间,因为系统认为合适的方式这样做。
背景Daemon是一个可能的解决方案,但只为自己使用,而不是通过在App Store。这个官方的看法是在App Store Review Guidelines - 相关的部分是2.8(想必你会得到你的守护程序由具有应用安装“幕后”):
该安装或启动其他可执行代码2.8应用程序将会被拒绝
可能存在的iOS保持了自身的一些系统日志;如果你能够访问到这些,你有你的数据。但我怀疑,这是可以编程方式从非监禁破手机。
我能够测试出使用的堆栈溢出讨论的是你原来的问题导致的一个提到的达尔文通知一些斯威夫特(2.0)代码:Lock / Unlock Events for iPhone。我实际上并没有在后台运行,但我没有验证事件最终传递,即使当实际的锁事件发生的应用程序没有运行。当我的应用程序切换中,通知被调用。所以,如果你能够从系统中获得的时候,你会得到(延迟)通知时,苹果的算法决定给您的时间。
代码段(我把它塞进一些随机的应用程序),使听音如下:
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 ...]
}
如果你可以使用C或客观的C代码,我想这个代码可能帮助你。
notify_register_dispatch("com.apple.iokit.hid.displayStatus", ¬ify_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);
});
只要你能在后台模式下运行你的应用程序。国家将提供关状态屏幕