【问题标题】:Detect voice call start/end state on iOS 10在 iOS 10 上检测语音通话开始/结束状态
【发布时间】:2017-01-23 14:26:39
【问题描述】:

我正在尝试检测 iOS 10 上的通话状态。 我已经在 iOS 9.3 上测试过了,它运行良好。 但是在 iOS 10 上,CTCallCenter 已被弃用,所以我使用了 Callkit。

我无法检测到通话状态。 我找不到任何正确答案。

我的代码是:

@property (nonatomic, strong) CXCallObserver *callObserver;

...

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

...

- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    if (call.hasConnected) {
        NSLog(@"connected/n");
        // perform necessary actions
    } else if(call.hasEnded) {
         NSLog(@"disconnected/n");
    }
}

【问题讨论】:

标签: objective-c ios10


【解决方案1】:

此代码对我有用。唯一的区别是我为观察者提供了一个调度队列,而不是使用主队列。

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

@interface CallStatusIos10 : NSObject <CXCallObserverDelegate>
{
    dispatch_queue_t dq;
}
@property (nonatomic, strong) CXCallObserver* observer;

@end

@implementation CallStatusIos10

@synthesize observer;

-(id) init
{
    if(self = [super init])
    {
        observer = [[CXCallObserver alloc] init];
        // Hang on to a reference to the queue, as the
        // CXCallObserver only maintains a weak reference
        dq = dispatch_queue_create("my.ios10.call.status.queue", DISPATCH_QUEUE_SERIAL);
        [observer setDelegate: self queue: dq];
    }
    return self;
}

#pragma mark - CXCallObserverDelegate

- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call
{
    NSString* callId = [call.UUID UUIDString];

    if(!call.hasConnected && !call.hasEnded && !call.onHold)
    {
        if(call.outgoing)
        {
            // outgoing call is being dialling;
        }
        else
        {
            // incoming call is ringing;
        }
    }
    else if(call.onHold)
    {
        // call is on hold;
    }
    else if(call.hasEnded)
    {
        // call has disconnected;
    }
    else if(call.hasConnected)
    {
        // call has been answered;
    }
}

@end

【讨论】:

    【解决方案2】:

    试试这个

    Appdelegate.h

    #import <CoreTelephony/CTCallCenter.h>
    #import <CoreTelephony/CTCall.h>
    ...
    @property (nonatomic, strong) CTCallCenter* callCenter;
    

    AppDelegate.m

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {  
       .... 
      self.callCenter = [[CTCallCenter alloc] init];
      [self handleCall]; //Call this method when you want to use it
       .... 
    }
    
    -(void)handleCall
    {
        self.callCenter.callEventHandler = ^(CTCall *call){
    
           if ([call.callState isEqualToString: CTCallStateConnected])
           {
              //NSLog(@"call stopped");
           }
           else if ([call.callState isEqualToString: CTCallStateDialing])
           {
            }
           else if ([call.callState isEqualToString: CTCallStateDisconnected])
           {
              //NSLog(@"call played");
            }
           else if ([call.callState isEqualToString: CTCallStateIncoming])
           {
               //NSLog(@"call stopped");
           }
         };
      }
    

    取自:How to detect call incoming programmatically

    了解更多:CoreTelephony Framework iOS 7

    【讨论】:

    • 感谢您的回复。但这不能使用,因为 CTCallCenter 在 iOS 10 中已被弃用
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多