3大后台任务

backgroundFetch,

是指,系统不管你APP是未启动的还是在后台的,还是挂起的。 都会以一定的时间执行performFetchWithCompletionHandler 。 可以执行30秒的任务。

与NSURLSession的backgroundSessionConfigurationWithIdentifier
是不同的东西。

backgroundSession,

NSURLSession 的backgroundSession 无需后台模式的开关 ,就支持在后台持续下载数据的。
handleEventsForBackgroundURLSession

_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:
下载完成后。唤醒app

顺序如下:
handleEventsForBackgroundURLSession-> NSURLSession的didFinishDownloadingToURL
->didCompleteWithError ->URLSessionDidFinishEventsForBackgroundURLSession


-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler {
    NSLog(@" 😊  %s %@ ",__func__, identifier);
    [LocalNotficationHelper sendLocationNotfication:@"backgroundSession~~" description:@"下载完成"];
    ///只要调用completionHandler ,立即又会进入挂起了;
     //但是挂起前,不会影响 urlSession的didfinishdownloading和didcompletWithError。但是会影响urlsessionManagerTaskDelegate中的 中的dispatch_group_async的回调。
   // completionHandler();
    [backgroundFetchManager addFinishEventsForBackgroundSesssionId:identifier block:completionHandler];
}



backgroundFetchManager.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface backgroundFetchManager : NSObject
+(void)addFinishEventsForBackgroundSesssionId:(NSString *)backgroundSessionIdentifier block: ( void (^)(void))completionBlock ;
+(void)backgroundfetchNewDataForUrl:(NSURL *)url callBackCompletion:(void (^)(UIBackgroundFetchResult result))completionBlock;

@end


backgroundFetchManager.m


#import <AFNetworking.h>
#import "backgroundFetchManager.h"
#import "LocalNotficationHelper.h"

@implementation backgroundFetchManager


+(NSMutableDictionary *)handleEventsForBackgroundURLSessionBlockDict {
    static NSMutableDictionary * handleEventsForBackgroundURLSessionBlockDict;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        handleEventsForBackgroundURLSessionBlockDict  =@{}.mutableCopy;
    });
    return handleEventsForBackgroundURLSessionBlockDict;
}
+(void)addFinishEventsForBackgroundSesssionId:(NSString *)backgroundSessionIdentifier block: ( void (^)(void))completionBlock {
    
    if (backgroundSessionIdentifier  &&completionBlock ) {
        
        [[backgroundFetchManager handleEventsForBackgroundURLSessionBlockDict ] setObject:completionBlock forKey:backgroundSessionIdentifier];
    }
}



 +(void)backgroundfetchNewDataForUrl:(NSURL *)url callBackCompletion:(void (^)(UIBackgroundFetchResult result))completionBlock {
    NSString*timeString=  [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterFullStyle];
    
    NSString*file =[[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent: timeString];
 
    NSURLSessionConfiguration *configuration=   [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"12345"];
     
     
     
     AFURLSessionManager*mananger= [[AFURLSessionManager  alloc] initWithSessionConfiguration:configuration];
     __weak typeof(mananger) weakMananger=  mananger;
     [mananger setDidFinishEventsForBackgroundURLSessionBlock:^(NSURLSession * _Nonnull session) {
         if (session.configuration.identifier) {
             void (^completionBlock)(void) =  [[backgroundFetchManager handleEventsForBackgroundURLSessionBlockDict] objectForKey:  session.configuration.identifier ];
             if (completionBlock) {
                 [[backgroundFetchManager handleEventsForBackgroundURLSessionBlockDict] removeObjectForKey:session.configuration.identifier];
             }
             completionBlock();
             [weakMananger invalidateSessionCancelingTasks:YES];
         }
    }];
        
    
    NSURLSessionDownloadTask*task=  [mananger  downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://down10.zol.com.cn/audio/AudioConverter_Demo.rar"]] progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@" 😊  %s : %@",__func__, @(downloadProgress.fractionCompleted));
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        NSLog(@" 😊  %s :%@",__func__, file);
        return  [NSURL fileURLWithPath:file];
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        if (filePath&&!error) {
            NSLog(@"😊  下载成功:   %s %@",__func__, filePath);
            [LocalNotficationHelper sendLocationNotfication:@"backgroundSession~" description:[NSString stringWithFormat:@" 下载成功: 😊  %s %@",__func__, filePath]];
            completionBlock(UIBackgroundFetchResultNoData);
        } else {
            NSLog(@"😊 下载失败  %s %@",__func__, error);

            
            [LocalNotficationHelper sendLocationNotfication:@"backgroundSession~" description:[NSString stringWithFormat:@"下载失败 😊  %s %@",__func__, error]];
            completionBlock(UIBackgroundFetchResultFailed);
        }
        
       [mananger invalidateSessionCancelingTasks:YES];
    }];
    [task resume];
}
@end




remote notfication fetch

aps消息体传输增加content-available字段为1,则是以静默推送的方法是进行的。
系统不管你APP是未启动的还是在后台的,还是挂起的。
都会唤醒app
application:didReceiveRemoteNotification:fetchCompletionHandler:

{
    "aps": {
        "content-available": 1
    },
    "userinfokey1":"asdfasdfasdf"
}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容