https://www.jianshu.com/p/d466f2da0d33

在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就是切换一下系统界面都会觉得卡;苹果手机不论开多少app在后台都感觉很流畅.

这是因为安卓默认处理app为真后台,可以一直在后台处理操作;

而iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式的“假后台”。除了系统官方极少数程序可以真后台,一般开发者开发出来的应用程序后台受到以下限制:

1.用户按Home之后,App转入后台进行运行,此时拥有180s后台时间(iOS7)或者600s(iOS6)运行时间可以处理后台操作

2.当180S或者600S时间过去之后,可以告知系统未完成任务,需要申请继续完成,系统批准申请之后,可以继续运行,但总时间不会超过10分钟

3.当10分钟时间到之后,无论怎么向系统申请继续后台,系统会强制挂起App,挂起所有后台操作、线程,直到用户再次点击App之后才会继续运行

iOS系统app如何实现在后台长时间运行

比较常用的可以实现“真后台”的方法:

1.VOIP 2.定位服务 3.后台下载 4.在后台循环播放无声音乐

目前我接手的项目是视频点播类项目,需要在app进入后台也可以保持电视播放剧集,并在回到前台后更新进度条进度,并且每60s对后台发送心跳包,保持长连接,所以需要实现真后台.

使用了第4种方式,静音播放,上架之前多次被拒但最终通过了审核.

如何通过了审核

上架的时候,标注是视频点播类app,此app类似于电视遥控器,

起初一进入后台就循环播放无声音乐,所以苹果方一直以播放视频和音频没有声音拒绝.

但是为了保持真后台,必须是类似音乐播放器一类的可以后台播放声音的app.

所以第一次上架时,点击播放后退到后台会在后台循环播放一个有声音的MP3,

在通过了审核后,立刻更新一个版本,把有声音的MP3文件换成一个无声音的MP3

此时苹果测试人员审核不会像第一次审核那么严格,通过了.

具体实现:首先我们看看app进入后台进入前台的几个常用方法

#pragma mark - 程序将要进入后台(墓碑状态)

- (void)applicationWillResignActive:(UIApplication *)application {

}

#pragma mark - 程序进入后台

- (void)applicationDidEnterBackground:(UIApplication *)application {

}

#pragma mark - 程序将要进入前台

- (void)applicationWillEnterForeground:(UIApplication *)application {

}

#pragma mark - 程序进入前台

- (void)applicationDidBecomeActive:(UIApplication *)application {

}

配置plist文件背景播放的支持:

在AppDelegate中实现大概:

//进入后台

- (void)applicationDidEnterBackground:(UIApplication *)application

{

NSLog(@"%s",__FUNCTION__);

//设置永久后台运行

UIApplication *app = [UIApplication sharedApplication];

__block   UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

//不管有没有完成,结束bgTask任务

[application endBackgroundTask:bgTask];

dispatch_async(dispatch_get_main_queue(), ^{

if (bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

dispatch_async(dispatch_get_main_queue(), ^{

if (bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

});

//当只有点播了时才会退到后台,如果不点播则后台不开启,以省电

if ([CJGloblePlayer defaultGloblePlayer].runningPlayer.isPlaying)

{

//开启后台任务

[self applyBackgrounTaskTime];

//UI停止更新

[[CJTopPlayView sharePlayView].rotaionView stopRotation];

}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSLog(@"Starting background task with %0.1f seconds remaining", application.backgroundTimeRemaining);

[NSThread sleepForTimeInterval:600];

NSLog(@"Finishing background task with %0.1f seconds remaining",application.backgroundTimeRemaining);

//告诉系统我们完成了 也就是要告诉应用程序:“好借好还”嘛。

//将任务标记为完成

[application endBackgroundTask:bgTask];

// 销毁后台任务标识符

bgTask = UIBackgroundTaskInvalid;

});

}

//开启后台任务

- (void)applyBackgrounTaskTime

{

//__block UIBackgroundTaskIdentifier background_task;

UIApplication *application = [UIApplication sharedApplication];

//注册一个后台任务,告诉系统我们需要向系统借一些事件

background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

//不管有没有完成,结束background_task任务

[application endBackgroundTask: background_task];

background_task = UIBackgroundTaskInvalid;

}];

//异步

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//### background task starts

NSLog(@"Running in the background\n");

//循环播放无声的MP3

[[CJBackGroundAudioVC shareInstance] backGroundStart];

[NSThread sleepForTimeInterval:2];

//结束background_task任务

[application endBackgroundTask: background_task];

background_task = UIBackgroundTaskInvalid;

});

}

//播放MP3

- (void)backGroundStart

{

[self playAudio:[[NSBundle mainBundle] pathForResource:@"silence" ofType:@"mp3"]];

}

//程序进入前台

- (void)applicationDidBecomeActive:(UIApplication *)application

