Xcode|iOS10から新しく加わったCallkitを使って通話の状態を取得してみた

スポンサーリンク
Objective-C

20161015_001あまのじゃくなHikaruappです。

誰もやらないであろう、Coretelepnonyの一部が非推奨になりCallkitとして生まれ変わった、そのCallkitを使って通話の状態を取得してみた。

swiftをやるやると言っておきながら、今回もObjective-Cです。

それでは、行きます

検証環境

Mac OS X 10.11.6
Xcode 8.0

Call kitで通話の状態を取得する

CoreTelephonyにも通話状態を取得する機能がありました。
これ結構癖があって、メインスレッド以外でnewしたり、通話中にnewするとリークする始末、誰も使っていなかったと思われ放置プレイ状態。
そんな状態からCallkitで完璧に生まれ変わりました。
嬉しい!

取得するステータスはガラリと変わった

Coretelephony

CoreTelephonyのステータスは4つ

CORETELEPHONY_EXTERN NSString * const CTCallStateDialing
CORETELEPHONY_EXTERN NSString * const CTCallStateIncoming
CORETELEPHONY_EXTERN NSString * const CTCallStateConnected
CORETELEPHONY_EXTERN NSString * const CTCallStateDisconnected

非推奨なので、そうでしたか程度で・・・。

Callkit

Call kitのステータスは4つ

@property (nonatomic, readonly, assign, getter=isOutgoing) BOOL outgoing;
@property (nonatomic, readonly, assign, getter=isOnHold) BOOL onHold;
@property (nonatomic, readonly, assign) BOOL hasConnected;
@property (nonatomic, readonly, assign) BOOL hasEnded;

YES/NOで振り分けろ!て感じですね。

現在通話しているのは、着信か発信かは outgoingでわかったりします。
まぁ、面白いので色々と実験してみてください。

iOSのAPIは作り手の考えを読み解くと凄く使い易いです。

では、使ってみましょう

使い方は2種類

1.現在の状態を知る
2.通話の状態が変化した時の状態を知る

1.現在の状態を知る

// 現在の値の取得
- (void)callstateNow {
    if ([self.callObserver.calls count] == 0) {
        [self callStateValue:nil];
    } else {
        for (CXCall *call in self.callObserver.calls) {
            [self callStateValue:call];
        }
    }
}

#pragma mark - Callkit State
- (void)callStateValue:(CXCall *)call {
    
    NSLog(@"hasEnded     %@", call.hasEnded? @"YES":@"NO");
    NSLog(@"isOutgoing   %@", call.isOutgoing? @"YES":@"NO");
    NSLog(@"isOnHold     %@", call.isOnHold? @"YES":@"NO");
    NSLog(@"hasConnected %@", call.hasConnected? @"YES":@"NO");

    
    // 切断
    if (call == nil || call.hasEnded == YES) {
        NSLog(@"CXCallState : Disconnected");
    }
    
    // 発信
    if (call.isOutgoing == YES && call.hasConnected == NO) {
        NSLog(@"CXCallState : Dialing");
    }
    
    // 着信
    if (call.isOutgoing == NO  && call.hasConnected == NO && call.hasEnded == NO && call != nil) {
        NSLog(@"CXCallState : Incoming");
    }
    
    // 電話中
    if (call.hasConnected == YES && call.hasEnded == NO) {
        NSLog(@"CXCallState : Connected");
    }
    
}

 

2.通話の状態が変化した時、その状態を知る

- (instancetype)init
{
    self = [super init];
    if (self) {
        
        // 電話状態変化通知の設定
        _callObserver = [CXCallObserver new];
        [_callObserver setDelegate:self queue:dispatch_get_main_queue()];
        
    }
    return self;
}

#pragma mark - CXCallObserverDelegate
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call{
    [self callStateValue:call];
}

#pragma mark - Callkit State
- (void)callStateValue:(CXCall *)call {
    
    NSLog(@"hasEnded     %@", call.hasEnded? @"YES":@"NO");
    NSLog(@"isOutgoing   %@", call.isOutgoing? @"YES":@"NO");
    NSLog(@"isOnHold     %@", call.isOnHold? @"YES":@"NO");
    NSLog(@"hasConnected %@", call.hasConnected? @"YES":@"NO");

    
    // 切断
    if (call == nil || call.hasEnded == YES) {
        NSLog(@"CXCallState : Disconnected");
    }
    
    // 発信
    if (call.isOutgoing == YES && call.hasConnected == NO) {
        NSLog(@"CXCallState : Dialing");
    }
    
    // 着信
    if (call.isOutgoing == NO  && call.hasConnected == NO && call.hasEnded == NO && call != nil) {
        NSLog(@"CXCallState : Incoming");
    }
    
    // 電話中
    if (call.hasConnected == YES && call.hasEnded == NO) {
        NSLog(@"CXCallState : Connected");
    }
    
}

delegateの設定をして、メインスレッドを指定してみました。

まとめ

APIのヘッダーを見ながらCallkitの使い方を調べていると、swiftを意識したAPIになっているように感じました。
世の中はswiftなんだな、とつくづく思いObjective-Cの記事でいいのか?
と、思いながら誰が使うんだ?と言う記事を書いている私はウキウキだったりもします。

サンプルコード

プロジェクトファイル – github

 

コメント

タイトルとURLをコピーしました