3

バックグラウンドでの実行に関するstackoverflowの投稿がたくさん見つかりましたNSTimer

しかし、解決策は見つかりませんでした。

私のアプリでは、バックグラウンドでサウンドを再生し、その時間に達したときに音楽を停止するようにタイマーを設定しています。

そのため、バックグラウンドを実行する必要がありNSTimerます (ホームボタンをクリックして iPhone をスリープ状態にするときを意味します)。

どうやってやるの?

4

6 に答える 6

30
// 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];

これはあなたが欲しいものですか?

于 2013-10-04T06:33:58.680 に答える
3

できません

タイマーはアプリケーション内にのみ存在します。そのため (非常に小さなウィンドウを除いて) アプリがバックグラウンドに移行すると、タイマーは起動できなくなります。

(音声はアプリではなくシステムによって再生されるため、再生され続けます)。

したがって、この目的でタイマーを使用することはできません。

iPatel が提案しているように、できることは、代わりにローカル通知を使用することです。これにより、アプリが一時的に起動され、音楽の再生を停止できるようになります。

于 2013-02-27T15:36:21.833 に答える
2

フォームを取得 [この質問] ( 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
}
于 2013-02-26T15:26:02.133 に答える
-2

を実行すると、バックグラウンドで実行するかメイン スレッドで実行するかがメソッド自体によって決定されます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
      });
}
于 2013-02-26T15:04:51.293 に答える