如果你的应用需要在点击home键之后,整个程序里还需要有部分功能需要一直执行,那么就需要用到GCD,后台执行的话,一般来讲,苹果做了限制,如果不做任何配置的话,你的应用最多只能运行5s,5s之后就会被挂起,长时间的话就会被杀掉进程;还有一种情况:你设置了后台运行,但是一般来讲:9.9Min之后,程序同样也会被挂起;
问题来了:怎么进行设置,如果设置成一个一直在后台执行的,不受时间段的控制;
很多的应用:qq,高德地图导航,都是需要保持一个长连接;
下面说一下实现思路:
首先
继续保持Application does not run in background字段的值为NO,同时在UIBackgroundModes字段中添加audio,location,voip,或者选择App processes Newsstand Kit downloads,App communicates with an accessory,App communicates using CoreBluetooth,App shares data using CoreBluetooth,总共7个,都可以开始后台执行,大概在594秒(即9.9分钟)的时候停止,与加不加相应的调用代码无关,空工程即可。
- (void)applicationDidEnterBackground:(UIApplication *)application{ UIApplication* app = [UIApplication sharedApplication]; __block UIBackgroundTaskIdentifier bgTask; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 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; } }); }); }
然后,在定义一个定时器,定时的执行进行检测,后台线程运行的时间剩余数;如果小于1分钟就再次申请一个新的任务;
- (void)tik{ if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 61.0) { [[CKAudioTool sharedInstance] playSound]; [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; } } [[CKAudioTool sharedInstance] playSound];//这段代码是去播放了一个无声的音乐,很关键的一点是 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&error]
这样后台播放就不会影响到别的程序播放音乐了。
我这个计时器每分钟运行一次tik函数,如果发现后台运行时间小于一分钟了,就再去申请一个backgroundTask。
神奇的地方在于:backgroundTask不能在程序已经进入后台的时候申请,可以用一个播放音乐的假前台状态去申请,所以可以做到不断申请到权限,也就完成了长时间后台执行。
相关推荐
iOS程序进入后台后十分钟之内就会被系统kill掉,这个demo是程序进入后台后会一直运行
主要为大家详细介绍了iOS如何保持程序在后台长时间运行,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
B、ios由于是伪后台,当程序退回到后台,系统留给程序的可运行时间就只有3分钟。 过了3分钟,就会把这个程序的所有线程挂起(当然内部预留了长任务运行这一后招)。 经过多次试验后,可以借助着3分钟的长任务运行,...
程序退出了之后仍然可在后台运行
主要为大家详细介绍了iOS实现后台长时间运行,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统...
在运行 iOS 8.1.2 的 iPhone 5 上的初步结果表明,只要设备的电池正在充电,就会频繁地执行提取(约 10-15 分钟,当使用 UIApplicationBackgroundFetchIntervalMinimum 配置时),但是当设备放电时后台提取被有效地...
VOIPSocket可以在后台运行。当程序进入后台时,事实上整个程序被暂停运行,但VOIPsocket因为受系统控制而不在此列。我的观察是,每次有新的数据来临时,程序会被唤醒并执行大约几秒钟,然后再次进入休眠。
由于iOS系统为“伪后台”运行模式,当按下HOME键时,如程序不做任何操作,应用会有5秒的执行缓冲时间,随机程序被挂起,所有任务终端,包括计时器和位置更新等操作,但程序打开后台模式开关后,部分任务可以再后台...
backgroundTimeriOS 后台计时Demo原理:伪装成音乐播放器,在后端播放声音。按Home键切换到后台后,应用不受10分钟的限制。...后台播放声音时,如果启动新的声音播放程序,应用后台运行被打断,应用停止运行。
React Native后台服务库,用于在Android和iOS中永久运行后台任务。 安排一个后台作业,当您的应用程序在后台或前台时将运行您JavaScript。警告Android :此库依赖于React Native的 for Android。 在构建JS任务之前,...
为应用程序提供更好的体验 l 支持上传或下载队列,并且可获取队列的进度信息 l 支持基本、摘要和NTLM身份认证,在同一会话中授权凭证会自动维持,并且可以存储在Keychain(Mac和iOS操作系统的密码管理系统)中 l ...
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要...
一个示例 iOS 应用程序,当应用程序在后台时每 X 秒跟踪一次用户位置 只需运行它,出于示例目的,它只会在用户进入后台后实时跟踪用户的位置。 这项工作的关键在于,在应用程序完成启动后,它会立即开始监视重大的...
适用于跨平台(iOS和Android)的React Native应用程序的定期后台任务,即使关闭该应用程序也会运行这些任务。 该库允许安排单个定期任务,该任务在应用程序处于后台或关闭状态时执行,执行频率不超过每15分钟一次...
react-native-background-fetch· 通过 , 创建者Background Fetch是一个非常简单的插件,它尝试每隔15分钟在后台唤醒一个应用程序,以提供较短的后台运行时间。 每当发生后台获取事件时,此插件就会执行您提供的...
Xamarin.iOS 示例使用 NSUrlSessionUploadTask 在应用程序处于后台时上传文件。 设置 此示例包含 2 个项目,Xamarin.iOS 项目和 ASP.NET Web API 2 项目。 在 ASP.NET Web API 2 项目上: 编辑项目并配置您希望 ...