【问题标题】:iOS CallKit CXCallObserver delegate method callChanged never firesiOS CallKit CXCallObserver 委托方法 callChanged 永远不会触发
【发布时间】:2018-08-15 16:12:55
【问题描述】:

我读过其他几篇文章,例如这篇文章:iOS: Could not get outgoing call events in CallKit。解决方案总是确保对 CXCallObserver 对象的引用是强的,这样它就不会在需要之前消失。我相信我已经做到了,但仍然有问题。我使用的是 Objective-C,SDK 11.3;代码构建良好,没有错误或崩溃发生。 callChanged 方法永远不会触发。有什么想法吗?

这是我的代码:

CXCallObserverDelegate.h:(不知道为什么我需要自己创建它,但没有它我的代码将无法构建。但是,当我这样做时,我会收到“忽略重复定义”的警告。不是看起来这应该是个问题,但可能是这样吗?)。

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

@protocol CXCallObserverDelegate

    - (void)callObserver:(CXCallObserver *)callObserver
        callChanged:(CXCall *)call;

@end

MyViewController.h:

#import "CXCallObserverDelegate.h"

@interface MyViewController: MixpanelTrack <OtherDelegate,AnotherDelegate,CXCallObserverDelegate>

{ … }

MyViewController.m:

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

@property (atomic, strong) CXCallObserver *callObserver;

-(void)viewDidLoad {
    [super viewDidLoad];
    [self launchCallObserver];

}


-(void) launchCallObserver {

    CXCallObserver *callObserver = [[CXCallObserver alloc] init];
    [callObserver setDelegate:self queue:nil];
    self.callObserver = callObserver;    

}


-(void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    if (call.hasConnected) {
        [TSMessage showNotificationWithTitle:@“I never see this“ type:TSMessageNotificationTypeSuccess];

    } else if (call.hasEnded) {
        [TSMessage showNotificationWithTitle:@“I never see this either“ type:TSMessageNotificationTypeSuccess];        
    }
}

我正在通过我的应用程序以编程方式拨打电话:

[[UIApplication sharedApplication] openURL:phoneUrl];

【问题讨论】:

  • 尝试将 AppDelegate 设为CXCallObserver。 AppDelegate 正确处理所有调用事件。

标签: ios objective-c callkit


【解决方案1】:

我检查了我们的项目,发现了您的问题:您使用的是导入类而不是 Callkit 框架,因此当您从不导入此协议时,您将覆盖 CXCallObserverDelegate

要解决此问题,您需要使用以下导入框架:

#import <CallKit/CallKit.h>

改为

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

希望对你有帮助

【讨论】:

  • 感谢您的回复,安东尼奥。不幸的是,我仍然没有收到任何 callChanged 操作。我将所有导入语句更改为仅引用 。我还能够删除我的自定义 CXCallObserverDelegate.h 文件而没有任何不良影响。不知道那是怎么回事。我还尝试将整个内容移至 AppDelegate 类,从 didFinishLaunchingWithOptions 方法设置 CXCallObserver 对象。我尝试的任何东西都可以很好地构建,运行良好,只是在 callChanged 上没有做任何事情。
  • 嗨@TomPeterson,你确定在调用 callChanged 时实例化了 MyViewController 吗?我们有一个管理器(在调用 didFinishLaunchingWithOptions 方法时配置)。其他问题...您是在模拟或使用应用程序通话还是在使用其他通话(如 GSM、Whatsapp 等)?
  • 我很确定 MyViewController 已实例化,并在调用开始和结束时保持这种状态。 MyViewController 视图显示潜在呼叫接收者的图像图标。当用户单击一个时,会通过一个对话框提示他们呼叫该收件人,而主屏幕后面是不透明的。当用户单击图标发起呼叫时,启动屏幕会作为子视图添加到窗口仅一秒钟,然后手机的本机呼叫视图和设备会在呼叫期间接管。
  • 当调用终止时,启动屏幕会再次出现一秒钟,然后 MyViewController 视图会以与离开时相同的状态重新出现(即,如果用户滚动以找到所需的调用收件人,页面在滚动的同一位置返回。所以看起来视图还没有重新加载)。
  • 我也知道,在这个过程中,当用户点击调用时,AppDelegate.applicationWillResignActive()方法会触发,但仅仅一秒后applicationDidBecomeActive()会触发。因此,无论通话时间有多长,该应用程序似乎都处于非活动状态仅一秒钟。我最初尝试使用这两种方法来测量通话的时长,但由于这个原因没有奏效。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多