バックグラウンドでの実行に関するstackoverflowの投稿がたくさん見つかりましたNSTimer
。
しかし、解決策は見つかりませんでした。
私のアプリでは、バックグラウンドでサウンドを再生し、その時間に達したときに音楽を停止するようにタイマーを設定しています。
そのため、バックグラウンドを実行する必要がありNSTimer
ます (ホームボタンをクリックして iPhone をスリープ状態にするときを意味します)。
どうやってやるの?
バックグラウンドでの実行に関するstackoverflowの投稿がたくさん見つかりましたNSTimer
。
しかし、解決策は見つかりませんでした。
私のアプリでは、バックグラウンドでサウンドを再生し、その時間に達したときに音楽を停止するようにタイマーを設定しています。
そのため、バックグラウンドを実行する必要がありNSTimer
ます (ホームボタンをクリックして iPhone をスリープ状態にするときを意味します)。
どうやってやるの?
// NSTimer run when app in background <br>
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
loop = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(Update) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:loop forMode:NSRunLoopCommonModes];
これはあなたが欲しいものですか?
タイマーはアプリケーション内にのみ存在します。そのため (非常に小さなウィンドウを除いて) アプリがバックグラウンドに移行すると、タイマーは起動できなくなります。
(音声はアプリではなくシステムによって再生されるため、再生され続けます)。
したがって、この目的でタイマーを使用することはできません。
iPatel が提案しているように、できることは、代わりにローカル通知を使用することです。これにより、アプリが一時的に起動され、音楽の再生を停止できるようになります。
フォームを取得 [この質問] ( http://iphonedevsdk.com/forum/iphone-sdk-development/58643-keep-nstimer-running-when-app-is-in-background-multitasking.html )
- (void)btnSetupNotificationClicked:(id)sender
{
UILocalNotification* pOrderCompletedNotification=[[UILocalNotification alloc] init];
if(pOrderCompletedNotification!=nil)
{
[pOrderCompletedNotification setFireDate:[[NSDate alloc] initWithTimeIntervalSinceNow:5.00]];
// [pOrderCompletedNotification setApplicationIconBadgeNumber:1];
[pOrderCompletedNotification setTimeZone:[NSTimeZone systemTimeZone]];
[pOrderCompletedNotification setSoundName:@\"OrderCompleted.m4a\"];
[pOrderCompletedNotification setAlertBody:@\"Order Completed\"];
[pOrderCompletedNotification setAlertAction:nil];
[pOrderCompletedNotification setHasAction:NO];
UIApplication* pApplication=[UIApplication sharedApplication];
if(pApplication!=nil)
{
[pApplication scheduleLocalNotification:pOrderCompletedNotification];
}
else
{
NSLog(@\"Application singleton allocation error.\");
}
[pOrderCompletedNotification release];
[pApplication release];
}
else
{
NSLog(@\"Local notification creation error.\");
} // if
}
を実行すると、バックグラウンドで実行するかメイン スレッドで実行するかがメソッド自体によって決定されますNSTimer
。@selector
初期設定:
self.scanTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(manageMethod) userInfo:nil repeats:YES]; //@property (nonatomic, strong) NSTimer *scanTimer
バックグラウンドで実行するケース:
-(void)manageMethod
{
dispatch_queue_t queue = dispatch_queue_create("com.mysite.thread1",NULL);
dispatch_async(queue,^{
//run in background
});
}