我有一个Callkit功能的应用程序.当我按下扬声器按钮时,它将闪烁并设置为关闭状态(有时扬声器设置为LOUD但图标仍然是OFF).当我多次点击它时......可以清楚地看到此功能的行为不正确.
然而,WhatsApp在开始时扬声器关闭,3秒后它激活它和它的工作.有没有人遇到类似的东西,可以给我一个解决方案?
当我的应用程序在前台时,它需要轻松检测呼叫事件,如呼叫连接,呼叫断开,但当我的应用程序进入后台时,它不会检测到任何呼叫事件.
所以,我怎么可以检测呼叫事件,如呼入和呼出的背景是什么?我正在研究CallKit框架iOS 10和XCode 8.我发现iOS 10中已经弃用了核心电话框架.
我正在使用CXCallObserverDelegatePattern观察呼叫.
我想计算呼叫期间来电和去电的通话时长.
我试图获得相同的结果,可以在使用CallKit 增强VoIP应用程序的 29:52秒看到- WWDC 2016.在该视频中,它显示在应答呼叫之后,按钮被动画移动和更改,并且屏幕保持在原生呼叫中UI.
我构建了扬声器盒并尝试了"模拟来电"功能,但是一旦通过应答呼叫按钮应答呼叫(视频上显示的操作相同),本机呼叫屏幕就会消失,应用程序屏幕显示为活动状态列表中显示的呼叫(与WWDC视频中显示的不同):
虽然在从Incoming Call本机UI转换到应用程序的过程中有一个本机调用UI屏幕非常短的时间,但我找不到如何强制它留在该屏幕上.在调试Speakerbox应用程序之前,没有任何委托方法被调用,直到所有本机屏幕都消失并且应用程序已经打开.
我已经测试了在屏幕被锁定时接收来电,在这种情况下显示了本机UI:
我想在非锁定手机上取得同样的效果.
TLDR:从后台检测呼叫结束事件 请参阅以下问题的更新:
是否可以使用Swift从后台状态检测/获取IOS 10中的呼叫状态事件.在早期版本中有一个CORE Telephony api,但现在似乎已经弃用了.
我见过CallKit Api, 但它说这是基于VOIP的呼叫.我需要获得正常的CDMA/GSM呼叫状态,而不是基于VOIP的呼叫,并且当呼叫结束时只需向服务器发出通知.我不需要访问任何可能是隐私问题的数据点,只需要一个事件,当呼叫结束时,然后我的应用程序将是一个后台应用程序将启动.而已.有关如何做到这一点的任何指示?
更新:使用CallKit Api虽然无法区分voip和普通的GSM呼叫,但我能够获得呼叫状态.我可以解决这个问题.我也可以通过以下方式获得本地通知.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
application.beginBackgroundTask(withName: "showN", expirationHandler:nil)
return true
}
extension AppDelegate: CXCallObserverDelegate {
func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
if call.hasEnded == true {
print("Disconnected")
let trigger = UNTimeIntervalNotificationTrigger(timeInterval:60,repeats:false)
let identifier = "MyCallLocalNotification"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
center.add(request, withCompletionHandler: …Run Code Online (Sandbox Code Playgroud) 我们有一个应用程序,它严重依赖于能够使用iOS访问用户的会话令牌Keychain.当我们的应用程序打开时,首先检查的是令牌是否可用 - 如果没有,我们会向用户显示登录屏幕.我们不使用任何第三方库,并使用Keychain's SecItemAdd()/ SecItemCopyMatching()直接使用以下选项:
kSecClassGenericPasswordkSecAttrAccessibleAlwaysThisDeviceOnly在正常使用期间,我们看到很少甚至没有问题.
问题
我们已经有用户报告,在打开他们的应用程序时,他们会显示登录屏幕(建议Keychain无法找到值),当他们实际登录时.我们发现在这个例子中,我们发现在杀死和重新启动时该应用程序,用户恢复正常(会话被发现Keychain).一旦我们发现这一点,我们尝试添加一个指数退避来继续查询Keychain,认为它可能只在前几秒内不可用.这不起作用,并向我们证明Keychain似乎无法用于整个应用程序启动会话.我们无法重现此问题.它似乎非常间歇性地发生.
经过进一步调查,我们发现通常,用户在遇到此问题之前已收到VoIP推送.我们仍然无法可靠地重现这个问题,但是在调试时发现我们Keychain.session被发现是nil在接收这些推送时(我们也依赖它),这是在用户打开他们的应用程序之前看到他们是伪"退出".
我们使用PushKit和PKPushRegistry进行VoIP推送.这要求我们的应用程序启用"后台模式:IP语音".我们按照Apple的文档建议使用所有这些.这是一个示例:
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
guard let _ = Keychain.session else {
print("Session token not available")
return
}
handle(notification: payload.dictionaryPayload)
}
Run Code Online (Sandbox Code Playgroud)
此代码依赖于Keychain.session在接收VoIP推送时立即可用.如前所述,我们已经看到了它不可用的实例,因此这个函数退出并简单地返回.
我也发现了这个相关的Apple论坛帖子,暗示这可能是一个iOS错误.
有谁可以帮我们解决这个问题?任何帮助将不胜感激.即使这实际上是一个iOS错误,我们也可以采用解决方法.
升级到iOS Beta 13之后,我注意到了一件不愉快的事情:我的应用有时会因传入的VoIP推送而崩溃。
在崩溃报告中,我看到以下内容:
iOS 13 Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP callback
Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0x1af21b9f0 __exceptionPreprocess
1 libobjc.A.dylib 0x1af7284fc objc_exception_throw
2 CoreFoundation 0x1af11efec +
[_CFXNotificationTokenRegistration keyCallbacks]
3 Foundation 0x1aeda1330 -[NSAssertionHandler
handleFailureInMethod:object:file:lineNumber:description:]
4 PushKit 0x19caa6b54 -[PKPushRegistry
_terminateAppIfThereAreUnhandledVoIPPushes]
5 libdispatch.dylib 0x1afa441ec _dispatch_client_callout
6 libdispatch.dylib 0x1af9f6c6c
_dispatch_lane_barrier_sync_invoke_and_complete
7 PushKit 0x19caa5b74 __73-[PKPushRegistry
voipPayloadReceived:mustPostCall:withCompletionHandler:]_block_invoke
8 libdispatch.dylib 0x1afa43678
_dispatch_call_block_and_release
9 libdispatch.dylib 0x1afa441ec
_dispatch_client_callout
10 libdispatch.dylib 0x1af9f61f8
_dispatch_main_queue_callback_4CF$VARIANT$mp
11 CoreFoundation 0x1af1992a0
CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE …Run Code Online (Sandbox Code Playgroud) 我正在使用Callkit和Linphone开发iOS voip应用程序.当我收到来电时,系统显示本机电话用户界面,用户接受或拒绝接听电话,当用户点击接听按钮时,呼叫开始但电话用户界面消失.
如何在用户接听电话后保留原生手机用户界面,例如whatsapp吗?
此外,如何在开始拨出电话时显示本机电话用户界面?
这是我的providerDelegate代码:
func reportIncomingCall(uuid: UUID, handle: String, hasVideo: Bool = false, completion: ((NSError?) -> Void)? = nil) {
// Construct a CXCallUpdate describing the incoming call, including the caller.
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: handle)
update.hasVideo = hasVideo
// Report the incoming call to the system
provider.reportNewIncomingCall(with: uuid, update: update) { error in
/*
Only add incoming call to the app's list of calls if the call was allowed (i.e. there was no …Run Code Online (Sandbox Code Playgroud) 是否可以在iOS 11中创建白名单呼叫阻止应用程序?
例如,我想阻止除联系人列表中的所有号码以外的所有号码.
看起来api只允许您创建要阻止的数字列表,而不是允许的数字列表.
我正在尝试使用flutter,CallKit(iOS)和ConnectionService(Android)使电话录音与本机UI集成一起使用。
由于没有关于将flutter与CallKit和ConnectionService或任何其他服务集成以实现无需root访问权限或越狱即可进行类似于系统的呼叫记录的指南,因此这个问题已经存在。有许多可用于越狱设备的应用程序,而android本身支持呼叫记录,但是没有具体的指南来实现使用flutter的实现。
将flutter 1.7与AndroidX支持结合使用可实现棉花糖+ ConnectionService的向后兼容性。
预期结果是自动记录呼叫或提示用户在有来电时进行记录。
当前根本无法做到这一点,也许我缺少文档中必不可少的东西,或者我没有足够的专门知识来成功执行使用flutter创建系统支持的呼叫记录应用程序。
我正在使用Webrtc和Callkit进行呼叫.当应用程序是前台时,一切正常,但如果屏幕被锁定,我接听电话音频只能在我这边工作(我可以听到音频,但我的声音没有发送).
当用户进入应用程序时,一切都已修复.
所有后台设置和功能都已正确设置.
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
<string>remote-notification</string>
<string>voip</string>
</array>
Run Code Online (Sandbox Code Playgroud)
我尝试使用RTCAudioSession和AVAudioSession配置音频,但在这两种情况下它都以相同的方式工作.