是否可以在应用程序范围之外检测 iOS 上的不活动?如果没有,即使在前台也可以定期启动应用程序吗?我的目标是在用户未与设备交互的一段时间后循环播放一些视频。任何变通方法或私有 API 也是可行的解决方案。
提前致谢!
是否可以在应用程序范围之外检测 iOS 上的不活动?如果没有,即使在前台也可以定期启动应用程序吗?我的目标是在用户未与设备交互的一段时间后循环播放一些视频。任何变通方法或私有 API 也是可行的解决方案。
提前致谢!
根据 Apple 对 iPhone/iPod/iPad 的限制,您不能对用户的设备进行此类控制。
因此,实际上没有可能的方法来实现这一点,除非您可能越狱您的设备,而我对此知之甚少。
希望这有帮助!
在越狱的 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);