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);