-2

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

提前致谢!

4

2 回答 2

0

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

因此,实际上没有可能的方法来实现这一点,除非您可能越狱您的设备,而我对此知之甚少。

希望这有帮助!

于 2013-04-03T14:22:39.200 回答
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.plistlaunchctl 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);
于 2013-04-03T15:40:13.240 回答