IOS 4.0은 백그라운드 실행 지원

4947 단어
종료되기 전의 임의의 시간에 프로그램은 BeginBackgroundTaskWithExpirationHandler를 호출합니다. 시스템은 백엔드에서 장시간 실행해야 할 작업을 완성하기 위해 추가 시간을 줍니다.(UIAPplication의 backgroundTimeRemaining 속성은 프로그램이 실행되는 총 시간을 포함함)
task completion을 사용하여 비교적 중요하지만 장시간 실행되는 프로그램이 사용자가 백엔드에 들어와서 갑자기 닫히지 않도록 보장할 수 있습니다.예를 들어, 사용자의 정보를 디스켓에 저장하거나 인터넷에서 중요한 파일을 다운로드할 수 있다.이런 작업을 초기화하는 두 가지 방법이 있다. 첫째, 장시간 운행하는 중요한 임무를 BeginBackgroundTaskWithExpirationHandler:과endBackgroundTask:포장으로 한다.이렇게 하면 프로그램이 갑자기 백엔드에 들어갈 때 이 임무들이 중단되지 않도록 보호한다.2. 응용 프로그램이 응용 프로그램didEnterBackground에 의뢰할 때 방법이 호출되었을 때 다시 시작하는 두 가지 방법은 일일이 대응해야 한다.endBackgroundTask: 방법은 시스템 작업이 완료되었음을 알려주고 프로그램은 이 때 종료될 수 있다.프로그램이 백엔드 작업을 수행할 시간이 제한되어 있기 때문에, 시간이 초과되거나 시스템이 프로그램을 종료하기 전에 이 방법을 호출해야 합니다.종료를 피하기 위해서, 작업이 시작될 때 expiration handler와endBackgroundTask: 방법을 제공할 수 있습니다.(backgroundTimeRemaining 속성을 보고 얼마나 남았는지 확인할 수 있습니다).한 프로그램이 여러 개의 작업을 동시에 제공할 수 있습니다. 작업을 시작할 때마다beginBackgroundTaskWithExpirationHandler: 방법은 유일무이한handler로 돌아가서 이 작업을 식별합니다.이 작업을 종료하려면 endBackgroundTask: 방법에서 같은handler를 전달해야 합니다.
백그라운드에서 실행되는 처리 코드는 - (void) 응용 프로그램 Will Resign Active: (UIAPplication *) 응용 프로그램 또는 - (void) 응용 프로그램 Did EnterBackground: (UIAPplication *) 응용 프로그램에 놓을 수 있습니다. 물론 프로그램이 다시 활성화될 때 timer invalidate를 제거해야 합니다.
- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
//    if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
    NSLog(@"Supported background:%@", [UIDevice currentDevice].multitaskingSupported ? @"YES" : @"NO");
    
    UIApplication *app = [UIApplication sharedApplication];
    
    NSLog(@"Remaining time is:%f", app.backgroundTimeRemaining);
    
    __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid) {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i = 0; i < 20; i++) {
            UILocalNotification *notification=[[UILocalNotification alloc] init];
            if (notification!=nil) {
                NSDate *now = [NSDate new];
                notification.fireDate = [now dateByAddingTimeInterval:(60 * (i + 1))];//*    
                notification.repeatInterval = 0;//    ,kCFCalendarUnitWeekday    
                notification.timeZone = [NSTimeZone defaultTimeZone];
                notification.applicationIconBadgeNumber = 1; //       
                notification.soundName= UILocalNotificationDefaultSoundName;//  ,    alarm.soundName = @"myMusic.caf"
                //    2         
                notification.alertBody = [NSString stringWithFormat:@"Time passed:%d minutes", (i + 1)];//          
                notification.alertAction = @"Open";  //     
                //notification.hasAction = NO; //         , no alertAction  
                // NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
                //notification.userInfo = infoDict; //       
                [[UIApplication sharedApplication] scheduleLocalNotification:notification];
            }
            [notification release];
        }
        
        NSTimer *testTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(doSomeTest) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:testTimer forMode:NSRunLoopCommonModes];
        [[NSRunLoop currentRunLoop] run];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid) {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
}

- (void)doSomeTest
{
    NSLog(@"background test...");
}

참조:http://li-bonan.blog.163.com/blog/static/1355647702012871309846/

좋은 웹페이지 즐겨찾기