Неограниченная поддержка приложения в фоновом режиме (для приложения Cydia) - PullRequest
4 голосов
/ 25 декабря 2011

Я не возражаю против использования приватных API или чего-либо подобного, что не нравится Apple, но предпочел бы быстрое решение, которое не имеет ничего общего с игрой в тишине в фоновом режиме или с шумом.

Очевидно, что это не для магазина приложений, поэтому, пожалуйста, не читайте лекций:)

Так как же вы работаете в фоновом режиме без каких-либо ограничений, таких как "backgrounder"? Мне не удалось найти ответ, кроме некоторых, которые указывают людям разные направления, но, возможно, с тех пор кому-то уже удалось его выкопать.

Ответы [ 2 ]

8 голосов
/ 04 апреля 2013

Обновление:

Это решение больше не кажется достаточным (~ 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/).

1 голос
/ 25 декабря 2011

В зависимости от того, что собирается делать ваше «приложение», вы можете подключить MobileSubstrate. Это загрузит SpringBoard и по существу будет работать "в фоновом режиме".

Если вы хотите написать реальное приложение, вы также можете написать «Динамическую библиотеку», которая будет загружена с SpringBoard MobileSUbstrate. Вы можете общаться между этим dylib и вашим приложением, используя NSNotificationCenter; создание и размещение уведомлений.

...