Обновление:
Это решение больше не кажется достаточным (~ iOS 7+ или 7.1+). Я оставляю исходный ответ для исторической справки, и в случае, если он поможет выработать будущее решение на основе этого устаревшего:
Это зависит от того, что вы подразумеваете под app . Если вы говорите о неграфическом фоновом сервисе , то вам нужен демон запуска. Смотрите здесь, как создать демон запуска .
Если у вас есть обычное приложение пользовательского интерфейса, но когда пользователь нажимает кнопку «Домой», вы хотите, чтобы оно оставалось без сна в фоновом режиме в течение неограниченного времени, , тогда вы можете использовать недокументированные Режимы фона в файле Info.plist вашего приложения :
<key>UIBackgroundModes</key>
<array>
<string>continuous</string>
<string>unboundedTaskCompletion</string>
</array>
Затем, когда iOS готова перевести ваше приложение в фоновый режим (например, пользователь нажимает кнопку «Домой»), вы можете сделать это в делегате приложения:
@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask;
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Delay execution of my block for 15 minutes.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 15 * 60 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
NSLog(@"I'm still alive!");
});
self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// should never get here under normal circumstances
[application endBackgroundTask: self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
NSLog(@"I'm going away now ....");
}];
}
Как правило, iOS дает вам только 10 минут для работы вашего пользовательского интерфейса в фоновом режиме. С недокументированным фоновым режимом вы сможете дожить до этого 10-минутного лимита.
Примечание: для этого не требуется перехват с MobileSubstrate. Если вы используете второй метод (недокументированные фоновые режимы), тогда требует установки вашего приложения в /Applications/
, а не в обычной области песочницы (/var/mobile/Applications/
).