如何使用 CTCallCenter:setCallEventHandler: 获取应用程序暂停时发生的通话事件?

2023-12-19

CTCallCenter:setCallEventHandler: 的文档指出:

但是,调用事件也可能在您的应用程序运行时发生 暂停。暂停期间,您的申请不会收到 调用事件。当您的应用程序恢复活动状态时,它 为每个更改状态的呼叫接收一个呼叫事件

与这个问题相关的部分是

当您的应用程序恢复活动状态时,它会收到一个 每个更改状态的调用的调用事件

这意味着应用程序将收到过去在应用程序暂停期间发生的呼叫的呼叫事件。根据这个问题的答案这是可能的:Navita TEM 应用程序如何获取通话记录信息? https://stackoverflow.com/questions/21193088/how-does-the-navita-tem-app-get-call-log-information

我的问题是:如果我的应用程序被挂起并且发生了呼叫,那么当我的应用程序恢复活动状态时,它如何检索发生的呼叫的呼叫事件?

我尝试了很多很多代码实验,但当我的应用程序恢复活动状态时,无法检索任何呼叫信息。

这是我尝试过的最简单的事情: 1) 使用 Xcode 单视图应用程序模板创建一个新项目。 2)将如下代码添加到didFinishLaunchingWithOptions中 3)启动应用程序 4) 远离应用程序的任务 5) 从另一台设备拨打电话、接听电话、从任一设备挂断电话 6) 将应用程序带回前台,从而恢复活动状态。

注册通话事件的代码是:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
        self.callCenter = [[CTCallCenter alloc] init];
        [self.callCenter setCallEventHandler:^(CTCall *call)
         {
             NSLog(@"Event handler called");
             if ([call.callState isEqualToString: CTCallStateConnected])
             {
                 NSLog(@"Connected");
             }
             else if ([call.callState isEqualToString: CTCallStateDialing])
             {
                 NSLog(@"Dialing");
             }
             else if ([call.callState isEqualToString: CTCallStateDisconnected])
             {
                 NSLog(@"Disconnected");

             } else if ([call.callState isEqualToString: CTCallStateIncoming])
             {
                 NSLog(@"Incomming");
             }
         }];  

    return YES;
}

使用此代码,如果呼叫发生时应用程序位于前台,我就能够获取呼叫事件。但是,如果我在拨打电话之前离开应用程序,那么当我的应用程序下次恢复活动状态时,我将无法收到呼叫事件 - 正如 Apple 文档中所述。

我尝试过的其他事情:

1)文档指出块对象是在默认优先级全局调度队列上调度的,因此我尝试将 setCallEventHandler 的注册放在其中dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})

2)在appBecameActive中调用setCallEventHandler:而不是didFinishLaunchingWithOptions

3) 向应用程序添加后台功能 - 通过 beginBackgroundTaskWithExpirationHandler 和/或使用 startUpdatingLocation 或 startMonitoringForSignificantLocationChanges 进行位置更新。

4)上述的各种组合。

一旦我的设备上运行了能够获取应用程序暂停时发生的呼叫事件的代码,就会获得赏金。

这是在 iOS 7 上。


我找到了解决方案,但我不知道它为什么有效。我唯一能想到的是 GCD 和/或 CoreTelephony 中的错误。

基本上,我分配了两个实例CTCallCenter像这样

void (^block)(CTCall*) = ^(CTCall* call) { NSLog(@"%@", call.callState); };

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    callCenter1 = [[CTCallCenter alloc] init];
    callCenter1.callEventHandler = block;

    callCenter2 = [[CTCallCenter alloc] init];
    callCenter2.callEventHandler = block;

    return YES;
}

Swift 中的类似代码:

func block (call:CTCall!) {
        println(call.callState)
    }

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //Declare callcenter in the class like 'var callcenter = CTCallCenter()'
        callcenter.callEventHandler = block

        return true
    }

