先说下网络开源的sip产品:
1)PJSIP 这是一个开源库,研究的不多,因为没有那个时间去重最基本的区开发,毕竟不是专门做这方面的,所以直接去找做好的开源产品。
2)linphone 这是我最开始找到的开源产品,网上推荐率很高,音质十分清晰,适合做点对点语音,但是开始着手的时候遇到两个问题,一 是国外资源封杀的厉害,资源十分难下载; 二 是其编译实在麻烦,下了一堆库和编译环境,完全按照官网的步骤,发现还是有些地方编译不过,在linphone上的编译上就耗了我一周时间,最主要的还是网络限制,大部分编译环境和工具都得在国外网站下载,耗了比较多时间,一周之后,我果断放弃linphone,继续找其他开源产品。
3)siphon 在陆续找到很多开源sip产品后,最后选择了siphon;两个原因, 一 比较好编译 二 音质还不错,这个软件基本的带电话和接电话功能,不过经过使用发现其没有后台接电话功能,最扯是我快弄完的时候才发现没有后台。后台部分下面后说到,这里只列举下我遇到的开源sip产品。
4)idoubs 这个就牛B了,这是在我发现siphon没有后台后,在经过网上各种说如何实现VIOP后台的帖子折磨后找到的一个开源软件,音质和linphone不相上下,且实现点对点视频功能,可以说满足了大部分人得需求了,编译也十分简单,按官网步骤走即可,两个文件夹,一个doubango库,这是基础库,很好的封装了sip电话的各种功能,比较大,大概850M;一个是idoubs,这个实现了sip电话的UI部分,这个才23M。这个最重要的是实现了后台运行和接电话功能,就是可以home键切出后可以有来电提醒,不过这个和网上说的利用 TCP+socket 来实现后台不同的是,这是利用后台播放静默音乐来实现,后台部分也有些bug,如 接真实电话、音乐播放软件后台播放和暂停、微信的语音播放都会打断这个静默音乐的播放,导致后台失败,破解方法后面会说到。
杂谈 一一 ios4之后 和 ios7新增 的后台部分知识:
前言:iOS不是真正的多任务系统,在用户按下Home按钮后,所有应用程序都会进入后台状态,并且大部分都会迅速进入暂停状态,应用程序的所有工作内存都在RAM中,在暂停时它完全不执行。因此,切换回这样的应用程序非常快。但是如果系统需要更多的内存给当前处于活动状态的应用程序,就有可能终结暂停状态的应用程序,它们的内存也将被释放。
一方面,应用程序在进入后台状态时,需要释放一些资源,使自身的暂停快照更小,从而减少从RAM中清除的风险,另一方面,为了避免被终结而丢失用户的数据,需要在用户离开时保存他们的进度信息,这些工作,需要在5秒钟内完成,不然会被系统认定有异常被强制退出。可能通过接收应用程序发送的通知
ios4及之后
1)请求后台任务 (600s 以内)beginBackgroundTaskWithExpirationHandler ^{}
作用 : 可以切后台后进行一些未完成的下载和比较重要的事情,如短时间的下载,消息的发送,未完成的上传,反正在600s内app可以做任何事情。
注意:按home键后,会运行一段时间来执行代码,如无代码,3分钟左右执行block。
按锁屏键后,ios6及之前会活跃来执行代码,但是在ios7中,后台任务处理方式发生改变,锁屏后后台任务暂时暂停已节省电力,之后在特定时间如检查邮件或接电话时,之前暂停的后台任务一起执行,就是说,系统不会专门为第三方应用保存设备处于活动状态。
用法:
- (void) doUpdate
{
[self beginBackgroundUpdateTask];
//重要任务 当然,这时app运行着,可以继续执行任何之前正在执行的代码 所有有时候重要任务只是sleep() //来请求时间运行app
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:@"xxx"]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
// Do something with the result
//如果没有这句,会
[self endBackgroundUpdateTask];
}
- (void) beginBackgroundUpdateTask
{
self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
//当系统后台时间即将结束的时候,系统会运行这个代码结束,否则app不是缓存到内存,而是直接杀死app
//当然,你可以继续backgroundTimeRemaining来获取剩余时间
//就算被杀死,调用applicationWillTerminate继续执行 5s 来保存数据
//applicationDidEnterBackground 按home切后台执行,杀死并不执行
[self endBackgroundUpdateTask];
}];
}
- (void) endBackgroundUpdateTask
{
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}
2)iOS在后台每隔一段时间执行一下 (600s 以外) setKeepAliveTimeout : time handler : ^{}
作用:如app每隔一小时去刷新登录的key值,避免key值失效。
注意:1)要成功调用该函数,就必须在Info.plist里设UIBackgroundModes键的array值之一voip字符串;
2)timeout必须>=600;
3)唤醒app的时间间隔是不精准的;
4)唤醒后只有10秒执行时间。即handler里的代码要在10秒类执行完。10秒后app再次被阻塞。(可以 用-backgroundTimeRemaining属性来查看返回剩余时间);
5)该函数成功调用后,在程序生命周期内有效,该函数的效果在回到前台的状况下,依然有效。(因此可以 把它当timer使.) ;
6)clearKeepAliveTimeout函数用来清除handler;
用法:1)在info.plist里加入UIBackgroundModes键,其值为数组,数组之一为voip字符串;
2)如下;
- (void) viewDidLoad
{
[super viewDidLoad];
//刷新KEY
[[UIApplication sharedApplication] setKeepAliveTimeout:1*60*60 handler: ^{
//做一些你希望做的事情
}];
}
IOS7 新增的后台功能
前言:
在iOS7之前,系统所接受的应用多任务可以大致分为几种:
iOS7后台的变化在于以下四点: