码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • iOS开发基础102-后台保活方案


    合集 - iOS进阶(73)
    1.iOS开发基础77-一像素线的几种实现方式2016-03-262.iOS开发基础78-iOS 国际化2016-03-263.iOS开发基础82-关于iOS目录2017-04-194.iOS开发基础81-Runtime实战2017-04-175.iOS开发基础80-关于Xcode82016-11-156.iOS开发基础79-强制退出程序2016-10-207.iOS开发基础90-密码学2018-08-038.iOS开发基础89-Runloop2018-08-029.iOS开发基础88-涂鸦效果2018-06-0410.iOS开发基础87-抽屉效果2018-06-0411.iOS开发基础86-FMDB2018-05-3012.iOS开发基础85-线程dispatch apply2017-07-1213.iOS开发基础84-HTTP请求方法详解与增删改查的应用2017-05-1214.iOS开发基础83-线程组2017-04-2815.iOS开发基础106-Instruments07-1616.iOS开发基础105-Xcode收集Crashs的各种方法07-1617.iOS开发基础104-正向代理和反向代理07-1618.iOS开发基础103-APP之间跳转07-16
    19.iOS开发基础102-后台保活方案07-16
    20.iOS开发基础101-指纹和面部识别07-1621.iOS开发基础100-MDM证书申请流程2022-03-2822.iOS开发基础99-iOS 内购的防范与优化2021-09-2823.iOS开发基础98-跳转淘宝案例2019-06-2024.iOS开发基础97-应用内购(In-App Purchase)的安全性解析与收据处理流程2019-06-0625.iOS开发基础96-UI类继承关系图2019-03-1926.iOS开发基础95-程序内评价2019-01-0727.iOS开发基础94-xcode102018-09-2528.iOS开发基础93-GCD死锁2018-09-0429.iOS开发基础92-线程保活2018-09-0430.iOS开发基础91-线程同步技术与资源共享详解2018-09-0431.iOS开发基础138-视频编码07-2332.iOS开发基础137-音视频编解码简介07-2333.iOS开发基础136-防暴力点击07-2334.iOS开发基础135-Core Data07-2235.iOS开发基础134-异步并行上传问题07-1836.iOS开发基础133-崩溃预防07-1837.iOS开发基础132-POSIX线程库07-1838.iOS开发基础131-isa指针07-1839.iOS开发基础130-视频录制上传07-1840.iOS开发基础129-音频录制上传07-1841.iOS开发基础128-应用本地化07-1842.iOS开发基础127-深入探讨KVO07-1743.iOS开发基础126-深入探索设计模式07-1744.iOS开发基础125-深入探索SDWebImage07-1745.iOS开发基础124-RunLoop实现卡顿检测07-1746.iOS开发基础123-自动释放池原理07-1747.iOS开发基础122-RunLoop07-1748.iOS开发基础121-APP启动优化07-1749.iOS开发基础120-通知与线程07-1750.iOS开发基础119-组件化07-1751.iOS开发基础118-Runtime07-1752.iOS开发基础117-Hybrid07-1753.iOS开发基础116-性能监控07-1754.iOS开发基础115-Socket07-1755.iOS开发基础114-YYCache07-1756.iOS开发基础113-Unity3D07-1757.iOS开发基础112-GCD常见场景07-1758.iOS开发基础111-RAC07-1759.iOS开发基础110-Core Graphics应用场景07-1760.iOS开发基础109-网络安全07-1761.iOS开发基础108-常见的编程范式07-1662.iOS开发基础107-iOS直播07-1663.iOS开发基础148-ABM vs MDM08-0564.iOS开发基础147-ABM集中管理Apple设备08-0565.iOS开发基础146-深入解析WKWebView08-0366.iOS开发基础145-Apple Search Ads08-0167.iOS开发基础144-逐字打印效果08-0168.iOS开发基础143-性能优化07-2669.iOS开发基础142-广告归因07-2570.iOS开发基础141-音频解码07-2371.iOS开发基础140-音频编码07-2372.iOS开发基础139-视频解码07-2373.iOS开发基础149-由UUIDString引发的思考08-09
    收起

    iOS系统在后台执行程序时,有严格的限制,为了更好地管理资源和电池寿命,iOS会限制应用程序在后台的运行时间。然而,iOS提供了一些特定的策略和技术,使得应用程序可以在特定场景下保持后台运行(即“后台保活”)。以下是iOS中几种常见的后台保活方案,并附上示例代码:

    一、后台任务

    利用beginBackgroundTask和endBackgroundTask来执行后台任务。后台任务将在应用程序进入后台时仍能保持有限的时间执行任务。

    #import 
    
    @interface AppDelegate : UIResponder 
    
    @property (strong, nonatomic) UIWindow *window;
    @property (assign, nonatomic) UIBackgroundTaskIdentifier bgTask;
    
    @end
    
    @implementation AppDelegate
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
            self.bgTask = UIBackgroundTaskInvalid;
        }];
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            // 在这里执行你的后台任务
            for (int i = 0; i < 100; i++) {
                NSLog(@"Background task running %d", i);
                [NSThread sleepForTimeInterval:1];
            }
            
            [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
            self.bgTask = UIBackgroundTaskInvalid;
        });
    }
    
    @end
    

    二、使用Background Fetch

    利用Background Fetch,系统会间歇性地唤醒应用程序,以便它可以执行任务或获取数据。需要在Xcode的“Capabilities”中开启Background Modes,并勾选“Background fetch”。

    #import 
    
    @interface AppDelegate : UIResponder 
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
        return YES;
    }
    
    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
        // 在这里执行你的后台数据获取任务
        NSLog(@"Background fetch started");
    
        // 模拟数据获取
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"Background fetch completed");
            completionHandler(UIBackgroundFetchResultNewData);
        });
    }
    
    @end
    

    三、使用远程通知(Silent Push Notification)

    利用远程通知,在接收到通知时,系统会唤醒应用程序执行指定的任务。需要开启Remote notifications,在Application Capabilities中勾选“Remote notifications”。

    #import 
    #import 
    
    @interface AppDelegate : UIResponder 
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [UNUserNotificationCenter currentNotificationCenter].delegate = self;
        [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            }
        }];
        return YES;
    }
    
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
        // 在这里处理收到的远程通知
        NSLog(@"Received remote notification");
    
        // 模拟处理任务
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"Handled remote notification");
            completionHandler(UIBackgroundFetchResultNewData);
        });
    }
    
    @end
    

    四、使用特定的后台模式(Background Modes)

    iOS提供了一些特定的后台模式,允许程序在后台持续运行。常见的后台模式包括:

    • Audio: 允许应用程序在后台播放音频。
    • Location: 允许应用程序在后台持续获取位置更新。
    • VoIP: 允许应用程序在后台侦听VoIP事件。
    • Bluetooth: 允许应用程序与蓝牙设备通信。

    1. Audio后台模式

    需要在Xcode的“Capabilities”中开启Background Modes,并勾选“Audio, AirPlay, and Picture in Picture”。

    #import 
    
    @interface AppDelegate ()
    
    @property (nonatomic, strong) AVAudioPlayer *audioPlayer;
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        NSError *error = nil;
        NSURL *audioURL = [[NSBundle mainBundle] URLForResource:@"audioFileName" withExtension:@"mp3"];
        self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];
        [self.audioPlayer prepareToPlay];
        
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
        [audioSession setActive:YES error:&error];
        
        return YES;
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        [self.audioPlayer play];
    }
    
    @end
    

    2. Location后台模式

    需要在Xcode的“Capabilities”中开启Background Modes,并勾选“Location updates”。

    #import 
    
    @interface AppDelegate () 
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        [self.locationManager requestAlwaysAuthorization];
        return YES;
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [self.locationManager startUpdatingLocation];
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
        CLLocation *location = [locations lastObject];
        NSLog(@"Background location: %@", location);
    }
    
    @end
    

    五、使用后台URLSession

    使用NSURLSession来执行后台下载和上传任务。需要在后台配置中开启Background Modes,并勾选“Background fetch”和“Remote notifications”。

    #import 
    
    @interface AppDelegate : UIResponder 
    
    @property (strong, nonatomic) UIWindow *window;
    @property (nonatomic, strong) NSURLSession *backgroundSession;
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.example.background"];
        self.backgroundSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
        return YES;
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        NSURL *url = [NSURL URLWithString:@"http://example.com/largefile.zip"];
        NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithURL:url];
        [downloadTask resume];
    }
    
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
        NSLog(@"Download completed: %@", location);
        // 处理下载结果,比如保存文件
    }
    
    @end
    

    通过上述几种方案,我们可以在iOS应用程序中实现各种场景下的后台保活。每种方案都有其适用的场景和限制,开发者需要根据应用的实际需求和系统提供的特性,选择合适的后台保活方案。

    将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    企业架构LNMP学习笔记52
    【游戏建模全流程】Maya风格化模型制作教程
    react中的this指向问题
    人工智能的未来以及人工智能如何影响教育、医学、营销领域
    numpy对行操作总结
    【性能优化】MySQL性能优化之存储引擎调优
    【漏洞挖掘】Xray+rad自动化批量漏洞挖掘
    Bytebase 2023 第三季度回顾
    祝贺莱佛士学生在ASDA2023设计大赛中获得最高奖项
    二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
  • 原文地址:https://www.cnblogs.com/chglog/p/18305545
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号