我有一个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: …我们有一个应用程序,它严重依赖于能够使用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)
}
此代码依赖于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 …我正在使用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 …是否可以在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>
我尝试使用RTCAudioSession和AVAudioSession配置音频,但在这两种情况下它都以相同的方式工作.