iOS: обнаружение неактивности или периодический запуск приложения

Можно ли обнаружить неактивность на iOS вне области приложения? Если нет, возможно ли запускать приложение периодически, даже если на переднем плане? Моя цель состоит в том, чтобы воспроизводить видео в цикле через некоторое время, когда пользователь не взаимодействует с устройством. Любые обходные пути или частные API также являются возможными решениями.

Заранее спасибо!

2 ответа

Исходя из ограничений 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, Я не уверен, есть ли способ проверить, как долго телефон простаивал, но это возможно. Однако, как только вы решите эту проблему, вы можете запустить приложение (ваше основное приложение пользовательского интерфейса), используя следующий код:

#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);
Другие вопросы по тегам