{

//后台保持app一直运作的播放器停止工作

[[CJBackGroundAudioVC shareInstance] backGroundStop];

//全局播放器开始播放,更新UI

if ([CJGloblePlayer defaultGloblePlayer].runningPlayer.playstate == psPlaying)

{

[[CJTopPlayView sharePlayView].rotaionView startRotation];

}

}

若有不妥之处,恭请评论多多指教.

参考相关链接:

http://www.jianshu.com/p/174fd2673897

http://blog.csdn.net/weiwangchao_/article/details/8316641

http://blog.sina.com.cn/s/blog_7b9d64af0101cjci.html

作者:oldSix_Zhu

链接:https://www.jianshu.com/p/d466f2da0d33

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

iOS保持App真后台运行的更多相关文章

  1. 如何禁止App在后台运行以及如何保存和恢复App的状态

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 如果禁止App在后台运行 iOS上的App类似于Windows ...

  2. 原创翻译:iOS 应用程序 蓝牙后台运行

    默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的.也就是说,你可以通过宣布你的应用程序支持后台处理模式来 ...

  3. Delphi IOS 蓝牙锁屏后台运行

    Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了. 音乐播放器是怎么做 ...

  4. App在后台运行

    App有三种状态: 1. 死亡状态(未打开App); 2. 前台运行状态(打开状态); 3. 后台暂停状态(停止所有动画, 定时器, 多媒体联网等操作) 4. 后台运行状态(后台运行); ------ ...

  5. iOS蓝牙APP常驻后台

    iOS蓝牙类APP常驻后台的实现方法,经过在苹果开发者论坛询问,以及查看苹果开发者文档,最后得出正确的方法为: 1.设置plist,蓝牙权限 2.到target-capabilities-backgr ...

  6. IOS开发使用GCD后台运行

    什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...

  7. 只写Python一遍代码,就可以同时生成安卓及IOS的APP,真优秀

    前言: 用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择 我们使用kivy开发安卓APP,Kivy是一套专门用于跨平台快速应用开发的开源框架,使用Python和Cython编写 ...

  8. ios GCD简单介绍 后台运行~

    本从实践出发简单说明: 首先,gcd是Grand Central Dispatch的缩写,意为多线程优化技术,是苹果为多核处理优化的技术.使用简单.清晰. 多线程就分同步.异步方法如下: //异步线程 ...

  9. iOS - AppRealTest App 真机测试

    前言 1.准备 开发者账号 自从 Xcode7 出来之后,一般的真机测试不需要开发者账号,也就不需要看这篇教程,只有 app 具有 "推送" 等功能的时候,要真机测试就必须要开发者 ...

随机推荐

  1. EF Code First列名 'Discriminator' 无效的问题

    新建了一个类继承EF  Model类,运行报错 EF Code First列名 'Discriminator' 无效 EF会把项目中在DbContext中引用的所有的Model类及这些Model类对应 ...

  2. Latch导致MySQL Crash

    作者:沃趣科技数据库专家 董红禹 问题概述 最近我们遇到一个MySQL的问题,分析后很有代表意义,特地写出来供大家参考.出现问题是,数据库先是被置为只读,然后过了一段时间,MySQL直接Crash掉了 ...

  3. Linux CPU占用率监控工具小结

    关键词:top.perf.sar.ksar.mpstat.uptime.vmstat.pidstat.time.cpustat.munin.htop.glances.atop.nmon.pcp-gui ...

  4. tesseract-ocr安装问题

    今天安装tesseract-ocr的时候,载了坑,记录一下. 1. 安装时语言库的选择,我把 aditional language data 这一项全选中了,装的时候那叫一个慢啊,差不多3个小时装好的 ...

  5. DbContext 和 ObjectContext两者的区别

    ObjectContext是一种模型优先的开发模式,DbContext是代码优先的开发模式.这是两者最根本的区别. 同时两者之间可以相互转换: 下面给出转换的例子 1.DbContext转为Objec ...

  6. 【Teradata】移动空间语句

    1.移动10G空间从sysdba到dbc create database td_tmp_db from sysdba as perm=10E9; give td_tmp_db to "dbc ...

  7. 一、tars简单介绍 二、tars 安装部署资料准备

    1.github地址https://github.com/Tencent/Tars/ 2.tars是RPC开发框架,目前支持c++,java,nodejs,php 3.tars 在腾讯内部已经使用了快 ...

  8. MySQL高级知识(十二)——全局查询日志

    前言:全局查询日志用于保存所有的sql执行记录,该功能主要用于测试环境,在生产环境中永远不要开启该功能. 1.如何开启 #1.通过my.cnf配置开启该功能. 注:对my.cnf文件配置后,需重启my ...

  9. Android自动登录功能的实现

    登陆页面布局设计: <LinearLayout android:layout_width="wrap_content" android:layout_height=" ...

  10. vue 数据绑定实现的核心 Object.defineProperty()

    vue深入响应式原理 现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简 ...