对于我们的app要求后台也实时录音并推流主要要注意两点:
保证app进入后台后实时录音 保证app进入后台后实时推流、或者蓝牙语音数据交互
1.设置应用为voip应用
打开-info.plist文件,加入如下的key
Required background modes,追加
//保证app进入后台后实时录音 App plays audio or streams audio/video using AirPlay
//保证app进入后台后实时推流 App provides Voice over IP services
2.将socket设置成异步模式,并将socket设置成VOIP类的,以便系统能够托管它。
//保证不关闭原来的socket
CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)(mosq->sock), &readStream, NULL);
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse);
//设置成voip socket
CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
3.安装keepAliveTimeout handler,让系统每隔一段时间重新建立连接
UIApplication *application = [UIApplication sharedApplication];
[application setKeepAliveTimeout:600 handler:^{ [self reconnect]; }];
到这里始直播然后将app切入后台会发现屏幕顶部会有一条红色条,然后用播放器播放会发现录音与推流成功。
如果是在蓝牙方面在后台跟设备进行语音数据交互的话只需要上面第一步
再添加后台运行蓝牙模式即可
1.修改Info.plist文件,添加Required background modes键,并添加下面2个item
- bluetooth-central
- bluetooth-peripheral
这两个item的意义分别为:
- App communicates using CoreBluetooth
- App shares data using CoreBluetooth
2.最后开启后台模式
NSArray *backgroundModes = [[[NSBundle mainBundle] infoDictionary]objectForKey:@"UIBackgroundModes"];
if ([backgroundModes containsObject:@"bluetooth-central"]) {
//后台模式
_cMgr = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue() options:options];
}
这时候在app切入后台就会发现可以跟蓝牙设备通话,屏幕顶部也会有一条红色条