アプリ自体が表示されていなくても、バックグラウンドで定期的に (頻繁に) 何らかの作業を行う必要があるアプリを開発しています。VOIPアプリとして宣言することで、起動し、10分(600秒)後に自動的に再起動することさえできました。このアプリは App Store 向けではありません。
約 300 ~ 400 秒後、システムは (正しく) 新しいスレッドを生成しますが、最後のスレッドを閉じません。これは、約 600 秒ごとに新しいスレッドが生成され、アプリのメモリとバッテリーの消費量が増加することを意味します。良くない。
新しいスレッドが作成されたら、最初に生成されたスレッドを閉じる方法の手がかりはありますか?
このコードは、アプリが閉じられるとバックグラウンド ハンドラーを開始します。また、600 秒間隔で定期的に新しいハンドラーを開始します。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
isInBackground = YES;
BOOL backgroundAccepted = [[UIApplication sharedApplication]
setKeepAliveTimeout:600 handler:^{ [self startBackgroundHandler]; }];
if (backgroundAccepted)
{
NSLog(@"VOIP backgrounding accepted");
}
[self startBackgroundHandler];
}
このコードは、定期的に (5 秒ごとに) 何らかの作業を行うスレッドを開始します。
- (void)startBackgroundHandler
{
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (1)
{
NSLog(@"BGTime left: %f", [UIApplication
sharedApplication].backgroundTimeRemaining);
sleep(5);
}
});
}