设为首页 加入收藏

TOP

iOS-实现后台长时间运行(一)
2019-08-31 01:04:35 】 浏览:83
Tags:iOS- 实现 台长 时间 运行

前言

一般APP在按下Home键被挂起后,这时APP的 backgroundTimeRemaining 也就是后台运行时间大约只有3分钟,如果在退出APP后,过十几二十二分钟或者更长时间再回到APP,APP就会回到刚打开时的状态,也就是首页;有的项目在被挂起后需要在后台运行一段时间,使有足够的时间来完成与服务器对接的操作,或者需要一直运行的需求;如果需要,则在APP被挂起后,申请后台,来延长后台运行时间。

APP申请后台运行的方式有几种:

播放音乐

定位 

Newsstand downloads

fetch

这里主要说下后台播放无声音乐(其实是不播放),采用哪种方式,对应勾选上图;我的项目中有音频播放需求,如果没有,那就找一个播放音频的理由,或者用其他方式实现。

实现

这里采用了两个单例:电话监控(XKTelManager)、后台运行(XKBGRunManager),电话监控可以忽略,视情况而用;采用单例是为了方便管理;

XKTelManager.h

#import <Foundation/Foundation.h>

@interface XKTelManager : NSObject
///是否在后台运行
@property (nonatomic,assign) BOOL inBackgroundRun;
+ (XKTelManager *)sharedManager;
/**
 来电监听
 */
- (void)startMonitor;
@end

XKTelManager.m

#import "XKTelManager.h"
#import "XKBGRunManager.h"
#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>

static XKTelManager *_sharedManger;
@interface XKTelManager()
@property (nonatomic, strong) CTCallCenter *callCenter;
@end
@implementation XKTelManager
+ (XKTelManager *)sharedManager{
    static dispatch_once_t onceTelSingle;
    dispatch_once(&onceTelSingle, ^{
        if (!_sharedManger) {
            _sharedManger = [[XKTelManager alloc]init];
        }
    });
    return _sharedManger;
}
- (instancetype)init{
    self = [super init];
    if (self) {
        _inBackgroundRun = NO;
    }
    return self;
}
#pragma mark -********* 监听电话相关
- (void)startMonitor {
    __weak typeof(self) weakSelf = self;
    _callCenter = [[CTCallCenter alloc] init];
    _callCenter.callEventHandler = ^(CTCall * call) {
        ///如果已经进入后台了,不做任何操作
        if (weakSelf.inBackgroundRun) {
            return;
        }
        ///APP未进入后台
        if ([call.callState isEqualToString:CTCallStateDisconnected]){
            NSLog(@"电话 --- 断开连接");
            [[XKBGRunManager sharedManager] stopBGRun];
        }
        else if ([call.callState isEqualToString:CTCallStateConnected]){
            NSLog(@"电话 --- 接通");
        }
        else if ([call.callState isEqualToString:CTCallStateIncoming]){
            NSLog(@"电话 --- 待接通");
            [[XKBGRunManager sharedManager] startBGRun];
        }
        else if ([call.callState isEqualToString:CTCallStateDialing]){
            NSLog(@"电话 --- 拨号中");
            [[XKBGRunManager sharedManager] startBGRun];
        }
        else {
            NSLog(@"电话 --- 无操作");
        }
        
    };
}
@end

XKBGRunManager.h

#import <Foundation/Foundation.h>

@interface XKBGRunManager : NSObject
+ (XKBGRunManager *)sharedManager;

/**
 开启后台运行
 */
- (void)startBGRun;

/**
 关闭后台运行
 */
- (void)stopBGRun;
@end

XKBGRunManager.m

#import "XKBGRunManager.h"
///循环时间
static NSInteger _circulaDuration = 60;
static XKBGRunManager *_sharedManger;
@interface XKBGRunManager()
@property (nonatomic,assign) UIBackgroundTaskIdentifier task;
///后台播放
@property (nonatomic,strong) AVAudioPlayer *playerBack;
@property (nonatomic, strong) NSTimer *timerAD;
///用来打印测试
@property (nonatomic, strong) NSTimer *timerLog;
@property (nonatomic,assign) NSInteger count;
@end
@implementation XKBGRunManager{
    CFRunLoopRef _runloopRef;
    dispatch_queue_t _queue;
}
+ (XKBGRunManager *)sharedManager{
    static dispatch_once_t onceRunSingle;
    dispatch_once(&onceRunSingle, ^{
        if (!_sharedManger) {
            _sharedManger = [[XKBGRunManager alloc]ini
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇iOS中Block循环引用的问题 下一篇iOS学习——浅谈RunLoop

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目