您的位置:首页 > 移动开发 > IOS开发

iOS后台模式以及后台持续运行

2016-07-09 13:49 435 查看
一、iOS后台的几种模式

1、Background Audio,这是后台的音频,这个很早之前便有,也是iOS设备中用得最多的后台应用,调用这个接口可以实现后台的音乐播放。


2、Location Services,这是后台的定位,系统会拥有统一页面进行管理。


3、VoIP,后台语音服务,类似Skype通话应用需要调用,可进行后台的语音通话。


4、Newsstand,报刊杂志后台自动下载更新,其能够自动实时更新。

6、 Remote Notification,这是本次较大的一个改进接口,以往聊天类应用接受推送后点进去需要再收一次信息,这情况在QQ、微信等应用上最为明显。不过拥 有了这个接口后,这情况将不复存在,以后推送将能够直接启动后台任务。值得注意的是remote notification支持silent notification(静默推送),这样dropbox这类同步应用可以在后台以最节能的模式实时静默同步了,类似布卡漫画这种也可以推送正在追的漫 画的新章节并在后台静默下载,待到下载好再给用户发送一个本地推送,用户点开即看无需再联网


7、Background Transfer Service,后台上传下载。iOS最接近传统多任务的后台接口,可供任意类型的app调用,无时间限制。应用场景包括后台上传和下载数据,这使得游戏 后台更新数据包,后台上传视频等等都成为可能,但是正如其名字,它只能用于处理上传下载这种传输类的任务,类似后台剪切板监控这种它就无能为力了。

二、配置

第一步,开启后台模式,选中定位,选择project –> capabilities–>Backgorund Modes –> Location updates

第二步,在info.list 文件中添加如下配置:

允许 http 请求 ,ios 9 之后需要添加,便于向服务器发送请求

NSAppTransportSecurity

NSAllowsArbitraryLoads

添加定位权限,ios8之后需要添加,否则无法定位

NSLocationWhenInUseUsageDescription

YES

NSLocationAlwaysUsageDescription

YES

三、iOS程序进入后台后十分钟之内就会被系统kill掉,怎么解决呢?

解决: 利用苹果给出的三种类型的程序可以保持在后台运行:音频播放类,位置更新类,另外一个记不太清楚了,我利用了苹果给出的音频播放类的这个“特权”来满足我程序上的要求

1、步骤一:在Info.plist中,添加”Required background modes”键,value为:App plays audio

步骤二:

(BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions

{

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

// Override point for customization after application launch.

NSError *setCategoryErr = nil;

NSError *activationErr = nil;

[[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategoryPlayback

error: &setCategoryErr];

[[AVAudioSession sharedInstance]

setActive: YES

error: &activationErr];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

步骤三:将以下代码添加到appDelegate文件中的- (void)applicationDidEnterBackground:(UIApplication *)application函数,也可添加到在具体类中注册的应用进入后台后的通知方法

(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;

}

});

});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  后台