为了测试这一点,我拨打了一个电话,接听电话,然后在应用程序处于后台时挂断电话。当我启动它时,我收到了 3 个呼叫事件:传入、已连接、已断开。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CTCallCenter:setCallEventHandler: 获取应用程序暂停时发生的通话事件? 的相关文章

  • “UITableView”类型的值没有成员“sectionHeaderTopPadding”

    为什么我在 Xcode 12 4 模拟器 ios 14 x 中收到以下代码的构建错误 if available iOS 15 0 myTableView sectionHeaderTopPadding 0 0 error here 错误是
  • 使用 Objective-C 将 XMP 数据嵌入到 PNG

    我需要将自定义 XMP 文件嵌入到 iOS 应用程序中的 PNG 中 到目前为止 我能做的就是编译 Adob e XMP 工具包 生成 Xcode 项目 然后正确编译该项目 从那里我不知道如何在我的 Xcode 项目中使用该库以及如何使用它
  • 当现有的转换或演示正在进行时;导航堆栈不会更新

    我遇到过这个警告 PushViewController animated 在现有转换或演示文稿运行时调用 发生 导航堆栈不会更新 当试图打电话时navigationController popViewControllerAnimated f
  • 标签栏不显示图标?

    我读了一堆相关的问题 我尝试了他们所说的 但没有任何效果 不知道为什么 所以 我有3个不同的UIStoryboards 第一个是处理登录 注册的 Auth Storyboard 并且有一个对第二个 Storyboard 选项卡栏 Story
  • iCarousel 滚动不顺畅

    我正在使用 iCarousel 滚动标签 在模拟器上一切正常 但在 iPad iPhone 上滚动不顺畅和快速 这是代码 城市列表视图 h import
  • NSUserDefaults 无法保存 NSMutableDictionary

    我尝试使用以下代码将 NSMutableDictionary 保存到 NSUserDefaults NSUserDefaults def NSUserDefaults standardUserDefaults NSMutableDictio
  • iOS 静态与动态框架说明

    我不得不承认 随着 iOS 8 的发布 我对 iOS 中的动态框架和静态框架有点困惑 我正在寻找一种方法来分发我创建的库 并且我需要支持 iOS 7 及更高版本 注意 这将是一个专有框架 我不能使用 cocoa pods 也不能分发源代码
  • 如何将 UIImage 和 UILabel 合并为一张图像并保存

    我有 2 个 UILabels 和 2 个图像 我需要将它们合并到一个 UIImage 中进行保存 我知道我可以用屏幕截图来做到这一点 但我的主图像是圆形的 所以如果我对其进行校正 它仍然会显示锐利的边缘 我可以这样做来组合图像 CGSiz
  • iOS WebView 空白

    我已使用 YouTube 的标准嵌入网址在我的 iOS 8 3 应用程序中嵌入了 YouTube 视频 sample http www youtube com embed HkAK9QRe4ds 它按预期工作 但看起来很奇怪 那个白色间隙
  • Xcode 5:单元测试未运行

    我创建了一些测试用例 它们都通过了 那是因为它们没有被运行 从 Xcode 中 我得到 Test Suite All tests started at Test Suite All tests finished at Executed 0
  • 如何缩放 CAShapeLayer

    我很快就成功制作了动画bezier path它包含在一个CAShapeLayer 我唯一的问题是将其实现到其他屏幕尺寸上 有谁知道我如何扩展CAShapeLayer里面有路径吗 即使其变为原始大小的一半 使用这个函数 var shapela
  • iOS7:我们可以在 Dynamic Type 中使用 Helvetica Neue 以外的字体吗?

    我们正在为 iOS7 设计一个应用程序 我们的设计师想要使用非默认字体 Avenir 但我不想失去动态类型功能 据我了解 动态类型只能与默认系统字体 Helvetica Neue 一起使用 是否可以使用其他字体 或者目前无法选择 据我了解
  • Vimeo 播放器 JS API 在 iOS 中无法运行

    我正在尝试使用 API 来播放视频 但只有在 iOS 中单击播放器中的播放按钮后它才有效 在桌面版和 Android 版 Chrome 中 它运行良好 http codepen io bdougherty pen JgDfm http co
  • Xcode 8 提交时“应用程序签名中缺少 aps 环境权利”

    我有一个应用程序 我们在过去 6 个月内提交了数十个版本 并且我们确实使用 APNS 升级到 Xcode 8 后 我收到了来自 Apple 的以下电子邮件 亲爱的开发者 我们发现您最近的交货存在一个或多个问题 应用程序名称 您的交货是 成功
  • 文件是为存档而构建的,这不是正在链接的体系结构(i386)

    我必须构建静态库 我想在我的 iPhone 和 iPad 应用程序中使用 当我尝试运行模拟器时 出现链接错误 我是 iOS 开发新手 请帮忙 ld 警告 忽略文件 Users valuelabs Desktop DruvaProject l
  • 如何在 iPhone 上缩小 UIPickerView?

    我想降低一个高度UIPickerView在我的 iPhone 应用程序中 使其仅显示一行和一列 选择器视图的高度应等于行的高度 我正在使用 Interface Builder 来构建UIPickerView 但我找不到调整此控件大小的简单方
  • 高度在 IOS (iphone) 上无法正常工作

    我已经创建了this https codepen io salman15 project live DWbWpo Codepen 上的网站 在尝试使其响应所有平台时 我遇到了问题 看起来单个 div 覆盖了整个页面 仅在 IOS 上 并且并
  • Siri - 联系人搜索行为类似于 Skype 的音频通话

    我正在实现一个 VoIP 应用程序 我需要通过 Siri 发起呼叫 我能够通过 Siri 发起呼叫 但问题是 每次启动应用程序时 尽管联系人不在应用程序的联系人列表中 我不知道如何以及在哪里处理这个问题 我的意思是 如果应用程序没有像 Sk
  • 是否可以在“NSFetchRequest”中按子类排序而不添加其他属性?

    我想对结果进行分组NSFetchRequest按实体 这些实体都共享相同的抽象父级 例如 animal cat dog The NSFetchRequest has includesSubentities set TRUE and enti
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa

随机推荐