苹果在WWDC2016推出了iOS10系统新功能CallKit,可以调起系统的电话接听页,配合iOS8推出的PushKit使用,形成了一套完整的VoIP解决方案。这篇文章主要记录了实现VoIP时遇到的问题以及对CallKit与PushKit的一些理解。
效果图如下,因为CallKit使用的是系统原生的控件, iOS10与iOS11的样式上有区别(左边两张图是iOS10样式):
-
闲鱼调用的逻辑图:
下面是CallKit和PushKit这两个库的简单介绍:
CallKit主要有:CXProvider、CXCallController、CXProviderConfiguration这三个类,CXProvider提供系统电话界面有关的处理逻辑,CXCallController则是将用户在App界面上的操作通知给系统 ,使用时需要新建一个CallKit管理类并实现CXProviderDelegate协议。 实现步骤如下:
1,设置CXProviderConfiguration
static CXProviderConfiguration* configInternal = nil;
configInternal = [[CXProviderConfiguration alloc] initWithLocalizedName:@"闲鱼"];
configInternal.supportsVideo = true;
configInternal.maximumCallsPerCallGroup = 1;
configInternal.maximumCallGroups = 1;
configInternal.supportedHandleTypes = [[NSSet alloc] initWithObjects:[NSNumber numberWithInt:CXHandleTypeGeneric],[NSNumber numberWithInt:CXHandleTypePhoneNumber], nil];
UIImage* iconMaskImage = [UIImage imageNamed:@"IconMask"];
configInternal.iconTemplateImageData = UIImagePNGRepresentation(iconMaskImage);
2,初始化CXProvider与CXCallController
self.provider = [[CXProvider alloc] initWithConfiguration: configInternal];
[provider setDelegate:self queue:dispatch_get_main_queue()];
self.callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()];
3,实现通话流程或按钮的回调方法(每个回调结束的时候要执行[action fulfill];否则会提示通话失败)
- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action;
- (void)