IOS 개발 모듈 요약 (2) 백그라운드 실행 프로그램 (2) Task completion - UIBAckgroundTaskIdentifier
3885 단어 IOS 기능 모듈
프로그램이 백그라운드에 들어갈 때 응용 프로그램 DidEnterBackground 함수를 호출합니다.
우선 설정 지불 백그라운드 운행 여부를 판단한다
BeginBackgroundTaskWithExpirationHandler를 통해 UIbackgroundTaskIdentifier 가져오기
이후에 백엔드에서 일정한 시간을 얻어 우리의 코드를 가리킬 수 있다.
NSTimeInterval backgroundTimeRemanging = [[UIApplication sharedApplication] backgroundTimeRemaining];
NSLog(@"backgroundTimeRemanging = %.02f", backgroundTimeRemanging);
백그라운드에서 실행할 수 있는 시간을 보려면 BeginBackgroundTaskWithExpirationHandler 코드 블록에서 반드시
UIApplication의 endBackgroundTask를 호출합니다: 백그라운드 작업을 종료하는 방법은 다음과 같습니다.
[app endBackgroundTask:_bgTask];
여기의bgTask는beginBackgroundTaskWithExpirationHandler를 통해 얻을 수 있습니다.일치를 유지해야 한다.
마지막으로, 우리의 응용 프로그램이 프론트 데스크톱으로 돌아오면, 만약 우리의 백엔드 임무가 아직 실행 중이라면, 우리는 그것을 해치울 것을 확보해야 한다.
- (void)applicationWillEnterForeground:(UIApplication *)application{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid){
[self endBackgroundTask]; }
}
@interface AppDelegate : UIResponder
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@property (nonatomic, strong) NSTimer * myTimer;
- (BOOL)isMutiltaskingSupported;
@end
//
- (BOOL)isMutiltaskingSupported{
BOOL result = NO;
if ( [[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {
result = [[UIDevice currentDevice] isMultitaskingSupported];
}
return result;
}
//
- (void)timerMethod:(NSTimer *)paramSender{
NSTimeInterval backgroundTimeRemanging = [[UIApplication sharedApplication] backgroundTimeRemaining];
if ( backgroundTimeRemanging == DBL_MAX) {
NSLog(@"Background Time Remaining = Undeterminded");
}
//--
NSLog(@"Background Timer Remaining = %.02f Seconds", backgroundTimeRemanging);
}
// ,
- (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 ( [self isMutiltaskingSupported] == NO) {
NSLog(@"---> ");
return;
}
self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundTask];
}]; self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(timerMethod:)
userInfo:nil
repeats:YES];
}
// ,
- (void)endBackgroundTask{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
__weak AppDelegate *weakSelf = self;
dispatch_async(mainQueue, ^{
AppDelegate * strongSelf = weakSelf;
if ( strongSelf != nil) {
[strongSelf.myTimer invalidate];
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
});
}
- (void)applicationWillEnterForeground:(UIApplication *)application{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid){
[self endBackgroundTask]; }
}