我在我的 iOS 项目中实现了 callKit,我使用 callDirectory 扩展来阻止和识别数字,块部分工作正常,唯一的问题是当我尝试添加要识别的数字时:
private func retrievePhoneNumbersToIdentifyAndLabels() -> (phoneNumbers: [String], labels: [String])? {
// retrieve list of phone numbers to identify, and their labels
interDefaults?.synchronize()
if let numbers = interDefaults!.string(forKey: "ident-numbers"){
if let identities = interDefaults!.string(forKey: "ident-identities"){
let formattedNumbers = numbers.characters.split{$0 == "*"}.map(String.init)
let formattedIdent = identities.characters.split{$0 == "*"}.map(String.init)
return (formattedNumbers, formattedIdent)
}
}
return ([""], [""])
}
Run Code Online (Sandbox Code Playgroud)
当我尝试重新加载扩展时,它失败并显示错误: Error Domain=com.apple.CallKit.error.calldirectorymanager Code=3 "(null)"
通过一些测试,我发现通过用formattedIdent 一个包含 1 个元素 EXP 的数组替换:["Spamm Caller"]扩展工作完美并且没有显示错误,但是当我使用一个包含多个元素的数组时,会出现相同的错误。我做错了什么??提前致谢
我正在尝试集成CallDirectory Extension以阻止某些来电.但应用程序甚至无法识别为阻止提供的数字.是否有人成功地做到了这一点?你可以看到我用过的格式..
private func addIdentificationPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws {
let phoneNumbers: [CXCallDirectoryPhoneNumber] = [ 18775555555, 18885555555,+91949520]
let labels = [ "Telemarketer", "Local business","myPhone"]
for (phoneNumber, label) in zip(phoneNumbers, labels) {
context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)
}
}
Run Code Online (Sandbox Code Playgroud)
而且,我将此称为开发.http://iphoneramble.blogspot.in/2016/07/ios-10-callkit-directory-extension.html
测试设备和iOS版本 - iphone 5s,iOS 10.1
我正在使用 PJSip 库构建一个 iOS voip 应用程序。我也在使用 CallKit。在通话过程中,如果有另一个来电,则会显示带有保持和接听、结束和接听...的呼叫等待屏幕。但是没有蜂鸣声,因此用户可以收到新来电的通知。我想以某种方式发出哔哔声。有人请帮忙。
我正在将现有的VoIP应用程序转换为Callkit.我有很多代码,但不知何故,当我初始化CXProvider时,它将调用providerDidBegin,然后立即调用providerDidReset.它没有给出理由.之后我无法注册其中一个外拨电话,因为我的提供商没有激活.
我已经尝试过查看证书,设置等等,但基本上我不需要比我已经拥有的VoIP应用程序更多.
CallKit调用reset方法的调用如下:
CallKit`__42- [CXProvider handleConnectionInterruption] _block_invoke:
当我深入挖掘它的来源时,它与NSXPCConnection有关.这是什么联系,我该如何设置它?
当然,连接没有中断.
这是我初始化我的代表的方式:
- (id)init {
self = [super init];
self.configuration = [[ProviderConfiguration alloc] init];
self.provider = [[CXProvider alloc] initWithConfiguration:self.configuration];
[self.provider setDelegate:self queue:dispatch_get_main_queue()];
return self;
}
Run Code Online (Sandbox Code Playgroud)
这就是配置的样子:
- (instancetype)init {
self = [super initWithLocalizedName:@"MyCompany"];
self.supportsVideo = NO;
self.maximumCallsPerCallGroup = 1;
self.supportedHandleTypes = [[NSSet alloc] initWithObjects:[NSNumber numberWithInt:(int)CXHandleTypePhoneNumber], nil];
self.maximumCallGroups = 1;
self.maximumCallsPerCallGroup = 5;
return self;
}
Run Code Online (Sandbox Code Playgroud)
两个回调都已实现:
- (void)providerDidBegin:(CXProvider *)provider {
NSLog(@"Begun");
}
- (void)providerDidReset:(CXProvider *)provider {
NSLog(@"Reset");
}
Run Code Online (Sandbox Code Playgroud) 在使用WebRTC和CallKit时,我对如何配置音频会话感到很困惑.我提到了Speakerbox App,但是有一个单独的AudioController用于配置音频会话.当我实施这个时,我听到了自己的声音.我不知何故认为我需要使用RTCAudioSession配置音频会话,而不是使用Speakerbox App中使用的AudioController.
如果我是正确的请告诉我如何使用RTCAudioSession配置音频会话,如果没有,那么我如何解决我自己的声音被听到的问题.
我已经浪费了很多时间,没有在任何地方如何做到这一点,而且我也找不到WebRTC和CallKit的任何教程.
在一个应用程序上工作,我在其中集成了用于 VoIP 呼叫的 Linphone。我正在使用 CallKit 进行来电,以便为我的应用程序提供原生触摸。
在 iOS 11 之前一切正常。问题似乎与音频会话的创建有关。第一次它工作正常,但在随后的运行中它无法在耳机中发出声音。确切的问题是与音频会话相关的不一致意味着我无法使用麦克风来捕捉声音,而另一端的用户无法听到我的声音。
我注意到它在创建 AVSession 的共享实例并设置类别类型后触发 AVAudioSessionRouteChangeNotification 并且在 AVAudioSessionRouteChangeReasonCategoryChange 的情况下切换案例。当我打印类别类型时 - 它给出了名为 AVAudioSessionCategoryPlayAndRecord 的正确选择的类别。
让您知道,如果我在用于 AVAudioSessionRouteChangeReasonCategoryChange 通知的方法中的 switch-case 中放置断点并打印命名的类别,那么它工作正常。可能在那时它有足够的时间来创建音频会话并通过麦克风捕捉声音。
使用下面的代码来设置 Audio Session,如 SpeakerBox 示例中给出的 -
- (void)setupAudioSession
{
try {
// Configure the audio session
AVAudioSession *sessionInstance = [AVAudioSession sharedInstance];
// we are going to play and record so we pick that category
NSError *error = nil;
[sessionInstance setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
XThrowIfError((OSStatus)error.code, "couldn't set session's audio category");
// set the mode to voice chat …Run Code Online (Sandbox Code Playgroud) 我正在使用 PushKit 和 CallKit 开发 VoIP 应用程序。我知道类似的问题在不同的论坛上经常被问到,但不幸的是从未得到真正的回答。此外,这些帖子中的大多数都是 2015 年左右的,所以我认为很可能已经发生了很多变化,因为有人可能同时想到了如何让这个工作发挥作用。
当应用程序在前台运行或发送到后台时,它也会使用沙箱服务器以及生产服务器接收推送通知。
我使用的是 iOS 11 和 Xcode 9,需要在“功能”中启用常规推送通知,以及手动将 voip 后台模式添加到 info.plist 以便调用委托方法。仅链接 CallKit 和 PushKit 不足以接收通知。我还启用了后台音频、后台获取和远程通知。我还在进行推送注册表注册之前创建了一个后台任务,并在收到推送令牌后结束该任务。
重启后唤醒应用程序或来电时强制退出。
我看到在仪器活动监视器中的来电上启动了该进程,但看起来有些东西无法正常工作,因为我没有收到来电用户界面。
-pushRegistry:didReceiveIncomingPushWithPayload:forType:或者也许(仅)-application:didFinishLaunchingWithOptions:?更新:
我自己想出了一个解决方案。这更多的是客户端和服务器之间的时间问题。所以这对我有用。
同样重要的是不要过早调用推送通知委托上的完成处理程序,这将使应用程序重新进入睡眠状态并且永远不会收到 INVITE。
也可能有帮助,并且可以让场景变得更加宽容。如果您的 sip 服务器多次发送邀请,请确保每次都使用最新的注册信息。意思是……假设第一个 INVITE 发送得太早,导致某些过时的注册信息,并且客户端仍然尝试在服务器上更新该信息……确保下一个 INVITE 使用更新的信息。某些 sip 服务器仅使用每次迭代可用的第一个信息。所以你会永远等待而没有收到客户端的任何信息。
当我在 CXStratCallAction 中请求 CXTansaction 时,它将错误消息显示为 "Error Domain=com.apple.CallKit.error.requesttransaction Code=1 "(null)" ". 任何人都可以解释此错误消息。
我们使用CallKit和PortSIP编写VoIP应用程序,这是一个仅在iOS 11.2.x上重现的问题.当用户点击CallKit上的扬声器按钮时,屏幕系统启用扬声器,但图标仍处于禁用状态.如果用户再次点击,系统也会打开扬声器并忘记按钮.要禁用扬声器用户,请按两次按钮.有人遇到过这个bug吗?你的解决方案是什么?(:
谢谢.
在 iOS 中,可以使用CallKit 的 reportIncomingCall来显示来电 ui 。
就我而言,这在物理设备中按预期工作。我的 iPhone 收到来电提醒,我可以接听电话或拒绝接听电话。
但是,它似乎无法在 iOS 模拟器中运行。更具体地说,reportNewIncomingCall方法调用本身成功,但随后它立即结束(我什至没有看到任何调用警报)。另外,func provider(_ provider: CXProvider, perform action: CXEndCallAction)从CXProviderDelegate中被调用,这意味着调用已经结束。
我在苹果官方文档中找不到是否可以在iOS模拟器中测试CallKit - reportIncomingCall。
奇怪的是,用reportOutgoingCallwith拨出电话CXCallController似乎在模拟器中工作得很好,因为我可以看到绿色状态栏显示在 iPhone 的顶部,当CXStartCallAction完成时。
所以我唯一无法让它工作的是在 iOS 模拟器中使用 CallKit 接收呼叫。这是预期的行为吗?
callkit ×10
ios ×9
swift ×5
objective-c ×2
voip ×2
audio ×1
callblocking ×1
ios11 ×1
iphone ×1
pjsip ×1
portsip ×1
pushkit ×1
silentpush ×1
webrtc ×1