iOS:检测不活动或定期启动应用程序

时间:2013-04-03 14:09:13

标签: ios background locking wakelock user-inactivity

是否可以在应用程序范围外检测iOS上的inactivty? 如果没有,即使在前台也可以定期启动应用程序吗?我的目标是在用户没有与设备交互的一段时间后在循环中播放一些视频。 任何变通办法或私有API也是可行的解决方案。

提前谢谢!

2 个答案:

答案 0 :(得分:0)

根据Apple对iPhone / iPod / iPad的限制,您不能对用户的设备进行此类控制。

因此,实际上没有可能实现这一目标的方法,除非您可能越狱您的设备,而我对此并不了解。

希望这有帮助!

答案 1 :(得分:0)

在越狱的iOS设备上,使用启动守护程序可以实现这样的功能,假设设备没有锁定/进入睡眠状态。 (如果设备被锁定也可能,但我不知道该怎么做。)

我将简要介绍一下这些步骤;如果您需要更多细节,请告诉我。

首先,创建一个启动守护进程。您不希望将UIApplication用于启动守护程序,因此您应该创建自定义main()函数。要使其始终在后台运行,您需要将plist文件添加到/Library/LaunchDaemons,其名称类似于com.yourcompany.yourdaemonname

使用以下键可以使其正常工作:

<key>Label</key>
<string>com.yourcompany.yourdaemonname</string>

<key>MachServices</key>
<dict>
    <key>com.yourcompany.yourdaemonname</key>
    <true/>
</dict>

<key>ProgramArguments</key>
<array>
    <string>/path/to/daemon/executable</string>
</array>

<key>UserName</key>
<string>mobile</string>

<key>OnDemand</key>
<false/>

<key>StandardErrorPath</key>
<string>/dev/null</string>

<key>Disabled</key>
<false/>

如果您不重新启动手机,则可能还需要在安装守护程序后调用launchctl load /Library/LaunchDaemons/com.yourcompany.yourdaemonname.plist(如果更新,则在重新安装之前launchctl unload)。我不太确定。

一旦您的守护程序运行,您可以通过安排NSTimer定期执行该守护程序。我不确定是否有办法检查手机闲置多长时间,但有可能。但是,一旦解决了该问题,就可以使用以下代码启动应用程序(主UI应用程序):

#import <dlfcn.h>
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
...
void* sbServices = dlopen(SBSERVPATH, RTLD_LAZY);
int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) = dlsym(sbServices, "SBSLaunchApplicationWithIdentifier");
int result;
result = SBSLaunchApplicationWithIdentifier(CFSTR("com.yourcompany.youruiapp"), false);
dlclose(sbServices);